如何为聊天机器人添加检索能力

老铁们,今天我们来聊聊如何给聊天机器人加上检索功能。检索是聊天机器人用来增强响应能力的常用技术,能够从模型训练数据之外获取信息。虽然这话题很深,但我们还是来看看如何实际操作。不过,感兴趣的朋友可以看看更详细的 LangSmith 文档

技术背景介绍

为了实现检索功能,首先需要安装一些包,确保你的 OpenAI API 密钥被设置为环境变量 OPENAI_API_KEY

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

然后,设置环境变量:

import dotenv

dotenv.load_dotenv()

接下来,我们来设置一个聊天模型,这里用的是 gpt-3.5-turbo-1106

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

接下来,我们将数据分割成更小的块,以适应 LLM 的上下文窗口,并存储在一个向量数据库中:

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

实战代码演示

通过检索器,我们可以获取LangSmith文档中关于测试的信息,解释如下:

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)

我们可以调用这个 document_chain 进行问答:

from langchain_core.messages import HumanMessage

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

优化建议分享

为了使检索更智能,可以加入查询转化,从而处理对话中的后续问题。例如,当用户问一些上下文不明确的问题时,我们可以重写查询:

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

补充说明和总结

说白了,这整套流程就是通过创建一个能处理上下文的检索链,让你的聊天机器人在对话中变得更加智能。这波操作可以说是相当丝滑。检索方法有很多,这篇文章只是抛砖引玉。

今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值