LLM Agents 的细分技术

news2024/11/15 20:03:21

2.1 RAG:知识,记忆与技能库

2.1.1 RAG简介

RAG的核心思想就是将传统的语言生成模型(如GPT系列)与一个检索系统相结合,在处理一个输入时,RAG首先使用检索系统从一个大规模的文档集合中检索出相关的文本片段,然后将这些检索到的文本作为额外的上下文信息输入到生成模型中,以此来生成更加丰富和准确的输出。说白了就是给LLM一个字典让它查。

RAG往往是结合向量数据库,但是对于简单应用而言,只需要JSON格式文件就能实现,甚至能轻易指向其他格式文件(如图像)。注意:这里的embeddingtext embedding,即句向量,需要和词向量分开。句向量是将整个句子映射到向量空间,而计算句子语义相似度最常见的方式则是计算其text embedding之间的余弦相似度。而这种语义相似度除了可以进行文本检索以外,也可也用于识别用户意图,进行情感分析等等。

2.1.2 聊聊《Generative Agents》的检索函数

RAG的检索函数不一定只算语义相似度,可以有其他实现形式。比如《Generative Agents》里记忆流的检索函数。其检索函数的要素有三点,即[时效性,重要性,相关性]。时效性代表记忆最近被检索出的时间,重要性表明Agents对该记忆事件的重要性评估(一般是结合人设让LLM给出个分数,或许也可以用一个小模型做评分),相关性就是语义相似度。

检索记忆时,不再是按照语义相似度进行排序。而是在对三个特征进行最小最大归一化之后,计算一个综合评分,然后取Top k

Xnorm=(X−Xmin)/(Xmax−Xmin)

score=a∗recency+b∗importance+c∗relevance

详见原文:

arxiv.org/pdf/2304.03442.pdf​arxiv.org/pdf/2304.03442.pdf

2.1.3 RAG的语义孤立问题

RAG同样会出现一些问题。除了chunk本身就会丢失一些上下文以外(可以用交叠上下文来缓解),chunk的语义本身也是“孤立”的。这里是指:一段chunk中的文本可能需要chunk外的内容来帮助理解。例如有三个chunk分别为:

胡桃和宵宫是好朋友。
宵宫是“长野原烟花店”的现任店主。
胡桃是璃月“往生堂”第七十七代堂主。

对于一个通用LLM而言,如果它拿到的最相似匹配是“胡桃和宵宫是好朋友”,那其实LLM并不知道胡桃和宵宫是谁,并不一定能答好这个问题。这是因为:要理解一个知识,就需要理解其上层知识。在这个例子里,即“胡桃和宵宫到底是谁”。

针对于这个问题,向大家介绍一个比较简单的,面向原生JSON格式文件的优化方法,类似于分层检索:通过将知识库分层,首先在较高层次上对用户的查询进行理解和定位,然后再在更具体的层次上检索细节信息。这样一来,每次RAG时会拿到多级的语义,既有宏观认识也有最匹配用户Query的内容,或许能改善RAG效果。

对于上面的例子,其两级组织格式就应该是:

顶层知识:宵宫是“长野原烟花店”的现任店主。胡桃是璃月“往生堂”第七十七代堂主。 
↓指向
子知识:胡桃和宵宫是好朋友。

如此一来,每次检索到最相似的匹配是“胡桃和宵宫是好朋友。”时,就必然会附带上对胡桃和宵宫的简介。需要指出的是,由于没有向量数据库等高效存储检索系统,这并不是一种生产环境适用的高效方法。只适用于小型项目,如独立游戏。

2.1.4 另一种方法

我之前也有看到过另外一种做法:即按照语义去切分段落。合并语义上相关联的段落,然后对段落生成一个描述句,以该描述句来生成嵌入向量。即以段落描述句的嵌入向量为键,段落的完整内容为值。我们可以简单对比一下这两种方法:

