一文讲懂agent&搭建一款属于自己的智能体
大家好,我是烤鸭:最近除了研究开源模型和工具调用,也在看智能体相关,再好的模型或者代码都只是工具,想要有生产力还是得上价值(智能体),谁不想要一个可以7*24h工作的AI助手(牛马)呢。
大家好,我是烤鸭:
最近除了研究开源模型和工具调用,也在看智能体相关,再好的模型或者代码都只是工具,想要有生产力还是得上价值(智能体),谁不想要一个可以7*24h工作的AI助手(牛马)呢。
介绍
什么是agent,可以看下下面的文章。
https://lilianweng.github.io/posts/2023-06-23-agent/
简单一张图概括下:
agent包含几大模块:计划、记忆、行为(调用工具)
模块详细说明
计划(Planning)
任务分解
思维链:
- “逐步思考”,以利用更多的测试时间计算将艰巨的任务分解为较小,更简单的步骤。
思维树
- 将问题分解为多个思考步骤,并每个步骤产生多个想法,从而创建树结构。搜索过程可以是BFS(广度优先搜索)或DFS(深度优先搜索),每个状态都由分类器(通过提示)或多数投票评估。
任务分解的简单触发方式可以通过提示词,比如"完成目标需要哪些投入",“写一个小说的大纲”。
或者使用域定义语言(PDDL)作为中间接口来描述规划问题,在此过程中。LLM 将问题转
换为“问题 PDDL”,然后请求经典规划器基于现有的“域 PDDL”生成 PDDL 规划,最后将
PDDL 规划转换回自然语言。
自我反省
React(行为)
- 通过将动作空间扩展为特定于任务的离散动作和语言空间的组合,将推理和作用整合在LLM中。前者使LLM能够与环境互动(例如使用Wikipedia搜索API),而后者则促使LLM以自然语言生成推理痕迹。
Reflexion(反射)
- 是一个框架,可为代理提供动态的记忆和自我反射能力,以提高推理能力。反射具有标准的RL设置,其中奖励模型提供了一个简单的二进制奖励,而动作空间遵循React中的设置,其中特定于任务的动作空间用语言增强以实现复杂的推理步骤。每次动作之后,代理都会计算启发式态,并且可以选择地决定重置环境以根据自我反射结果开始新的试验。反射机制可以排除效率低下或者包含幻觉的轨迹。
Chain of Hindsight(事后观察链)
该过程是监督的微调,其中数据是以下形式的序列。对模型进行列出,以仅预测序列前缀的条件,以便该模型可以自我反射以根据反馈序列产生更好的输出。
记忆(Memory)
记忆的类型
Sensory Memory(感觉记忆):
- 记忆的早期阶段,指在原始刺激结束后仍能保留感官信息(视觉、听觉等)印象的能力。
- 感觉记忆作为原始输入的学习嵌入表示,包括文本、图像或其他模态
Short-Term Memory(短期记忆):
- 存储我们当前已知且执行复杂认知任务(例如学习和推理)所需的信息
- 短期记忆作为情境学习。由于受到 Transformer 有限上下文窗口长度的限制,它既短又有限
Long-Term Memory(长期记忆):
- 外显/陈述性记忆:这是对事实和事件的记忆,指那些可以被有意识地回忆的记忆,包括情景
记忆(事件和经历)和语义记忆(事实和概念)。
- 内隐/程序记忆:这种类型的记忆是无意识的,涉及自动执行的技能和行为,例如骑自行车或
在键盘上打字。
- 长期记忆作为代理在查询时可以关注的外部向量存储,可通过快速检索访问
Maximum Inner Product Search (MIPS 最大内积搜索)
-
外部存储器可以缓解注意力持续时间有限的限制。一种标准做法是将信息的嵌入表示保存到支持快速最大内积搜索(MIPS)的向量存储数据库中。为了优化检索速度,常见的选择是*近似最近邻**(ANN)*算法,该算法返回近似的前 k 个最近邻,以牺牲少量准确度为代价来获得巨大的速度提升。
-
MIPS 的几种常见人工神经网络(ANN)算法选择:
- LSH(局部敏感哈希):它引入了一种哈希函数,使得相似的输入项以高概率被映射到相同的桶中,且桶的数量远小于输入的数量。
- ANNOY(近似最近邻):其核心数据结构是随机投影树,这是一组二叉树,其中每个非叶子节点表示一个将输入空间一分为二的超平面,每个叶子节点存储一个数据点。这些树是独立且随机构建的,因此在某种程度上,它模仿了哈希函数。ANNOY搜索在所有树中同时进行,迭代搜索最接近查询的一半,然后聚合结果。这个想法与KD树非常相关,但可扩展性要强得多。
- HNSW(层次可导航小世界网络):它受小世界网络概念的启发,在这种网络中,大多数节点可以在少量步骤内被其他任何节点到达;例如,社交网络的“六度分离”特性。HNSW构建了这些小世界图的层次结构,其中底层包含实际的数据点。中间的层创建快捷路径以加速搜索。在进行搜索时,HNSW从顶层的随机节点开始,向目标节点导航。当它无法再靠近时,它会向下移动到下一层,直到到达底层。上层中的每次移动都可能在数据空间中覆盖很大的距离,而下层中的每次移动则能提高搜索质量。
- FAISS(Facebook AI Similarity Search):其工作原理基于这样一个假设:在高维空间中,节点之间的距离遵循高斯分布,因此数据点之间应存在聚类。FAISS通过将向量空间划分为簇来应用向量量化,然后在簇内进一步细化量化。搜索首先通过粗略量化寻找候选簇,然后通过更精细的量化进一步查看每个簇。
- ScaNN(可扩展最近邻算法):ScaNN的主要创新是各向异性矢量量化。它将数据点量化成使得内积
与原始距离相似。尽可能地,而不是选择最近的量化质心点。
工具使用
人类比机器更厉害的一个主要原因是人会使用工具。为大型语言模型(LLM)配备外部工具可以显著扩展模型的能力。
-
MRKL(模块化推理、知识与语言”的缩写,是一种用于自主代理的神经符号架构)。MRKL系统被提议包含一组“专家”模块,而通用大型语言模型(LLM)则作为路由器,将查询路由到最适合的专家模块。这些模块可以是神经网络(如深度学习模型)或符号系统(如数学计算器、货币转换器、天气API)。他们进行了一项实验,旨在微调大型语言模型(LLM)以调用计算器,并以算术作为测试用例。实验结果表明,解决口头数学问题比解决明确表述的数学问题更难,因为大型语言模型(7B Jurassic1-大型模型)无法可靠地提取基本算术的正确参数。这些结果凸显了外部符号工具何时能够可靠工作的重要性,而知道何时以及如何使用这些工具则至关重要,这取决于大型语言模型的能力。
-
TALM(工具增强语言模型)和Toolformer都对语言模型(LM)进行了微调,以学习使用外部工具API。数据集的扩展基于新添加的API调用注释是否能提高模型输出的质量。更多详细信息请参见“提示工程”中的“外部API”部分。
-
ChatGPT插件和OpenAI API函数调用是大型语言模型(LLMs)在实践中增强工具使用能力的良好示例。工具API的集合可以由其他开发者提供(如插件中所示),也可以自定义(如函数调用中所示)。
-
HuggingGPT是一个框架,它使用ChatGPT作为任务规划器,根据模型描述在HuggingFace平台上选择可用模型,并根据执行结果对响应进行总结。
该系统包括4个阶段:
(1)任务规划:大型语言模型(LLM)作为大脑,将用户请求解析为多个任务。每个任务都有四个属性:任务类型、ID、依赖关系和参数。它们使用少量示例来指导LLM进行任务解析和规划。
说明:
人工智能助手可以将用户输入解析为多个任务:
[{"task": task, "id": task_id, "dep": dependency_task_ids, "args": {"text": text, "image": URL, "audio": URL, "video": URL}}]。
"dep"字段表示生成当前任务所依赖的新资源的上一个任务的ID。
特殊标记"-task_id"指的是在依赖任务中生成的文本、图像、音频和视频,其ID作为task_id。
任务必须从以下选项中选择:{{可用任务列表}}。
任务之间存在逻辑关系,请注意它们的顺序。如果无法解析用户输入,请回复空JSON。
以下是几个示例供您参考:{{演示}}。聊天记录记录为{{聊天记录}}。从这些聊天记录中,您可以找到用户提到的资源路径,以便进行任务规划。
(2)模型选择:大型语言模型(LLM)将任务分配给专家模型,其中请求被设计为多项选择题的形式。LLM会收到一个模型列表供其选择。由于上下文长度有限,需要进行基于任务类型的过滤。
说明:
根据用户请求和调用命令,AI助手会帮助用户从模型列表中选择一个合适的模型来处理用户请求。AI助手仅输出最合适模型的模型ID。输出必须采用严格的JSON格式:“id”:“id”,“reason”:“您选择的详细理由”。我们为您准备了一个模型列表{{ Candidate Models }}供您选择。请从列表中选择一个模型。
(3) 任务执行:专家模型执行特定任务并记录结果。
说明:
根据输入和推理结果,人工智能助手需要描述流程和结果。之前的阶段可以归纳为:
用户输入:{{用户输入}},
任务规划:{{任务}},
模型选择:{{模型分配}},
任务执行:{{预测}}。
你必须首先以直接的方式回答用户的请求。然后以第一人称描述任务流程,并向用户展示你的分析和模型推理结果。如果推理结果包含文件路径,必须告诉用户完整的文件路径。
(4) 响应生成:大型语言模型(LLM)接收执行结果,并向用户提供总结后的结果。
要将HuggingGPT投入实际应用,需要解决几个挑战:
(1)由于大型语言模型(LLM)的推理轮次以及与其他模型的交互都会减缓进程,因此需要提高效率;
(2)它依赖于较长的上下文窗口来传达复杂的任务内容;
(3)需要提高大型语言模型输出和外部模型服务的稳定性。
API-Bank是评估工具增强型大型语言模型(LLM)性能的基准。它包含53个常用的API工具、一个完整的工具增强型LLM工作流程以及264个标注对话,涉及568个API调用。所选API类型相当多样,包括搜索引擎、计算器、日历查询、智能家居控制、日程管理、健康数据管理、账户认证工作流程等。由于API数量众多,大型语言模型(LLM)首先会访问API搜索引擎以找到要调用的正确API,然后使用相应的文档进行调用。
在API-Bank工作流程中,大型语言模型(LLM)需要做出几个决策,并且我们可以在每一步评估这些决策的准确性。决策包括:
- 是否需要API调用。
- 确定要调用的正确API:如果不够好,大型语言模型(LLMs)需要迭代修改API输入(例如,为搜索引擎API确定搜索关键词)。
- 基于API结果的响应:如果结果不令人满意,模型可以选择进行优化并再次调用。
该基准测试从三个层面评估智能体的工具使用能力:
-
一级评估调用API的能力。给定一个API的描述,模型需要确定是否调用给定的API、是否正确调用以及是否对API返回做出正确响应。
-
二级评估的是检索API的能力。模型需要搜索可能满足用户需求的API,并通过阅读文档学习如何使用它们。
-
三级评估的是在检索和调用之外规划API的能力。对于不明确用户请求(例如安排小组会议、为旅行预订航班/酒店/餐厅),模型可能需要进行多次API调用才能解决。
搭建自己的Agent
国内的智能体平台还是比较丰富的,有云上的,也有开源支持本地部署的。
扣子空间:https://www.coze.cn/space
开源的dify:https://github.com/langgenius/dify
还有个人开源的:https://gitee.com/aiflowy/aiflowy
这里以本地部署的dify为例:
做一个图片生成的智能体,与其说是智能体,不如说是工具的链式调用。
逻辑也比较简单:用户输入 -> 图片生成 -> 查询结果 -> 下载图片。
生成/修改图片调用的是本地Qwen-Image/Qwen-Image-Edit的包装的http接口。
复杂智能体应该是什么样的:
类似之前写过一篇浏览器自动化操作的,https://blog.csdn.net/Angry_Mills/article/details/147542187
toC比较友好的可以试试纳米AI。
这是我之前生成的,https://bot.n.cn/share/mcp?id=qr6avd&from=pc&src=360_llq。
先不说质量怎么样,如果人工通过页面或者调API的方式生成这个视频,时间和金钱成本都不会少的,何况人家的质量还行,我觉得及格了吧。
网上还有好多卖扣子工作流的,什么一键生成视频,抓取新闻生成摘要,很多这种。
在知识付费的时代,我不反对卖课的,但是打着AI旗号骗钱的就算了。目前AI最赚钱的场景就是卖课、卖会员,什么做视频一天涨粉好几百那种的就别想了。
如果你有显卡,本地部署comfyui,下载一些开源的模型自己玩就好了,还可以搞nfsw。
网上也有很多云服务器网站,也可以租算力,自己部署体验下。
总结
agent是提高了效率,但是现阶段AI最大的问题还是成本与收益。
比如上面我发的browser-use,执行一个打开某个网页,下载第一个视频的指令。可能需要花几毛钱,如果从成本收益的角度,估计没人会这么用。
再比如生成图片或者视频那些,用豆包或者即梦的网站还行,每天有免费的额度,如果调API或者接入智能体的话,成本花费不是个人能支撑的。
扣子有很多生态和第三方接入的智能体,性价比还可以。
想用这个来赚钱还是别想了,做一个工作辅助还行。
下一篇写一下dify源码windows本地部署(非docker版本)。
文章参考
https://lilianweng.github.io/posts/2023-06-23-agent/
https://arthurchiao.art/blog/ai-agent-white-paper-zh/
更多推荐
所有评论(0)