LlamaIndex的多轮对话引擎使用说明

一、背景

LlamaIndex提供2种交互引擎:查询引擎和聊天引擎。(详情请看这里)查询引擎默认没有上下文信息,也就是说默认是单轮对话。

在RAG系统中,单轮对话/单次查询的场景较少,而多轮对话则是最常见的场景,若使用查询引擎,则需要手动将历史对话拼接后,传给查询引擎。这样做有很多弊端,

(1)手动拼接历史消息容易出错,也不够优雅;

(2)历史消息不可能一直无限制的拼接,若超过token最大长度,该如何处理?

(3)如何历史消息通过接口传递,不够安全;

(4)太多的历史消息,会导致查询的准确度降低等。

二、对话引擎

查询引擎的一种实际应用的场景是每次都对数据与知识提出独立的问题以获得答案,不考虑历史对话记录,另一种实际应用的场景是需要通过多次对话来满足使用者的需求,比如客户连续的产品问答与咨询。在这种场景中,需要跟踪过去对话的上下文,以更好地理解与回答当前的问题。由于大模型本质上都是无状态服务形式的,多次对话是通过携带历史对话记录来完成的。

 1.使用索引快速构造对话引擎

与查询引擎类似,也可以使用索引通过简单的一行代码构造对话引擎:
    chat_engine = index.as_chat_engine(chat_mode="condense_question")print(chat_engine.chat('陈平安是谁?'))print("--"*40)print(chat_engine.chat('他几岁了?'))

结果如下:

陈平安是一个自幼失去父母的少年,生活在一个以瓷器闻名的小镇。他从小就在当地的窑厂做学徒,跟随一位脾气不太好的师傅学习烧瓷技艺。尽管生活艰辛,他仍然坚持下来并逐渐掌握了烧瓷的技术。然而,随着小镇失去官窑的地位,窑厂被迫关闭,他也失去了生计,只能回到破旧的老宅生活。故事中的他坐在台阶上仰望星空,展现出一种在困境中依然保持希望的形象。
--------------------------------------------------------------------------------
陈平安失去窑厂工作回到老宅时,年龄是十六岁。

从结果上看,“他”被正确的指向到“陈平安”;也就说有上下文了。

2、使用底层 API 组合构造对话引擎

如果需要更精确地控制对话引擎的构造,就要使用底层 API 组合构造。

不同模式的查询引擎是通过输入不同的响应生成器来构造的,而不同模式的对话引擎则是直接通过构造不同类型的对话引擎组件完成的。

查询引擎所依赖的底层组件是检索器与响应生成器,而对话引擎则通常需要在查询引擎的基础上增加记忆等能力而构造。

下面的例子演示了如何构造一个 condense 类型的对话引擎:

custom_prompt = PromptTemplate("""请根据以下的历史对话记录和新的输入问题,重写一个新的问题,使其能够捕捉对话中的所有相关上下文。<Chat History> {chat_history} <Follow Up Message> {question} <Standalone question> """)# 历史对话记录custom_chat_history = [ChatMessage( role=MessageRole.USER,  content="陈平安是谁?"),ChatMessage(role=MessageRole.ASSISTANT, content="陈平安是一个自幼失去父母的少年,生活在一个以瓷器闻名的小镇。"),]#先构造查询引擎, 这里省略了构造 vector_index 对象query_engine = index.as_query_engine()#再构造对话引擎chat_engine = CondenseQuestionChatEngine.from_defaults(query_engine=query_engine, #对话引擎基于查询引擎构造condense_question_prompt=custom_prompt, #设置重写问题的Prompt模板chat_history=custom_chat_history, #携带历史对话记录verbose=True,) resp=chat_engine.chat('他几岁了?')print(resp)

可以看到,这里的构造方法与使用底层 API 组合构造查询引擎的方法完全
不同,这里构造的是一种叫 condense_question模式的对话引擎(CondenseQuestionChatEngine)。

这种引擎会查看历史对话记录,并将最新的用户问题重写成新的、具有更完整语义的问题,然后把这个问题输入查询引擎获得答案。因此可以看到,这种类型的引擎所依赖的组件包括查询引擎、重写问题的 Prompt 模板、历史对话记录,即from_defaults 方法的参数。

LlamaIndex 框架中,不同类型的对话引擎与其他组件之间的关系如图所示。 

总的来说,对话引擎在底层所依赖的组件主要有以下 3 种。
(1)LLM:大模型。大模型在对话引擎中的作用并不限于最后输出问题的答案。比如,在Agent类型的对话引擎中,大模型需要根据历史对话记录和任务来规划与推理出使用的工具;在 Condense类型的对话引擎中,大模型需要根据历史对话记录和当前问题来重写输入的问题。

(2)Query Engine 或者Retriever:查询引擎或检索器。由于查询引擎本身包含了检索器与多种不同响应生成模式的响应生成器,因此两者的区别是,只使用检索器的对话引擎更简单,而依赖查询引擎的对话引擎则支持更加多样的底层响应生成模式。