分层检索通过建立层级结构,使得检索能够从大范围的上下文逐步深入到具体细节,保持了信息之间的关联性,但可能会因为结构的复杂性和维护难度而影响检索效率。语义切分合并则侧重于将语义相似的内容动态组织在一起,通过为每个内容块生成描述性的句子来创建索引,这样可以提高检索效率,但有时可能会因为合并不当而丢失关键上下文。

实际上,这两种方法可以结合起来使用。例如,可以先通过分层检索方法构建一个宏观的知识框架,然后在具体的层级内使用语义切分合并方法来进一步细化信息组织。这样,既保留了层级结构带来的上下文关联优势,又能够利用语义相似度进行高效检索。

2.2 CoT:问题分解与推理

2.2.1 CoT简介与两个例子

CoT让LLM将一个复杂问题分解为级联的子问题,并依次进行顺序处理,可以显著提升LLM处理较复杂的性能。CoT既可以用在单次内容生成里,也可用在一条内容生成的Pipeline里。一般的例子的是用CoT做数学题,但大家可能看腻了:

我这里倒是想给出一个基于想法进行风格化回复的例子,其广义上也是CoT的思路,并且很好理解,希望能让大家耳目一新。

直接让LLM做角色扮演对话会出现一些问题:例如,LLM喜欢抽取Prompt的要素而非好好说话;或是不怎么利用Prompt的要素而说一些无关紧要的话;又或是LLM干脆不知所措,说一些莫名其妙的话。我认为问题在于:LLM是需要“思考”后才能好好说话的,角色扮演(风格化对话)对于LLM其实是一个复杂问题。

因而可以将CoT的思想应用于风格化对话生成任务中,把对话生成分解为两个步骤:首先生成角色的内心思考内容,然后基于这些内容构建角色的回复。这样可以确保对话既符合角色的人设,又能够自然地融入到对话的流程中,经简单的主观测试,回复效果的确有提升。请大家重点关注下图左侧的生成部分(红框圈起来的部分):

具体的Prompt是这样组织的,应该比较好理解。请重点关注两段Prompt之间是如何联动的,即第一段生成的结果如何被嵌入到第二段Prompt当中:

thought_prompt = f"""
角色名称:{self.name}
初始记忆:{self.seed_memory}
当前心情:{self.mood}
任务:根据角色当前的相关记忆,相关知识,对话上下文进行分析,基于角色第一视角进行思考,给出角色的心理反应对和相关事件的判断。
字数限制:不超过100字。
<<<
相关记忆:“{memory['description']}” 
相关知识:“{knowledge_text}”
对话上下文:
{self.language_style}
{context}
>>>
请仅返回{self.name}第一人称视角下的思考内容,不要添加额外信息或格式。
"""

response_prompt = f"""
角色名称:{self.name}
初始记忆:{self.seed_memory}
当前心情:{self.fsm.mood}
任务:基于角色的思考内容和对话上下文进行回复。
字数限制:不超过100字。
<<<
思考内容:“{thought}”
对话上下文:
{self.language_style}
{context}
>>>
请在思考内容和对话上下文的基础上,以{self.name}的身份回复。不要扮演其他角色或添加额外信息,不要添加其他格式。
"""

CoT相关内容详见原文:

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

2.2.2 CoT变种

CoT的两个经典变种是ToT和Self-consistency。ToT是CoT的一个扩展,它不仅仅以线性的方式构建思维链,而是创建一个更为复杂的树形结构来进行推理。Self-consistency是另一种变种,强调在推理过程中保持一致性,会对语言模型进行多次采样,生成多个推理路径。然后再对不同推理路径的生成结果,基于投票选择最一致的答案输出。关于LM采样的概念,可以学习一下贪心解码,束搜索,Top-k ,Temperature等。

2.3 意图识别与执行

2.3.1 函数调用的例子

意图识别与执行是指让LLM基于上下文从一组备选项中选择合适的类别,根据需要填入相应的参数,并进行格式化输出的能力。

