如何为聊天机器人实现信息检索功能:从零到一的完整指南

4 阅读3分钟
# 引言
近年来,聊天机器人在各个行业中被广泛应用,而信息检索作为增强聊天机器人的关键技术,可以使其提供超出训练数据范围的智能响应。本篇文章旨在为您展示如何在聊天机器人中实现信息检索,帮助您构建更为智能的对话系统。

# 主要内容

## 设置环境

在开始之前,您需要安装几个必要的包,并确保您的OpenAI API密钥已设置为环境变量`OPENAI_API_KEY````bash
%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

# 使用API代理服务提高访问稳定性
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
from langchain_core.messages import HumanMessage, AIMessage

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.invoke(
    {
        "context": docs,
        "messages": [
            HumanMessage(content="Can LangSmith help test my LLM applications?")
        ],
    }
)

常见问题和解决方案

问题1:如何处理后续问题?

解决方案:

可以通过转换查询来确保即便是后续的问题也能得到相关的文档。使用LLM来将查询转换为独立查询。

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!"),
        ],
    }
)

问题2:如何改善检索性能?

解决方案:

可以调整检索向量库的参数,例如减少或增加检索的文档数目。此外,使用更精确的嵌入模型也能提高相关性。

总结和进一步学习资源

本文展示了如何在聊天机器人中实现信息检索功能。为了更深入地了解,请参考LangChain文档和其它相关资料。

参考资料

  1. LangChain Documentation
  2. OpenAI API Documentation
  3. Beautiful Soup Documentation

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

---END---