(3)Memory:记忆体。这是对话引擎区别于查询引擎的一个显著特征。由于对话是一种有“状态”的服务,因此为了保持这种状态,需要有相应的组件来记录与维持状态信息,也就是历史对话记录,而Memory组件就是用于实现这个目的的。

LlamaIndex 框架支持的对话模式( chat_mode )、对应的引擎类型及依赖的 主要组件见表
对话模式引擎类型依赖的主要组件
simpleSimpleChatEngineLLM
condense_questionCondenseQuestionChatEngineQueryEngine, LLM
contextContextChatEngineRetriever, LLM
condense_plus_contextCondensePlusContextChatEngineRetriever, LLM
reactReActAgent[Tool], LLM
openaiOpenAIAgent[Tool], LLM
bestReActAgent 或 OpenAIAgent[Tool], LLM

3、整合Memory组件

Memory使用的说明请看这篇文章。  对话引擎可以直接使用Memory 。

def complex_memory_cit_test():"""使用带有记忆功能的对话历史和自定义 Prompt,结合引用型查询引擎(CitationQueryEngine),实现带来源追溯的上下文对话测试。输出模型回答及其相关片段和元数据,便于溯源。"""# 历史对话记录memory= memory_init()memory.put_messages([ChatMessage(role=MessageRole.USER, content="报告期内,公司实现营业收入 63,609.19 万元,同比增长 4.40%;"),# ChatMessage(role=MessageRole.ASSISTANT,#             content="陈平安是一个自幼失去父母的少年,生活在一个以瓷器闻名的小镇。他从小就开始在窑场做粗活,跟随一位脾气不太好的师傅学习烧瓷技艺。尽管生活艰辛,他仍然坚持努力,逐渐掌握了烧瓷的一些技巧。然而,随着小镇失去官窑的地位,窑场被迫关闭,他也失去了生计,只能回到破旧的老宅独自生活。他性格坚韧,面对困境依然保持着对生活的希望。"),])#先构造查询引擎citation_query_engine = CitationQueryEngine.from_args(index,similarity_top_k=3,citation_chunk_size=512)#再构造对话引擎chat_engine = CondenseQuestionChatEngine.from_defaults(query_engine=citation_query_engine,condense_question_prompt=custom_prompt,memory=memory,verbose=True,)print("--"*40)resp=chat_engine.chat('请将该数值转成以元单位') #print(resp.response)  # LLM 输出回答print("------来源---------------")for node in resp.source_nodes:print("相关片段:", node.text)print("片段分数:", node.score)print("片段元数据:", node.metadata)# print(f"node.metadata:{node.metadata}")print("=" * 40)if __name__ == "__main__":complex_memory_cit_test()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87332.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CSS-14.1-全局样式表common.css】构建高效可维护的 common.css:现代前端CSS架构指南

在前端开发中&#xff0c;CSS管理一直是项目可维护性的关键挑战。据统计&#xff0c;约35%的样式问题源于缺乏统一的CSS架构规范。common.css&#xff08;或称全局样式表&#xff09;作为项目的基础样式层&#xff0c;能够有效解决以下问题&#xff1a; 样式碎片化&#xff1a…

laravel基础:php artisan make:model Flight --all 详解

在 Laravel 中执行命令: php artisan make:model Flight --all这个命令会为你创建与模型 Flight 相关的一整套文件结构。Laravel 的 Artisan 命令行工具是一个强大的代码生成器,可以帮助你快速生成常见的应用组件。我们来详细解析一下这个命令的各个部分以及它产生的效果。 …

poi java 删除word的空白页

开发的时候遇到的问题&#xff0c;特此记录一下 使用Apache POI&#xff08;Java库&#xff09;删除Word文档中的空白页时&#xff0c;需针对不同场景处理。以下是具体实现方法和代码示例&#xff1a; 基础删除&#xff08;段落/分页符&#xff09;‌ 通过删除多余段落标记或…

获取Android应用日志教程

ADB&#xff0c;全称为Android Debug Bridge&#xff0c;是Android开发中一个重要的命令行工具。它用于与Android设备进行通信&#xff0c;提供了多种功能来帮助开发者进行调试和应用管理。 一、环境准备 1.PC下载附件中的安装包。 2.在设备上启用开发者选项和 USB 调试 在安卓…

【Axum】Rust Web 高效构建:Axum 框架从入门到精通指南