意图识别与执行包括工具使用,行为状态切换,理解环境反馈等(环境反馈的一个例子是:LLM生成的代码运行失败,Agent根据代码解释器返回的相关错误信息进行修改)。

函数调用是工具使用的一个典型例子。以OpenAI对话接口的函数调用功能Function Calling为例。Function Calling的工作方式是:首先,我们提供一个工具函数或外部API的接口描述,包括其用途和参数;然后,根据用户的查询(Query),让LLM生成一个格式化的函数调用。假设一个函数描述大概长这个样子,其描述了一个用于检索wiki百科的函数接口:

{
    "name": "use_wiki",
    "description": "检索wiki百科以补充不了解的知识",
    "parameters": {
        "type": "object",
        "properties": {
            "query": {
                "type": "string",
                "description": "需要检索的事物"
            }
        },
        "required": ["query"]
    }
}

用户只需要在上下文中描述一个具体任务,如果LLM认为需要调用相关函数,就有可能会触发函数调用功能。在这个例子中,LLM会解析用户的查询,并生成一个格式化的调用请求,例如use_wiki(query="特定主题的关键词")

2.3.2 状态切换的例子

意图识别与执行不止是函数调用。例如:在上下文中给定LLM一些情绪种类描述和情绪程度说明,要求LLM分析一段用户输入的情绪种类和情绪程度数值,并格式化地返回。又例如:要求LLM分析上下文中给出的一些状态和场景,并要求LLM根据场景决定其中的角色应该如何行动。这一类问题也算是意图识别与执行,这种能力往往作为某种中间步骤被使用。其准确数学模型应该是马尔可夫决策过程(MDP)。

意图识别与执行是构建LLM Agent时的一个重要能力,因为它允许模型进行决策并生成可操作的输出,这也是建立其数据通路与行动框架的基础。

这里给出一个最简单的用Prompt切换状态的例子,仅作示范:

任务:推理角色的下一个心情应该是什么。
<<<
角色当前心情:{self.mood}
观察到的事件:{trigger}
角色的想法:{thought}
可能的心情列表:{self.mood_list}
>>>
现在请根据角色目前的心情,观察到的事件和角色想法,从可能的心情列表中选择一个心情。例如:{self.mood_list[0]}。
心情可以是不变的。精确地输出心情名称,不要进行额外的输出。

2.4 数据通路与行动框架

数据通路通常指的是在Agent内部信息流动的机制,包括感知环境的输入、处理这些输入的中间步骤,以及生成输出或行动的最终步骤。行动框架则指的是Agent决策的算法和策略,它定义了Agent如何根据输入的数据和内部状态来选择行动。

两者共同定义了Agent到底以什么规则在对应的环境下行动。这里给出一些经典的框架图供参考:

Conceptual framework of LLM-based agent with three components: brain, perception and action.

generative agent architecture.

举个具体例子。《Voyager:LLM 驱动的具身终身学习智能体》用LLM来自我掌握技能和发现新事物,该智能体的数据通路与行动框架可以概括为以下几个构件:

  1. 自动课程(Automatic Curriculum):为智能体提供一系列逐步增加难度的任务,鼓励多样化行为和施加约束的指令,以促使其不断学习和进步。
  2. 迭代提示机制(Iterative Prompting Mechanism):用于引导智能体迭代和提升自身的技能,并引入环境反馈,程序解释器的执行错误,自我验证等。
  3. 技能库(Skill Library):用于存储智能体掌握的各种技能。通过存储成功解决任务的行动程序来逐渐构建技能库。

Agent会试图解决由自动课程提出的越来越难的任务,不断地生成代码和接受反馈,自我纠错和自我验证。直到自我验证模块确认任务完成后,就把生成的代码技能添加到技能库。后续就可以使用技能库里的相关技能来辅助完成相关新的任务。

总结一下,其完成“自我进化”的行动要素就是三点:

  1. 保持Agent持续活动,不断地接受任务要求,进行学习尝试,进行自我验证。
  2. 自我验证成功后,把学习成果添加到知识库中。
  3. Agent后续的活动可以以某种方法,使用之前添加到知识库的知识。

