引言
在构建聊天机器人时,增强其响应能力以获取超出模型训练数据的信息是非常重要的。检索技术正是为此目的而生。本文将介绍如何在聊天机器人的背景下实现数据检索,并鼓励您深入探索这一细微而深刻的话题。
主要内容
环境设置
要开始,请确保安装以下包,并将您的OpenAI API密钥设置为环境变量OPENAI_API_KEY
:
%pip install -qU langchain langchain-openai langchain-chroma beautifulsoup4
然后,使用以下代码加载环境变量:
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)
代码示例
我们现在可以使用这个document_chain
实例回答问题。
from langchain_core.messages import HumanMessage
document_chain.invoke(
{
"context": docs,
"messages": [
HumanMessage(content="Can LangSmith help test my LLM applications?")
],
}
)
常见问题和解决方案
处理后续问题
当用户提出后续问题时,直接调用检索器可能无法提供有效结果。为了解决这个问题,可以将查询转换为不含外部引用的独立查询。
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
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. It allows you to quickly edit examples and add them to datasets to expand..."),
HumanMessage(content="Tell me more!"),
],
}
)
流式处理
由于该链是用LCEL构建的,它还支持流式处理。
stream = conversational_retrieval_chain.stream(
{
"messages": [
HumanMessage(content="Can LangSmith help test my LLM applications?"),
AIMessage(content="Yes, LangSmith can help test and evaluate your LLM applications. It allows you to quickly edit examples and add them to datasets to expand..."),
HumanMessage(content="Tell me more!"),
],
}
)
for chunk in stream:
print(chunk)
总结和进一步学习资源
这篇文章展示了如何在聊天机器人中集成检索功能,并提供了一些解决常见问题的技巧。检索仍然是一个复杂且丰富的领域,您可以通过以下资源进一步深入学习:
参考资料
- LangChain 官方文档
- OpenAI 官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—