在这篇文章中,我们将讨论如何利用 Google Drive 或 SharePoint 中存储的文件,构建一个实时的可检索问答(RAG)应用。这意味着您的聊天机器人将能够实时访问知识库的最新版本,无需手动更新。本教程将指导您使用 Pathway 和 LlamaIndex 构建一个实时更新的 RAG 聊天机器人。
为什么选择 Pathway?
Pathway 是一个开放的数据处理框架,允许轻松开发数据转换管道和使用实时数据源的机器学习应用程序。Pathway 监听文档的更改、添加和删除,处理加载和索引,无需 ETL。
它提供一个始终是最新的索引解决方案,无需传统的 ETL 管道。它可以监控多个数据源(如文件、S3 文件夹和云存储),向您的 LLM 应用程序提供最新信息,省去了许多繁琐的步骤。
这意味着你无需担心:
- 检查文件以查看是否有任何更改
- 解析 PDF、Word 文档或其他文本文件
- 转换、嵌入文档并将其加载到向量数据库中
一旦对构成你的知识库的文件进行更新,更新的内容将立即重新编制索引------你无需处理重新运行管道。
应用程序概述
此演示由三部分组成。
- 使用 Pathway 的向量存储,从知识库文档中获取最新的知识和信息。
- LlamaIndex 创建 RAG 管道并提供聊天记录。
- Streamlit 提供易于导航的用户界面支持。
先决条件
- OpenAI API 密钥
- Pathway 实例(托管版本免费提供用于演示)
1. 向知识库添加数据
Pathway 可以同时监听多个来源,例如本地文件、S3 文件夹、云存储和数据流。在此示例中,您将通过将文件上传到作为来源注册到 Pathway 的 Google Drive 来向您的管道添加示例文档。您还可以查看 Pathway 的 Google Drive 连接器的完整文档。
对于此演示,为您提供了一个 Google Drive 文件夹以供您上传文件。为了测试该应用程序,我们将向我们的助手询问有关 Pathway 的问题,它将根据 Google Drive 文件夹中可用的文件进行响应。
请参阅 pathway-io 以获取有关可用连接器和如何实现自定义连接器的更多信息。
2. 构建由 Pathway 提供支持的聊天机器人
检索器
首先,导入应用程序所需的模块。
javascript
from llama_index.retrievers import PathwayRetriever
from llama_index.query_engine import RetrieverQueryEngine
from llama_index.chat_engine.condense_question import CondenseQuestionChatEngine
from rag import chat_engine
使用托管的 Pathway 实例初始化检索器并创建查询引擎:
ini
PATHWAY_HOST = "api-pathway-indexer.staging.deploys.pathway.com"
PATHWAY_PORT = 80
retriever = PathwayRetriever(host=PATHWAY_HOST, port=PATHWAY_PORT)
聊天引擎
我们使用 CondenseQuestionChatEngine 来使用 LlamaIndex 创建 RAG 聊天机器人。此聊天引擎的一个优点是它使用对话历史记录中提供的上下文来编写搜索查询。这会产生更符合上下文的内容。
为了进一步改进管道,你可以修改聊天引擎类型、提示和其他参数。为了简单起见,我们将使用默认设置。
ini
chat_engine = CondensePlusContextChatEngine.from_defaults(
retriever=retriever,
verbose=True,
)
3. 使用 Streamlit 创建 UI
为应用程序创建一个标题,并初始化聊天机器人的消息历史记录和聊天引擎的会话状态值。
ini
st.title("Pathway + LlamaIndex")
if "messages" not in st.session_state.keys():
st.session_state.messages = [
{"role": "assistant", "content": "Hi, ask me a question. My knowledge is always up to date!"}
]
st.session_state.chat_engine = chat_engine
提示用户输入问题,将任何用户输入存储在会话状态中,并打印用户和助手的消息。
css
if prompt := st.chat_input("Your question"):
st.session_state.messages.append({"role": "user", "content": prompt})
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.write(message["content"])
如果最后一条消息来自用户并且助手正在准备回复,则创建一个 st.spinner 小组件。将消息内容和角色添加到消息历史记录中。
vbscript
if st.session_state.messages[-1]["role"] != "assistant":
with st.chat_message("assistant"):
with st.spinner("Thinking..."):
response = st.session_state.chat_engine.chat(prompt)
st.write(response.response)
message = {"role": "assistant", "content": response.response}
st.session_state.messages.append(message)
运行应用程序
在 Streamlit 社区云上
该演示托管在 Streamlit 社区云上,网址。此版本的应用程序使用 Pathway 托管的文档管道。
在您的本地计算机上
- 在本地克隆此存储库。
- 在根文件夹下创建一个 .env 文件来存储您的 OpenAI API 密钥。此演示使用 OpenAI GPT 模型来回答问题。
- 您还需要一个用于向量搜索的 Pathway 实例。有关本地部署,请参阅向量存储指南和 Pathway 部署。
- 运行 streamlit run ui.py。
恭喜!现在,您可以与您的文档聊天,并且由于 Pathway,您的应用程序将实时反映任何文件更新。
总结
在本教程中,您创建并部署了一个实时 RAG 聊天机器人应用程序。您还了解了如何将 Streamlit、LlamaIndex 和 Pathway 结合使用,这要归功于 LlamaIndex 的 Pathway Retriever。最终结果是一个 RAG 应用程序,它始终可以访问您的知识库的最新版本。