仅以此作为例子描述什么是数据通路与行动框架,详见原文:

CharacterEval: A Chinese Benchmark for Role-Playing Conversational Agent Evaluation

2.5 SFT简介:参数级别支撑

SFT即监督微调(Supervised Fine-Tuning)。SFT的一般目的是强化通用LLM在某个垂直任务上的能力,但也会出现“灾难性遗忘”这样的问题。

全参微调非常吃显存和计算资源,因而后续出现了各种各样的低资源微调方法。全参微调、Prompt Tuning、LoRA、P-Tuning等都在SFT这个范围里面。

最简单的SFT就是针对{prompt,response}的单轮问答pair进行微调,其数据格式组织如:

{
    "prompt": "<prompt text>",
    "response": "<response text>"
}
SFT和RAG往往是被二选一的,也常被横向比较各自的优劣。但如果用对齐的RAG格式问答对去微调LLM,或许也是可行的。即用微调增强LLM通过{检索内容+上下文}来生成内容的能力。

2.6 多模态简介

多模态LLMs不仅能够理解和生成文本,还能够理解和生成与其他模态相关的信息,如图像。以GPT-4V为例:

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

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

相关文章

算法练习-四数之和(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;数组 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨在…

【算法与数据结构】718、1143、1035、392、115、LeetCode最长重复子数组+最长公共子序列+不相交的线+判断子序列+不同的子序列

文章目录 一、718、最长重复子数组二、1143、最长公共子序列三、1035、不相交的线四、392、判断子序列五、115、不同的子序列六、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、718、最长重复子数组 思路分析&#xff1…

vue3-内置组件-TransitionGroup

<TransitionGroup> 是一个内置组件&#xff0c;用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。 与 <Transition> 的区别 <TransitionGroup> 支持和 <Transition> 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器&…

Linux联网安装MySQL Server

yum安装 以下代码复制粘贴到控制台即可 yum list | grep mysql-server #查看可以下载的MySQLyum install -y mysql-server #安装MySQLmysql_secure_installation #引导安装 引导安装实例如下 systemctl enable mysqld 设置开机自动启动 systemctl sta…

重生奇迹MU冰风谷雪人王

奇迹雪人王刷怪点在哪里 冰风谷&#xff1a;就一个刷怪点&#xff0c;这里还是比较适合走动打怪&#xff0c;这里刷新4只雪人王&#xff0c;这里从100来级挂到200级问题不大。一般来说冰风谷的雪人王以及雪人王以上的怪都有一定几率会掉宝石,去血色、广场还有寺院掉的要多,不固…

XxlJob深度性能优化实践

一、背景 天画项目的数据工厂目前在与xxl-job对接自动化数据生成任务,另外我司也在使用该组件做业务,所以想深入了解下XxlJob。在跟进了社区的github等仓库issue发现开发迭代停滞了一段时间,思来想去准备开个下游分支做一些性能优化和特性开发等,于是fork了下源码,将其作…

环境配置:ROS melodic安装turtlebot

文章目录 1.已有的环境2.安装2.1.首先cd进入到catkin_ws文件夹&#xff0c;然后输入以下命令行&#xff1a;2.2.将turtlebot加入环境2.3.选择性安装其它依赖包2.4.运行turtlebot in stage [perfect] 1.已有的环境 在之前已经配置好了小乌龟的前提下&#xff0c;我们已经拥有了…

2024/2/4 备战蓝桥杯 5-1 前缀和

目录 求和 0求和 - 蓝桥云课 (lanqiao.cn) 可获得的最小取值 0可获得的最小取值 - 蓝桥云课 (lanqiao.cn) 领地选择 P2004 领地选择 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 求和 0求和 - 蓝桥云课 (lanqiao.cn) 思路&#xff1a;先对公式进行合并同类相&#x…

AVR 328pb触摸功能基本介绍和使用

AVR 328pb触摸功能基本介绍和使用 &#x1f4dd;ATMEGA328PB-AU外设中带外围触摸控制器&#xff08;PTC&#xff09;电容式触摸按钮、滑块和轮子24个自帽通道和144个互帽通道。&#xff08;ATMEGA328P没有的&#xff09; ✅PTC-外围触摸控制器 &#x1f343;低功耗、高灵敏度、…

图形界面基础

X Window System 什么是 X Window System&#xff1f; 最初是1984年麻省理工学院的研究&#xff0c;之后变成UNIX、类UNIX、以及OpenVMS等操作系统所一致适用的标准化软体工具套件及显示架构的运作协定。X Window系统透过软体工具及架构协定来建立操作系统所用的图形用户界面&a…

Flink SQL Client 安装各类 Connector、Format 组件的方法汇总(持续更新中....)

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

Redis-布隆过滤器解决穿透详解

本文已收录于专栏 《中间件合集》 目录 背景介绍概念说明原理说明解决穿透安装使用安装过程Redis为普通安装的配置方式Redis为Docker镜像安装的配置方式 具体使用控制台操作命令说明Spring Boot集成布隆过滤器 总结提升 背景介绍 布隆过滤器可以帮助我们解决Redis缓存雪崩的问题…

算法笔记刷题日记——3.简单入门模拟 3.2 查找元素

刷题日记 3.2 查找元素 B1041 B1004 B1028 B1032 A1011 A1006 A1036 错题记录 B1028 人口普查 某城镇进行人口普查&#xff0c;得到了全体居民的生日。现请你写个程序&#xff0c;找出镇上最年长和最年轻的人。 这里确保每个输入的日期都是合法的&#xff0c;但不一定是合理的…

Javascript入门学(基础)

软件篇 JS基础语法第一天 1.javascript介绍 1.1 js是什么 是什么 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果&#xff0c;而html和css是标记性语言&#xff0c;并非编程语言有什么用 js的组成 htmlcssjs实现按钮点击功能 …

使用mmrotate对自定义数据集进行检测

这里写自定义目录标题 安装虚拟环境创建与准备安装mmrotate 自定义数据集标注数据与格式转换数据集划分与大图像切片 训练与测试修改配置文件执行训练进行测试鸣谢 安装 mmrotate是一个自带工作目录的python工具箱&#xff0c;个人觉得&#xff0c;在不熟悉的情况下&#xff0…

node.js后端+小程序前端+mongoDB(增删改查)

前言 今天我对比了以下node.js的express与python的fastAPI&#xff0c;我决定我还是出一期关于node.jsmangoDB小程序的小案例吧。 不是python的fastAPI不好用&#xff0c;因为fastAPI是python较新的技术&#xff0c;我不敢果断发出教学文章&#xff08;这件事情还是留着给pyt…

Leetcode—59. 螺旋矩阵 II【中等】

2024每日刷题&#xff08;113&#xff09; Leetcode—59. 螺旋矩阵 II 实现代码 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> ans(n, vector<int>(n));int num 0;int c1 0, c2 n - 1;int r1 …

探索C语言结构体:编程中的利器与艺术

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C语言学习 贝蒂的主页&#xff1a;Betty‘s blog 1. 常量与变量 1. 什么是结构体 在C语言中本身就自带了一些数据类型&#x…

Verilog刷题笔记21

题目&#xff1a; A priority encoder is a combinational circuit that, when given an input bit vector, outputs the position of the first 1 bit in the vector. For example, a 8-bit priority encoder given the input 8’b10010000 would output 3’d4, because bit[4…

假期算法提升(带你彻底掌握滑动窗口)

呀哈喽&#xff0c;我是结衣。 今天我们要学习的是一种新的算法&#xff0c;也是一种双指针。不过他拥有一个全新的名字”滑动窗口“。 文章目录 1.长度最小的子数组&#xff08;medium&#xff09;思路解题方法Code 2.无重复字符的最长子串&#xff08;medium&#xff09;思路…