增强你的聊天机器人:实现内容检索功能的全攻略

51 阅读2分钟

引言

在现代聊天机器人中,检索技术是一种增强响应能力的重要工具。通过检索外部数据,聊天机器人能够拓展其知识库,超越训练数据的限制。本文将引导你如何在聊天机器人中实现检索功能,提升用户交互体验。

主要内容

1. 环境设置

首先,确保你已经安装了以下包,并将你的OpenAI API密钥设置为环境变量OPENAI_API_KEY

%pip install -qU langchain langchain-openai langchain-chroma beautifulsoup4

然后,加载环境变量:

import dotenv

dotenv.load_dotenv()

2. 初始化聊天模型

使用以下代码设置聊天模型:

from langchain_openai import ChatOpenAI

chat = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0.2)

3. 创建检索器

从LangSmith文档加载数据,并存储在向量数据库中:

from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

# 加载文档
loader = WebBaseLoader("https://docs.smith.langchain.com/overview")
data = loader.load()

# 文本分块
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)

# 嵌入并存储
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?")

4. 结合文档链与检索器

将检索器与文档链结合,生成最终答案:

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)

5. 改进检索链的查询转换

为了解决跟随问问题的挑战,可以利用查询转换来提升检索能力:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableBranch

query_transforming_retriever_chain = RunnableBranch(
    (
        lambda x: len(x.get("messages", [])) == 1,
        (lambda x: x["messages"][-1].content) | retriever,
    ),
    query_transform_prompt | chat | StrOutputParser() | retriever,
).with_config(run_name="chat_retriever_chain")

代码示例

完整代码示例可参见上述每节的代码块。

常见问题和解决方案

当多轮对话时,如何确保检索上下文相关性?可以使用查询转换技术,将用户的后续问题转换为独立查询。

总结和进一步学习资源

本文介绍了如何在聊天机器人中实现内容检索功能,从加载和分块文档到创建检索器和文档链。要更深入了解不同的检索技术,可以参考这里

参考资料

  • LangChain文档
  • LangSmith文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---