目录 一、环境准备与项目创建1.1 安装 Rust 工具链1.2 创建项目并添加依赖 二、Axum 核心架构解析三、项目结构设计四、核心代码实现4.1 应用入口 (src/main.rs)4.2 数据模型 (src/models.rs)4.3 路由配置 (src/routes.rs)4.4 认证服务 (src/services/auth.rs)4.5 用户处理器 (…

康谋分享 | 基于多传感器数据的自动驾驶仿真确定性验证

目录 01 引言 02 随机性的前因与后果 03 确定性的验证——以aiSim为例 1、传感器选型与配置 2、场景与方法 3、验证结果 04 总结 01 引言 随着自动驾驶技术的飞速发展&#xff0c;仿真测试已成为替代成本高昂且充满风险的道路测试的关键环节。它能够在虚拟环境中模拟…

FASTAPI+VUE3平价商贸管理系统

一、项目概述 PJMall 是一个基于 FastAPI 构建的商城管理系统后端服务&#xff0c;提供商品管理、订单处理、用户认证等核心功能。系统采用分层架构设计&#xff0c;支持高并发访问&#xff0c;适用于多角色用户&#xff08;管理员、客户、供应商&#xff09;。 核心特性 &a…

客服机器人知识库怎么搭?智能客服机器人3种方案深度对比(含零售落地案例)

一、知识库技术缺陷的权威数据 IDC 2025报告&#xff1a;89%企业因知识库更新延迟导致智能客服机器人解决率下降40%&#xff0c;传统规则引擎日均失效对话超2000次。 二、三大技术方案架构解析 1.LLM动态知识图谱方案 基于Transformer架构实时抓取政策/价格数据 知识关联度…

JavaScript 性能优化实战:减少 DOM 操作引发的重排与重绘

在前端开发中&#xff0c;DOM 操作是 JavaScript 性能优化的核心痛点之一。频繁的 DOM 操作会触发浏览器的 重排&#xff08;Reflow&#xff09; 和 重绘&#xff08;Repaint&#xff09;&#xff0c;导致性能显著下降。本文将深入分析这一瓶颈&#xff0c;并通过实际案例展示优…

力扣 hot100 Day33

24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 //抄的 class Solution { public:ListNode* swapP…

DevExpress V25.1 版本更新,开启控件AI新时代

WinForms Controls v25.1 AI 驱动的语义搜索 我们的 WinForms 数据网格、GridLookUpEdit 和 SearchLookUpEdit 控件具有增强的搜索体验&#xff0c;使用户能够更快/更准确地在大型数据集中查找相关数据。与基于关键字的标准搜索不同&#xff0c;语义搜索利用自然语言处理 &…

【分层图 虚拟节点】 P11327 [NOISG 2022 Finals] Voting Cities|普及+

本文涉及知识点 C图论 P11327 [NOISG 2022 Finals] Voting Cities 题目描述 你所在的国家的国家主席 L o r d P o o t y \bf{Lord\ Pooty} Lord Pooty 将要退休了&#xff01;他希望选择他的一个儿子作为他的继承人&#xff0c;出于各方面因素的考虑&#xff0c;他决定进行…

Web3云服务商安全性怎么选

Web3安全之锚&#xff1a;为何阿里云是企业级应用的首选​ 随着Web3、去中心化金融&#xff08;DeFi&#xff09;和数字资产的浪潮席卷全球&#xff0c;无数开发者和企业涌入这个充满机遇的新赛道。然而&#xff0c;机遇背后是同样巨大的安全挑战。从智能合约漏洞到大规模DDoS…

uniapp加上全局水印

文章目录 一、效果图二、创建watermark.js文件三、在main.js中引入四、运行 前言&#xff1a;uniapp页面加水印你还在傻乎乎的一个个页面加吗&#xff0c;今天教你一招&#xff0c;一步到位 一、效果图 未登录效果 登录后效果 二、创建watermark.js文件 这里的水印因为我…

thinkphp8.0七牛云直传图片

环境&#xff1a;tp8\php8.3; 服务器&#xff1a;centOS Stream 9; 场景&#xff1a;通过html页面直传七牛云服务器&#xff0c;速度更快&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta na…

Godot x openKylin 全国开发大赛正式启动

从2023年开始&#xff0c;Godot Hub 每年举办一次 Godot Hub Festival 开发大赛&#xff0c;现已成为国内 Godot 社区规模最大的开发比赛。本届 Godot Hub Festival 2025将与 OpenAtom openKylin 开源社区合作举办&#xff0c;定名为 Godot x openKylin 全国开发大赛&#xff0…

工控机Linux修改网口

修改Ip:sudo nmcli connection modify net1-static ipv4.addresses 192.168.200.225/24 修改dns:sudo nmcli connection modify net1-static ipv4.dns 114.114.114.114 修改网关:sudo nmcli connection modify net1-static ipv4.gateway 192.168.200.1 IP生效&#xff1a;nm…

CRMEB Pro版v3.3源码全开源+PC端+Uniapp前端+搭建教程

一.介绍 crmeb Pro版 v3.3版本正式发布&#xff0c;全新UI重磅上线&#xff0c;焕然一新&#xff0c;不负期待&#xff01;页面DIY设计功能全面升级&#xff0c;组件更丰富&#xff0c;样式设计更全面&#xff1b;移动端商家管理&#xff0c;让商城管理更便捷&#xff0c;还从…

【python】OOP:Object-Oriented Programming

文章目录 1. 面向对象编程的核心概念1.1 类与对象的关系1.2 封装&#xff08;Encapsulation&#xff09; 2. 继承与多态2.1 继承机制2.2 多重继承2.3 多态性 3. 特殊方法与运算符重载4. 抽象类与接口4.1 抽象基类 5. 组合与聚合6. 属性管理6.1 使用property装饰器6.2 描述符协议…

蒙特卡洛方法:随机抽样的艺术与科学

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 蒙特卡洛算法&#xff08;Monte Carlo Method&#xff09;是一类基于随…