Agent 概览
Agent概念并不是当今的产物,而是伴随人工智能而出现的智能实体概念不断进化的结果。
有人认为AI Agent起源于20世纪80年代Wooldridge等人将Agent引入到人工智能,也有人认为最早的Agent概念应该是上世纪50年代阿兰图灵把“高度智能有机体””扩展到了人工智能。
也有论文(见复旦大学《基于大型语言模型的Agent的兴起和潜力:综述》,文末可获取),将最早的Agent概念追溯到了丹尼斯·狄德罗的“聪明的鹦鹉”学说。
如果从哲学启迪的角度来看 Agent,大概可以上溯到公元前280年到公元前485年之间的庄子、亚里士多德、老子等思想家的学说与著作。
思维链 Chain of Thought(简称CoT)
Prompt 工程(Prompt Engineering),又称提示工程,是指设计和优化用于与生 成式人工智能模型交互的Prompt的过程。经过良好设计的Prompt通常由任务说明、上下文、问题、输出格式四个基本元素组成:
- 任务说明: 向模型明确提出具体的任务要求。任务说明应当清晰、直接, 并尽可能详细地描述期望模型完成的任务。
- 上下文: 向模型提供的任务相关背景信息,用以增强其对任务的理解以及 提供解决任务的思路。上下文可以包括特定的知识前提、目标受众的背景、 相关任务的示例,或任何有助于模型更好地理解任务的信息。
- 问题: 向模型描述用户的具体问题或需要处理的信息。这部分应直接涉及 用户的查询或任务,为模型提供一个明确的起点。问题可以是显式的提问, 也可以是隐式的陈述句,用以表达用户的潜在疑问。
- 输出格式: 期望模型给出的回答的展示形式。这包括输出的格式,以及任何特定的细节要求,如简洁性或详细程度。例如,可以指示模型以JSON格 式输出结果。
Prompt 的四个基本元素——任务说明、上下文、问题和输出格式,对于大语言 模型生成的效果具有显著影响。这些元素的精心设计和组合构成了Prompt工程的核心
Prompt Engineering,也称为 In-Context Learning 上下文学习(In-Context Learning, ICL)。是一种通过构造特定的 Prompt,在不更新模型权重的情况下,激发大语言模型的上下文学习能力来使得大语言模型理解并学习下游任务的范式,进而完成多种不同任务。这些特定的 Prompt 中可以包含演示示例,任务说明等元素。上下文学习实现的关键在于如何设计有效的 Prompt,以引导模型理解任务的上下文和目标。这是一门实证科学,快速工程方法的效果可能因模型而异,因此需要大量的实验和启发式方法。
为让大语言模型进一步提升数学算术、常识和符号推理问题的能力,22年1月,谷歌大脑团队的Jason Wei、Xuezhi Wang等人提出了新的 Prompting 机制——Chain of Thought(简称CoT)。 [2201.11903] Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 该论文全部作者包括Jason Wei, Xuezhi Wang, Dale Schuurmans, Maarten Bosma, Brian Ichter, Fei Xia, Ed Chi, Quoc Le, Denny Zhou
CoT方法的核心是构造合适的 Prompt ,在 Prompt 增加 "Let’s think step by step" 以触发大语言模型一步一步生成推理路径,并生成最终答案。早期方法在构造Prompt时,加入少量包含推理过程的样本示例(Few-Shot Demonstrations),来引导模型一步一步生成答案
简言之就是给大模型推理步骤的 prompt,让其模拟人类解决复杂问题时的思考/推理,引导大语言模型在生成答案的过程中引入一系列的中间推理步骤,从而让大模型具备基本的推理能力,最终可以求解一些简单甚至相对复杂的数学推理能力。
这种方法不仅能够显著提升模型在推理任务上的表现,而且还能够揭示模型在处理复杂问题时的内部逻辑和推理路径。
以下是一个示例(下图左侧为 standard prompting,下图右侧为基于 CoT 的 prompt,高亮部分为chain-of-thought),模型在引入基于 CoT 技术的 prompt 的引导下,一步一步算出了正确答案,有没有一种眼前一亮的感觉?相当于模型具备了逻辑推理能力
下图对比了 CoT 跟其他方法的差别:
总结
- ICL(上下文学习): 一问一答,直来直去
- CoT(思维链): 理性推理, [2201.11903] Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
- ToT(思维树): 集思广益, [2305.10601] Tree of Thoughts: Deliberate Problem Solving with Large Language Models
- Self-Consistency: 三思而后行, [2203.11171] Self-Consistency Improves Chain of Thought Reasoning in Language Models
ReAct Agent
- 论文:[2210.03629] ReAct: Synergizing Reasoning and Acting in Language Models
- GitHub 代码: GitHub - ysymyth/ReAct: [ICLR 2023] ReAct: Synergizing Reasoning and Acting in Language Models


