# 引言
近年来,聊天机器人在各个行业中被广泛应用,而信息检索作为增强聊天机器人的关键技术,可以使其提供超出训练数据范围的智能响应。本篇文章旨在为您展示如何在聊天机器人中实现信息检索,帮助您构建更为智能的对话系统。
# 主要内容
## 设置环境
在开始之前,您需要安装几个必要的包,并确保您的OpenAI API密钥已设置为环境变量`OPENAI_API_KEY`。
```bash
%pip install -qU langchain langchain-openai langchain-chroma beautifulsoup4
# 设置环境变量OPENAI_API_KEY或从 .env 文件中加载
import dotenv
dotenv.load_dotenv()
创建聊天模型
首先,我们需要设置一个聊天模型来为后续示例服务。
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
# 使用API代理服务提高访问稳定性
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
from langchain_core.messages import HumanMessage, AIMessage
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)
document_chain.invoke(
{
"context": docs,
"messages": [
HumanMessage(content="Can LangSmith help test my LLM applications?")
],
}
)
常见问题和解决方案
问题1:如何处理后续问题?
解决方案:
可以通过转换查询来确保即便是后续的问题也能得到相关的文档。使用LLM来将查询转换为独立查询。
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
query_transformation_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!"),
],
}
)
问题2:如何改善检索性能?
解决方案:
可以调整检索向量库的参数,例如减少或增加检索的文档数目。此外,使用更精确的嵌入模型也能提高相关性。
总结和进一步学习资源
本文展示了如何在聊天机器人中实现信息检索功能。为了更深入地了解,请参考LangChain文档和其它相关资料。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---