[如何为聊天机器人添加检索功能:轻松扩展响应能力]

46 阅读3分钟

如何为聊天机器人添加检索功能:轻松扩展响应能力

在不断发展的人工智能领域,聊天机器人通过增加检索能力来扩展其响应范围,这已经成为实现智能对话的重要手段。本文将详细探讨如何在聊天机器人中实现检索功能,并提供代码示例来帮助您更好地应用这一技术。

引言

检索是帮助聊天机器人用超出其训练数据范围的信息增强响应的常用技术。本篇文章旨在通过简单明了的步骤展示如何在您的聊天机器人中集成检索功能,让您轻松创建更具响应能力的应用。

主要内容

设置环境

首先,我们需要安装必要的包,并将您的 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()

然后,分割文本以适合 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?")

代码示例

接下来,我们将创建一个用于回答问题的文档链。

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.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..."),
        HumanMessage(content="Tell me more!"),
    ],
})

总结和进一步学习资源

通过添加检索功能,您可以显著增强聊天机器人的智能问答能力。要深入了解不同的检索技术,建议参阅 如何检索相关数据的指南

参考资料

  1. LangChain 文档
  2. OpenAI API 文档

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

---END---