老铁们,今天我们来聊聊如何给聊天机器人加上检索功能。检索是聊天机器人用来增强响应能力的常用技术,能够从模型训练数据之外获取信息。虽然这话题很深,但我们还是来看看如何实际操作。不过,感兴趣的朋友可以看看更详细的 LangSmith 文档。
技术背景介绍
为了实现检索功能,首先需要安装一些包,确保你的 OpenAI API 密钥被设置为环境变量 OPENAI_API_KEY
:
%pip install -qU langchain langchain-openai langchain-chroma beautifulsoup4
然后,设置环境变量:
import dotenv
dotenv.load_dotenv()
接下来,我们来设置一个聊天模型,这里用的是 gpt-3.5-turbo-1106
:
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()
接下来,我们将数据分割成更小的块,以适应 LLM 的上下文窗口,并存储在一个向量数据库中:
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?")
实战代码演示
通过检索器,我们可以获取LangSmith文档中关于测试的信息,解释如下:
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
补充说明和总结
说白了,这整套流程就是通过创建一个能处理上下文的检索链,让你的聊天机器人在对话中变得更加智能。这波操作可以说是相当丝滑。检索方法有很多,这篇文章只是抛砖引玉。
今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~