也谈Agent的记忆问题及Dify的知识库分段及召回逻辑细节


今天是2025年3月23日,星期日,北京,天气晴。

我们今天来看看关于Agent的记忆问题以及从具体案例出发,看看Dify的知识库分段及召回逻辑设计,这个比看论文要踏实的多。

抓住根本问题,做根因,专题化,体系化,会有更多深度思考。大家一起加油。

一、关于Agent的记忆问题 

Agent记忆(Agent Memory)是指AI Agent在执行任务过程中存储和管理信息的能力和机制,用于记录交互历史、任务状态、用户偏好等关键信息,支持Agent在多轮对话和长期任务中保持上下文连贯性、个性化响应及持续学习能力其本质是通过扩展大模型有限的上下文窗口(通常为16K-2M tokens)

补充今天说到的agent 记忆系统的技术总结,A Survey on the Memory Mechanism of Large Language Model based Agents,https://arxiv.org/pdf/2404.13501.pdf。https://github.com/nuster1128/LLM_Agent_Memory_Survey

从形式上看,Agent的记忆包括内部试验信息(智能体与环境交互过程中的历史步骤);跨试验信息(在多个试验中积累的信息,包括成功和失败的行动及其洞察);外部知识(智能体可以通过API调用等手段获取的文本形式的外部知识)。

记忆其实是个管理系统,智能体的记忆操作包括记忆写作(记录信息)、记忆管理和记忆阅读(检索信息),涉及到CURD的操作,增加记忆、更新记忆、搜索记忆、获取特定记忆、获取所有记忆等系统,这些操作共同支持智能体的学习和决策过程。

所以,根据不同的记忆类型,可以使用不同的存储设计。

例如,可以将记忆进一步分为短期记忆、长期记忆和工作记忆三类。

对于短期记忆(Short-term Memory),存储即时对话上下文、当前任务步骤、临时操作结果等动态信息。例如处理用户查询时需临时记录“用户偏好咖啡口味”这一信息。可以使用基于队列或栈的轻量级数据结构,支持快速读写(如Redis缓存),依赖大模型的上下文窗口直接存储,超出容量时通过总结摘要压缩信息,但这种需要平衡实时响应速度与信息完整性,防止因窗口限制导致关键细节丢失。

对于长期记忆(Long-term Memory),持久化存储用户历史行为、企业知识库、任务经验等数据,支持个性化服务和复杂推理。例如记录用户过去3个月的所有购物偏好,用于精准推荐。因为比较长,所以一般使用向量数据库存储,将文本语义编码为向量,支持相似性检索(如用户问“昨天的会议结论”时,自动关联历史会议记录),或者基于知识图谱存储,结构化存储实体关系,增强逻辑推理能力(如企业级系统中存储产品与客户关联信息)。或者采用混合存储,结合向量检索与关系型数据库(如PostgreSQL),兼顾语义匹配和结构化查询。

还有一种是临时的,不需要落盘的,即工作记忆(Working Memory),在复杂任务中临时存储中间状态,支持多步骤规划与动态调整。例如处理“生成数据分析报告”任务时,需缓存数据清洗结果、图表生成进度等中间变量,这可以通过字典类型变量存储。

二、Dify的知识库分段及召回逻辑细节 

Dify是一款开源的大语言模型(LLM) 应用开发平台,其中一个很重要的概念,就是工作流,工作流通过将复杂的任务分解成较小的步骤(节点)降低系统复杂度,减少了对提示词技术和模型推理能力的依赖,提高了LLM应用面向复杂任务的性能,提升了系统的可解释性、稳定性和容错性。

官网https://docs.dify.ai/zh-hans中给出了一个很好的例子。

Dify将工作流分为两种类型:

Chatflow面向对话类情景,包括客户服务、语义搜索、以及其他需要在构建响应时进行多步逻辑的对话式应用程序。

Workflow面向自动化和批处理情景,适合高质量翻译、数据分析、内容生成、电子邮件自动化等应用程序。

而基于这个工作流,其实就可以具象化为一个个步骤组件。