ReAct的思想是将智能体的行动空间和语言空间进行组合,语言空间中的行动,我们将其称为思考或推理痕迹,不会影响外部环境,因此不会产生观察反馈 相反,思考旨在通过对当前上下文进行推理来组合有用的信息,并更新上下文以支持未来的推理或行动 如上述两个图所示,可能存在各种类型的有用思考
LLM 用自然语言基于思维链生成 reasoning 路径,同时给 LLM 提供感知外部信息的能力,比如调用搜索引擎的 API 查询今日天气。
Self-ask
上面是Self-ask和搜索引擎结合的例子,开始会添加few-shot prompt和问题,然后LM产生follow-up问题,把问题输入到搜索引擎,得到返回结果,插入到该prompt之后,继续重复上面的动作,直到找到最终的答案为止。
论文链接: Measuring and Narrowing the Compositionality Gap in Language Modelsarxiv.org/abs/2210.03350!
Plan and Solve Prompting
- 论文:[2305.04091] Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models
- GitHub 代码:GitHub - AGI-Edgerunners/Plan-and-Solve-Prompting: Code for our ACL 2023 Paper "Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models".
Plan-and-execute agents这个方法本质上是先计划再执行,即先把用户的问题分解成一个个的子任务,然后再执行各个子任务,最后合并输出得到结果。做法也比较简单,prompt的形式需要改变一下,前面的论文使用的是“Let’s think step by step”,在这里使用新的prompt,“Let’s first understand the problem and devise a plan to solve the problem. Then, let’s carry out the plan and solve the problem step by step”,图a表示的是Zero-shot-Cot Prompting,图b使用的是Plan-and-Solve(PS)prompting,图(c)显示的是answer extracting prompting。Zero-shot-CoT鼓励LLM生成多步骤用“Let’s think step by step”进行推理,当问题复杂时,它仍然可能产生错误的推理步骤。与Zero-shot-CoT不同,PS提示首先要求LLM设计一个计划,通过生成一个步骤来解决问题计划和执行计划以找到答案。
总结
- 语言学习阶段,硅基生命学习 token ,碳基少儿学习说话。一问一答
- 推理能力阶段,硅基思维链学习,存在幻觉,会编造答案。碳基少年中小学阶段,经常天马行空,瞎想。
- 自主驱动 Agentic 阶段,硅基生命行动空间和语言空间进行组合。碳基青年大学阶段,学会自主独立规划。
Agent 系统
LLM Powered Autonomous Agents
2023 年 lilianweng 发布 Blog LLM Powered Autonomous Agents | Lil'Log (lilianweng.github.io)
描绘了基于 LLM 的驱动的 Agent 系统中,需要提供的几个关键组件:
- Planning:
- 拆解子目标:将复杂任务拆解成多个简单,可完成的子目标,通过完成子目标,进一步完成复杂任务。
- 反思和改进:Agent 需要之前的执行结果进行反思和自动纠错,从而优化后续的动作,获得更优的结果。
- Tool use:
- Agent 支持根据模型输出,调用模型之外工具。从而获取实时信息,执行代码等能力。
- Memory:
- 短期记忆:一次任务期间的所有的上下文,利用模型的 few-slot 学习能力
- 长期记忆: Agent 需要具有检索模型之外信息的能力,一般通过向量数据库查询,或者 RAG 等。
Building Effective AI Agents
Building Effective AI Agents \ Anthropic
- 增强型 LLM: 智能体系统的基本构建块是增强型LLM,具备检索、工具和记忆等增强功能。我们当前的模型能够主动使用这些功能——生成自己的搜索查询,选择适当的工具,并确定要保留的信息。
-
提示链式调用(Workflow: Prompt chaining): 提示链式调用将任务分解成一系列步骤,每个LLM调用处理前一个调用的输出。你可以在任何中间步骤添加程序检查(见下图中的“门控”)以确保过程正常进行。 使用时机: 该工作流适用于任务可以轻松清晰地分解为固定子任务的情况。主要目标是通过将每个LLM调用的任务简化来换取更高的准确性。
-
工作流:路由(Workflow: Routing): 路由将输入分类,并将其引导至专门的后续任务。此工作流有助于关注点分离,构建更为专业化的提示。没有该工作流的情况下,优化一种输入类型可能会影响其他输入的表现。
-
工作流:并行化(Workflow: Parallelization): LLM有时可以同时处理一个任务,并将它们的输出进行程序化汇总。此工作流,即并行化,具有两种关键变体:
- 分区: 将任务分解成可以并行处理的独立子任务。
- 投票: 多次运行相同任务,以获得不同的输出。
-
工作流:调度器-工作者(Workflow: Orchestrator-workers): 在调度器-工作者工作流中,一个中心LLM动态地将任务分解,分配给工作者LLM,并综合它们的结果。
- 工作流:评估者-优化者(Workflow: Evaluator-optimizer): 在评估者-优化者工作流中,一个LLM调用生成响应,另一个LLM调用提供评估并在循环中反馈。
- 智能体: 随着大语言模型(LLM)在理解复杂输入、进行推理与规划、可靠地使用工具以及从错误中恢复方面的能力逐渐成熟,智能体(Agents)开始在生产环境中得到了广泛应用。智能体的工作通常始于人类用户的指令或互动讨论。一旦任务明确,智能体便能独立规划和执行任务,必要时会返回人类用户以获取更多信息或判断。在执行过程中,智能体需要在每个步骤获取来自环境的“真实信息”(如工具调用结果或代码执行)以评估其进展。智能体还可以在检查点或遇到障碍时暂停,并请求人类反馈。任务通常在完成时终止,但常常也会设置停止条件(如最大迭代次数)以保持对过程的控制。
智能体能够处理复杂的任务,但它们的实现往往是直接的。通常,它们只是基于环境反馈的循环,使用工具的LLM。因此,设计工具集及其文档时,需要特别清晰和周到。我们在附录2《提示工程与工具》中扩展了工具开发的最佳实践。
Google Agents 白皮书
Agent 挑战
- 上下文长度限制
- 长期任务规划,复杂任务拆解能力
- LLM 基于自然语言的输出格式的可靠性
Agent Framework
Loading Data (Ingestion) - LlamaIndex
workflow
import asyncio
from llama_index.core.workflow import (
StartEvent,
StopEvent,
Workflow,
step,
)
from llama_index.llms.ollama import Ollama
class OllamaGenerator(Workflow):
@step
async def generate(self, ev: StartEvent) -> StopEvent:
llm = Ollama(model="deepseek-r1:8b")
response = await llm.acomplete(ev.query)
return StopEvent(result=str(response))
async def ollama():
w = OllamaGenerator(timeout=100, verbose=False)
result = await w.run(query="Who are you?")
print(result)
if __name__ == "__main__":
asyncio.run(ollama())
Agents
Agents - LlamaIndex An "agent" is an automated reasoning and decision engine. It takes in a user input/query and can make internal decisions for executing that query in order to return the correct result. The key agent components can include, but are not limited to:
- Breaking down a complex question into smaller ones
- Choosing an external Tool to use + coming up with parameters for calling the Tool
- Planning out a set of tasks
- Storing previously completed tasks in a memory module
Agents - LlamaIndex Building a data agent requires the following core components:
- A reasoning loop
- Tool abstractions
The reasoning loop depends on the type of agent. We have support for the following agents:
- Function Calling Agents (integrates with any function calling LLM)
- ReAct agent (works across any chat/text completion endpoint).
- "Advanced Agents": LLMCompiler, Chain-of-Abstraction, Language Agent Tree Search, and more.
事件驱动
Other frameworks and LlamaIndex itself have attempted to solve this problem previously with directed acyclic graphs (DAGs) but these have a number of limitations that workflows do not:
- Logic like loops and branches needed to be encoded into the edges of graphs, which made them hard to read and understand.
- Passing data between nodes in a DAG created complexity around optional and default values and which parameters should be passed.
- DAGs did not feel natural to developers trying to developing complex, looping, branching AI applications.
The event-based pattern and vanilla python approach of Workflows resolves these problems.
For simple RAG pipelines and linear demos we do not expect you will need Workflows, but as your application grows in complexity, we hope you will reach for them.
A key feature of Workflows is their enablement of branching and looping logic, more simply and flexibly than graph-based approaches. docs.llamaindex.ai/en/stable/u…