Methods to get real-time AI assistant alerts with modifications in Google Docs utilizing Pathway and Streamlit.
Actual-time alerting with Giant Language Fashions (LLMs) like GPT-4 might be helpful in lots of areas akin to progress monitoring for initiatives (e.g. notify me when coworkers change necessities), rules monitoring, or buyer assist (notify when a decision is current). In a company setting, groups usually collaborate on paperwork utilizing Google Docs. These paperwork can vary from mission plans and stories to coverage paperwork and proposals.
This information exhibits you how you can construct a Giant Language Mannequin (LLM) software that gives real-time Slack alerts about modifications to Google paperwork that you simply or your crew care about.
This system that we are going to create solutions questions primarily based on a set of paperwork. Nevertheless, after an preliminary response is supplied, this system retains on monitoring the doc sources. It effectively determines which questions could also be affected by a supply doc change, and alerts the person when a revision – or a brand new doc – considerably modifications a beforehand given reply.
The fundamental strategy of feeding chunks of knowledge from exterior paperwork into an LLM and asking it to offer solutions primarily based on this info is named RAG – Retrieval Augmented Generations. So, what we’re doing right here is real-time RAG with alerting đź””.
Apprehensive that deadlines for a mission change, and you aren’t within the loop?
You set the alert as soon as and don’t want to fret about knowledge synchronization ever once more!
Structure of our alerting software
Our alerting app can have a Streamlit UI used to outline new alerts. It’s going to synchronize paperwork from a Google Drive knowledge supply, and ship alerts to Slack. For doc processing and evaluation, we depend on a free Python library known as Pathway LLM-App, which then permits us to run our alerting app in a Docker container. It is a standalone software, besides that it must name right into a Giant Language Mannequin (LLM) to know whether or not your doc modifications are related to the alert. For the sake of simplicity of launching, we don’t host our personal open-source LLM however depend on OpenAI API integration as an alternative.
Let’s break down every element within the above architectural diagram and perceive the function of assorted parts:
Making an all the time up-to-date vector index of Google Drive paperwork: The system accesses paperwork saved in Google Drive and displays them for modifications utilizing the Pathway connector for Google Drive. Subsequent, all paperwork inside a selected folder are parsed (we assist native Google Docs codecs, Microsoft’s docx, and plenty of others) and break up into quick, largely self-contained chunks which might be embedded utilizing the OpenAI API and listed in real-time utilizing the Pathway KNN index.
Answering queries and defining alerts: Our software working on Pathway LLM-App exposes the HTTP REST API endpoint to ship queries and obtain real-time responses. It’s utilized by the Streamlit UI app. Queries are answered by wanting up related paperwork within the index, as within the Retrieval-augmented era (RAG) implementation. Subsequent, queries are categorized for intent: an LLM probes them for pure language instructions synonymous with notify or ship an alert.
Alert Era and Deduplication: Pathway LLM-App routinely retains the doc index updated and might effectively replace solutions each time vital paperwork change! To be taught extra, please see our indexing tutorial. Nevertheless, typically a change in a supply doc is non-consequential, a colleague may for instance repair some typos. To forestall the system from sending spurious alerts, we use pw.stateful.deduplicate
. The deduplicator makes use of an LLM “acceptor perform” to verify if the brand new reply is considerably totally different.
Lastly, related alerts are despatched to Slack utilizing a Python callback registered utilizing pw.io.subscribe
.
Our purpose right now: alerts for advertising campaigns
We give attention to an instance the place we wish to have real-time alerts for vital modifications or updates in advertising campaigns. This technique can monitor varied elements akin to content material modifications, marketing campaign efficiency metrics, viewers engagement, and funds alterations. Actual-time alerts allow advertising groups to reply rapidly to modifications, guaranteeing campaigns stay on observe and are optimized for efficiency.
After efficiently working the Google Drive Alerts with the LLM app,
Both go to Streamlit and take a look at typing in “When does the Magic Cola marketing campaign begin? Please notify me about any modifications.”
Or ship a curl to the endpoint with
The response we are going to get is one thing like “The marketing campaign for Magic Cola begins on December 12, 2023” primarily based on the doc you might have in your Google Drive folder. The app additionally prompts an alert for future modifications.
Then you definately go to the folder known as “Product Advertising” and open the doc known as “campaign-cola” in Google Drive, modify the road with the “Marketing campaign Launch” and set the date to “January 1st, 2024”. You must obtain a Slack notification instantly “Change Alert: The marketing campaign for Magic Cola begins on July 1st, 2024”.
Relying on captured modifications in real-time and predefined thresholds (like a sure proportion drop in click-through price or a big funds overrun), the system triggers an alert.
You too can strive establishing a brand new doc with revised details about the marketing campaign date, and see how the system picks up on items of knowledge from totally different supply recordsdata. As we are going to see later, we will regulate how the system reacts to totally different items of knowledge by way of a way known as “prompting”.
For instance, you possibly can clarify to the LLM, in pure language, the way it ought to finest reply if it sees a battle between info seen in two totally different locations.
The identical resolution might be utilized for monitoring the advertising marketing campaign throughout totally different platforms together with content material administration techniques, social media instruments, and e-mail advertising software program.
Tutorial – Creating the app
The app improvement consists of two components: backend API and frontend UI. The complete supply code might be discovered on the GitHub repo.
Half 1: Design the Streamlit UI
We are going to begin with developing Streamlit UI and create a easy net software with Streamlit. It interacts with an LLM App over REST API and shows a chat-like interface for the person sending prompts and notifying the person when an alert is activated. The primary web page of the online app is about up with a textual content enter field the place customers can enter their queries. See the total supply code within the server.py file.
...
immediate = st.text_input("How can I show you how to right now?")
if "messages" not in st.session_state:
st.session_state.messages = []
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
...
We handle a chat historical past utilizing Streamlit’s session state. It shows earlier messages and provides new ones as they’re entered.
...
if immediate:
with st.chat_message("person"):
st.markdown(immediate)
st.session_state.messages.append({"function": "person", "content material": immediate})
for message in st.session_state.messages:
if message["role"] == "person":
st.sidebar.textual content(f"đź“© {message['content']}")
...
When the person enters a immediate, the above script provides it to the chat historical past to take care of totally different chats for every person.
...
url = f"http://{api_host}:{api_port}/"
knowledge = {"question": immediate, "person": "person"}
response = requests.submit(url, json=knowledge)
if response.status_code == 200:
response = response.json()
with st.chat_message("assistant"):
st.markdown(response)
st.session_state.messages.append({"function": "assistant", "content material": response})
else:
st.error(
f"Didn't ship knowledge to Reductions API. Standing code: {response.status_code}"
)
...
This immediate can be despatched to the LLM App through REST API. It additionally contains fundamental error dealing with for the API response, checking the standing code, and displaying an error message if the decision is unsuccessful.
Half 2: Construct a backend API
Subsequent, we develop the logic for the backend half the place the app ingests Google Docs in real-time, detects modifications, creates indexes, responds to person queries, and sends alerts. See the total supply code within the app.py file.
def run(
*,
data_dir: str = os.environ.get(
"PATHWAY_DATA_DIR", "./examples/knowledge/magic-cola/local-drive/staging/"
),
api_key: str = os.environ.get("OPENAI_API_KEY", ""),
host: str = "0.0.0.0",
port: int = 8080,
embedder_locator: str = "text-embedding-ada-002",
embedding_dimension: int = 1536,
model_locator: str = "gpt-3.5-turbo",
max_tokens: int = 400,
temperature: float = 0.0,
slack_alert_channel_id=os.environ.get("SLACK_ALERT_CHANNEL_ID", ""),
slack_alert_token=os.environ.get("SLACK_ALERT_TOKEN", ""),
**kwargs,
)
Every part that occurs in the primary run()
perform accepts a number of parameters, a lot of which have default values. These embody paths OpenAI API keys (api_key
), server configuration (host
, port
), mannequin identifiers (embedder_locator
, model_locator
), and Slack channel ID the place alerts are despatched (slack_alert_channel_id
) and Slack token (slack_alert_token
) to safe authenticate with the Slack.
Constructing an Index
Subsequent, the app reads the Google Docs recordsdata from the trail specified within the data_dir
and processes them into paperwork. These paperwork are chunked, flattened, after which enriched with OpenAI embeddings. A Okay-Nearest Neighbors (KNN) index is created utilizing these embeddings.
recordsdata = pw.io.gdrive.learn(
object_id="FILE_OR_DIRECTORY_ID",
service_user_credentials_file="secret.json",
)
paperwork = recordsdata.choose(texts=extract_texts(pw.this.knowledge))
paperwork = paperwork.choose(
chunks=chunk_texts(pw.this.texts, min_tokens=40, max_tokens=120)
)
paperwork = paperwork.flatten(pw.this.chunks).rename_columns(doc=pw.this.chunks)
enriched_documents = paperwork + paperwork.choose(
knowledge=embedder.apply(textual content=pw.this.doc, locator=embedder_locator)
)
index = KNNIndex(
enriched_documents.knowledge, enriched_documents, n_dimensions=embedding_dimension
)
Question Processing
Subsequent, we add a perform to arrange an HTTP connector to obtain queries. Queries are processed to detect intent utilizing the OpenAI Chat completion endpoint and put together them for response era. This contains splitting solutions and embedding the question textual content.
question, response_writer = pw.io.http.rest_connector(
host=host,
port=port,
schema=QueryInputSchema,
autocommit_duration_ms=50,
)
mannequin = OpenAIChatGPTModel(api_key=api_key)
question += question.choose(
immediate=build_prompt_check_for_alert_request_and_extract_query(question.question)
)
question += question.choose(
tupled=split_answer(
mannequin.apply(
pw.this.immediate,
locator=model_locator,
temperature=temperature,
max_tokens=100,
)
),
)
question = question.choose(
pw.this.person,
alert_enabled=pw.this.tupled[0],
question=pw.this.tupled[1],
)
question += question.choose(
knowledge=embedder.apply(textual content=pw.this.question, locator=embedder_locator),
query_id=pw.apply(make_query_id, pw.this.person, pw.this.question),
)
Responding to Queries
The processed person queries are used to search out the closest gadgets within the KNN index we constructed. A immediate is constructed utilizing the question and the paperwork retrieved from the index. The OpenAI mannequin generates responses primarily based on these prompts. Lastly, the responses are formatted and despatched again to the UI utilizing the response_writer
.
query_context = question + index.get_nearest_items(question.knowledge, okay=3).choose(
documents_list=pw.this.doc
).with_universe_of(question)
immediate = query_context.choose(
pw.this.query_id,
pw.this.question,
pw.this.alert_enabled,
immediate=build_prompt(pw.this.documents_list, pw.this.question),
)
responses = immediate.choose(
pw.this.query_id,
pw.this.question,
pw.this.alert_enabled,
response=mannequin.apply(
pw.this.immediate,
locator=model_locator,
temperature=temperature,
max_tokens=max_tokens,
),
)
output = responses.choose(
consequence=construct_message(pw.this.response, pw.this.alert_enabled)
)
response_writer(output)
Sending Alerts
The under code filters responses that require alerts. A customized logic (acceptor
) is used to find out if an alert must be despatched primarily based on the content material of the response. Alerts are constructed and despatched to a specified Slack channel.
responses = responses.filter(pw.this.alert_enabled)
def acceptor(new: str, previous: str) -> bool:
if new == previous:
return False
determination = mannequin(
build_prompt_compare_answers(new, previous),
locator=model_locator,
max_tokens=20,
)
return decision_to_bool(determination)
deduplicated_responses = deduplicate(
responses,
col=responses.response,
acceptor=acceptor,
occasion=responses.query_id,
)
alerts = deduplicated_responses.choose(
message=construct_notification_message(
pw.this.question, pw.this.response, add_meta_info(data_dir)
)
)
send_slack_alerts(alerts.message, slack_alert_channel_id, slack_alert_token)
Execution
It is a place the place all magic occurs. The perform ends with a name to pw.run
, indicating that that is a part of an information pipeline that runs repeatedly. Optionally, we additionally allow a real-time monitoring function.
pw.run(monitoring_level=pw.MonitoringLevel.NONE)
Methods to run our software
Step 0. Your guidelines: what we have to get began
- A working Python surroundings on MacOS or Linux
- A Google account for connecting to your personal Drive
- Earlier than working the app, you will have to present the app entry to Google Drive folder, please comply with the steps supplied within the Readme.
- (Non-obligatory) A slack channel and API token
- For this demo, Slack notification is non-obligatory and notifications can be printed if no Slack API keys are supplied. See: Slack Apps and Getting a token
- If no Slack token is supplied, notifications can be printed.
Step 1. Get began with LLM-App and check out the prepared instance
Subsequent, navigate to the repository:
Virtually there!
Step 2. Get the app working
- Edit the
.env
file with the directions supplied in the Readme. - We have to execute
python app.py
, comply with the directions in Running the project to get the app up and prepared!
What’s subsequent
As we’ve seen within the instance of the advertising marketing campaign demo, real-time alerts with LLMs preserve your complete crew up to date on crucial modifications and assist groups keep agile, adjusting methods as wanted. LLM App’s alerting function can be used for monitoring mannequin efficiency when LLMs can sometimes produce surprising or undesirable outputs. In circumstances the place LLMs are used for processing delicate knowledge, real-time alerting might be helpful for safety and compliance too.
Think about additionally visiting one other weblog submit on How to build a real-time LLM app without vector databases. You will notice just a few examples showcasing totally different prospects with the LLM App within the GitHub Repo. Observe the directions in Get Started with Pathway to check out totally different demos.
In regards to the creator
Go to my weblog: www.iambobur.com
Observe me on LinkedIn Bobur Umurzokov