那么,RAG知识库就是其中一个很重要的点,可看看的,从实践侧能有什么细节

顺着《Embedding 技术与 Dify 数据集设计/规划》:https://mp.weixin.qq.com/s/vmY_CUmETo2IpEBf1nEGLQ这个工作,我们可以看看Dify这个工作,可以重点看看知识库部分:https://docs.dify.ai/zh-hans/guides/knowledge-base。

基于Dify提供的低代码拖拽,可以快速实现一个知识库RAG功能搭建。

1、文档模式

知识库支持两种分段模式,通用模式与父子模式,两者的主要区别在于内容区块的分段形式。通用模式的分段结果为多个独立的内容分段,而父子模式采用双层结构进行内容分段,即单个父分段的内容(文档全文或段落)内包含多个子分段内容(句子)。

不同的分段方式将影响LLM对于知识库内容的检索效果。在相同文档中,采用父子检索所提供的上下文信息会更全面,且在精准度方面也能保持较高水平,大大优于传统的单层通用检索方式

1)通用模式

通用模式下,当用户输入问题后,系统自动分析问题中的关键词,并计算关键词与知识库中各内容分段的相关度,根据相关度排序,选取最相关的内容分段并发送给LLM。系统按照用户自定义的规则将内容拆分为独立的分段。例如,分段标识符,默认值为\n,即按照文章段落进行分块。可以遵循正则表达式语法自定义分块规则,系统将在文本出现分段标识符时自动执行分段。

其余还有其他的参数:

分段最大长度,指定分段内的文本字符数最大上限,超出该长度时将强制分段。默认值为500Tokens,分段长度的最大上限为4000Tokens;

分段重叠长度,指的是在对数据进行分段时,段与段之间存在一定的重叠部分。这种重叠可以帮助提高信息的保留和分析的准确性,提升召回效果。建议设置为分段长度Tokens数的10-25%;其中还有一个文本预处理规则,过滤知识库内部分无意义的内容。提供以下选项:替换连续的空格、换行符和制表符,删除所有URL和电子邮件地址

2)父子模式

与通用模式相比,父子模式采用双层分段结构来平衡检索的精确度和上下文信息,让精准匹配与全面的上下文信息二者兼得。

其中:

父区块(Parent-chunk)保持较大的文本单位(如段落),提供丰富的上下文信息子区块(Child-chunk)则是较小的文本单位(如句子),用于精确检索

例如在AI智能客服场景下,用户输入的问题将定位至解决方案文档内某个具体的句子,随后将该句子所在的段落或章节,联同发送至LLM,补全该问题的完整背景信息,给出更加精准的回答

在具体执行时,子分段用于匹配查询:将文档拆分为较小、集中的信息单元(例如一句话),更加精准的匹配用户所输入的问题。子分段能快速提供与用户需求最相关的初步结果。

父分段用于提供上下文:将包含匹配子分段的更大部分(如段落、章节甚至整个文档)视作父分段并提供给大语言模型(LLM)。父分段能为LLM提供完整的背景信息,避免遗漏重要细节,帮助LLM输出更贴合知识库内容的回答。

所以,这就是small2big的用法。

父分段可以根据预设的分隔符规则和最大块长度将文本拆分为段落。每个段落视为父分段,适用于文本量较大,内容清晰且段落相对独立的文档。支持以下设置项:

1)分段标识符,默认值为\n,即按照文本段落分段。你可以遵循正则表达式语法自定义分块规则,系统将在文本出现分段标识符时自动执行分段。

2)分段最大长度,指定分段内的文本字符数最大上限,超出该长度时将强制分段。默认值为500Tokens,分段长度的最大上限为4000Tokens;

3)全文,不进行段落分段,而是直接将全文视为单一父分段。出于性能原因,仅保留文本内的前10000Tokens字符,适用于文本量较小,但段落间互有关联,需要完整检索全文的场景。

进一步的,子分段文本是在父文本分段基础上,由分隔符规则切分而成,用于查找和匹配与问题关键词最相关和直接的信息。如果使用默认的子分段规则,通常呈现以下分段效果:

当父分段为段落时,子分段对应各个段落中的单个句子。父分段为全文时,子分段对应全文中各个单独的句子。可以使用分段标识符,默认值为“。”,按照句子进行分段,可以遵循正则表达式语法自定义分块规则,系统将在文本出现分段标识符时自动执行分段。也可以使用分段最大长度,指定分段内的文本字符数最大上限,超出该长度时将强制分段。默认值为200Tokens,分段长度的最大上限为4000Tokens;

正则表达式的测试地址:https://regexr.com/

在分段模式后,那就是对应索引了,设计了高质量模式和经济模式两种,其中,高质量模式提供向量检索、全文检索和混合检索三种检索设置;

2、索引召回范式

在分段模式后,那就是对应索引了,设计了高质量模式和经济模式两种,其中,高质量模式提供向量检索、全文检索和混合检索三种检索设置,其中:TopK用于筛选与用户问题相似度最高的文本片段,系统同时会根据选用模型上下文窗口大小动态调整片段数量。默认值为 3,数值越高,预期被召回的文本分段数量越多。

Score阈值用于设置文本片段筛选的相似度阈值,只召回超过设置分数的文本片段,默认值为 0.5。数值越高说明对于文本与问题要求的相似度越高,预期被召回的文本数量也越少

混合检索会同时执行全文检索和向量检索,或 Rerank 模型,从查询结果中选择匹配用户问题的最佳结果,分别在知识库内进行全文检索(Full Text Search)以及进行向量检索(Vector Search)。

其中在混合检索设置内可以选择启用“权重设置”或“Rerank模型”,可以不断调试二者的权重,找到符合业务场景的最佳权重比例,Rerank模型默认关闭。开启后将使用第三方Rerank模型再一次重排序由混合检索召回的内容分段,以优化排序结果。向LLM发送经过重排序的分段,辅助其提升输出的内容质量

在经济索引方式下,仅提供倒排索引方式。这是一种用于快速检索文档中关键词的索引结构,常用于在线搜索引擎。倒排索引仅支持TopK设置项,用于筛选与用户问题相似度最高的文本片段。系统同时会根据选用模型上下文窗口大小动态调整片段数量系统默认值为3。数值越高,预期被召回的文本分段数量越多。

另一个是,出了走这类文档召回,还可以走Q&A分段模式,开启该模式后,系统将对已上传的文本进行分段。总结内容后为每个分段自动生成Q&A匹配对。与常见的QtoP(用户问题匹配文本段落)策略不同,QA模式采用QtoQ(问题匹配问题)策略。

这是因为常见问题文档里的文本通常是具备完整语法结构的自然语言,QtoQ模式会令问题和答案的匹配更加清晰,并同时满足一些高频和高相似度问题的提问场景。

Q&A分段模式,一个数据大概会生成20个问题。

问题生成的逻辑分成四个步骤:

了解并总结这段文本的主要内容->这段文本提到了哪些关键信息或概念->可分解或结合多个信息与概念->将这些关键信息与概念生成20个问题与答案

基于这种方式,采用的匹配方式就变成了Q-Q匹配,用户提出的问题会匹配到数据集里问题和段落,数据集基于用户的文档分成若干个分段,内容以QA形式储存在向量数据库。

用户的问题会与在与向量库数据库里的问题进行相似度对比,完成后将匹配得到的答案直接返回给用户。

但是这种方式泛化性不太好,用户的问题与数据集中的问题不完全匹配的情况,即当用户问了一个问题,而数据集中没有找到对应问题的答案时,会尝试换一种方式进行反复询问,最终获取用户的意图

总结 

本文主要介绍了关于Agent的记忆问题以及Dify中的知识库细节,大家可以具体使用,增进理解。

参考文献 

1、https://arxiv.org/pdf/2404.13501.pdf

2、https://docs.dify.ai/zh-hans

(文:老刘说NLP)

发表评论

×

下载每时AI手机APP

 

和大家一起交流AI最新资讯!

立即前往