下文代码示例使用langchaingo
简介
智能体 系统本质上是一种计算实体,能感知其环境(包括数字和物理环境),根据这些感知和预设或学习到的目标做出决策,并自主执行行动以实现目标。与传统软件严格按照固定步骤执行不同,智能体具备一定的灵活性和主动性。
发展阶段
提示链
与其让 LLM 一步到位解决复杂问题,提示链主张采用分而治之策略,将原本棘手的问题拆解为一系列更小、更易管理的子问题。每个子问题通过专门设计的提示单独处理,并将前一步的输出作为下一步的输入,形成链式依赖。
智能体可利用提示链自主规划、推理和行动,适应动态环境。通过合理设计提示序列,智能体可完成多步推理、规划和决策任务,模拟人类思维流程,实现更自然、高效的复杂领域交互。
结构化输出的重要性:提示链的可靠性高度依赖于各步骤间数据的完整性。若某步输出模糊或格式不规范,后续提示可能因输入错误而失败。为此,建议指定结构化输出格式,如 JSON 或 XML。
例子
数据提取与转换:将非结构化文本转为结构化格式,通常需多步迭代修正以提升准确性和完整性。
- 尝试从发票文档中提取指定字段(如姓名、地址、金额)。
- 检查字段是否齐全且格式正确。
- 若字段缺失或格式错误,重新提示模型查找缺失/错误信息,并提供失败上下文。
- 再次验证结果,必要时重复。
- 输出提取并验证的结构化数据。
例子:
我想写一篇文章
func main() {
// 1. 初始化 LLM
llm, err := initGemini()
if err != nil {
log.Fatalf("初始化 LLM 失败:%v", err)
}
// 2. 定义第一个提示模板(生成大纲)
outlinePrompt := prompts.NewPromptTemplate(
"请为主题「{{.topic}}」生成一份简洁的技术文章大纲,仅包含3个一级标题,无需二级标题",
[]string{"topic"},
)
// 第一个链:生成大纲
outlineChain := chains.NewLLMChain(llm, outlinePrompt)
outlineChain.OutputKey = "outline"
// 3. 定义第二个提示模板(根据大纲生成正文)
contentPrompt := prompts.NewPromptTemplate(
"请根据以下文章大纲,为每个标题撰写一段200字左右的正文内容,语言通俗易懂:{{.outline}}",
[]string{"outline"},
)
// 第二个链:生成正文
contentChain := chains.NewLLMChain(llm, contentPrompt)
// 4. 创建顺序链(串联两个提示链)
sequentialChain, err := chains.NewSequentialChain(
[]chains.Chain{outlineChain, contentChain},
[]string{"topic"}, // 初始输入变量
[]string{"text"}, //
)
if err != nil {
log.Fatalf("创建顺序链失败:%v", err)
}
// 5. 运行多提示链
ctx := context.Background()
input := map[string]interface{}{
"topic": "Go 语言并发编程",
}
result, err := chains.Call(ctx, sequentialChain, input)
if err != nil {
log.Fatalf("运行顺序链失败:%v", err)
}
// 6. 解析并输出结果
fmt.Println("多提示链运行结果:")
fmt.Println(result)
}
上下文工程与提示工程
模型输出质量更多取决于所提供的丰富上下文,而非模型架构本身。因此,任务不再是简单答疑,而是为智能体构建完整操作视图
提示词优化器工具
promptpilot.volcengine.com/home
规划
大模型将复杂任务拆解为可管理的小步骤,基于任务目标、当前环境状态、历史执行结果,自主推理、拆解出动态可调的执行步骤序列,能根据执行反馈修正步骤、处理异常,核心是“自主决策与动态适配”。灵活性与可预测性之间的权衡。
ReAct 模式的核心定义
ReAct(Reasoning + Acting,即 “推理 + 行动”)是一种让大语言模型(LLM)通过 “交替进行推理思考与外部行动” 来解决复杂任务的范式。它模拟人类解决问题的思维过程:先通过推理明确 “下一步该做什么”,再执行具体行动获取外部信息,最后根据行动结果反馈调整后续推理,形成闭环流程,从而实现动态规划与不确定性问题求解。
在下面的 langchaingo Agent 中,ReAct 模式的落地清晰可见:
自然语言处理文件夹相关的操作
// FolderAgent 自然语言处理文件夹相关的操作
func FolderAgent(ctx context.Context, userId int, req *kivi.FolderAgentReq) (any, error) {
// 1. 创建工具集
toolList := []tools.Tool{
&tool.CreateFolderTool{UserId: userId},
}
// 2. 创建LLM实例
llm, err := initGemini()
if err != nil {
log.ErrorContext(ctx, "Failed to create LLM: %v", err)
return nil, err
}
// 3. 创建Conversational Agent
agent := agents.NewConversationalAgent(
llm,
toolList,
agents.WithCallbacksHandler(callbacks.LogHandler{}),
)
// 4. 创建执行器并设置详细日志和最大迭代次数
// 使用WithVerbose(true)确保打印思考过程
executor := agents.NewExecutor(
agent,
agents.WithMaxIterations(50),
//agents.WithVerbose(true), // 启用详细日志,记录思考过程
)
// 5. 执行agent并记录完整过程
startTime := time.Now()
log.InfoContext(ctx, "开始执行Agent,用户查询: %s", req.Query)
result, err := executor.Call(ctx, map[string]any{
"input": req.Query,
})
return result, nil
}
- 核心载体:
agents.NewConversationalAgent(llm, toolList)创建的 ReAct Agent,是实现该模式的核心组件,内置了 “思考 - 行动 - 观察” 的循环逻辑; - 思考环节:LLM根据任务描述和工具描述,自主判断调用工具的顺序和参数;
- 行动环节:Agent 通过工具接口调用GetAssetByUserIdTool和AddAssetToFolderTool,执行具体查询操作;
- 观察环节:工具返回的用户ID获取用户的资产反馈给 Agent,融入上下文;
- 迭代闭环:Agent 根据观察结果继续推理,直到完成所有任务步骤,最终生成总结结果;
- 可追溯性:callbacks.LogHandler{} 开启后,打印的日志完整呈现了 ReAct 的每一步流程,便于观察规划过程。
提示链与规划的核心区别
| 对比维度 | 提示链(Prompt Chaining) | 规划(Planning) |
|---|---|---|
| 核心目标 | 标准化流转,通过预设步骤确保每一步输出合规 | 目标导向,通过灵活适配确保最终任务达成 |
| 灵活性与适应性 | 高度静态,步骤固定,无法应对意外变化 | 高度动态,可增删/修改步骤,适配环境变化 |
| 步骤来源与性质 | 人工预设的固定序列,无需Agent自主推理 | Agent自主推理的动态序列,按需拆解子任务 |
| 智能水平与决策能力 | 无自主决策,仅作为“提示执行者” | 具备强推理决策,作为“任务决策者” |
| 应对不确定性的能力 | 无法处理意外,上一步偏差会导致后续持续出错 | 可通过反馈闭环修正偏差,处理复杂不确定性 |
| 典型适用场景 | 流程固定、需求明确的标准化任务(如固定格式报告、数据整理) | 流程复杂、需求灵活的不确定性任务(如行程预订、机器人导航、复杂问题求解) |
两者的本质差异在于是否具备“自主决策与动态适配能力”
工具
与现实世界或外部系统交互。
典型流程:
-
工具定义:向 LLM 描述外部函数或能力,包括函数用途、名称、参数类型及说明。如
-
获取用户文件夹列表。参数为JSON格式,包含: - parentID: 字符串,父文件夹ID(可选,空为根目录) 示例:{"parentID":0}
-
-
LLM 决策:LLM 接收用户请求和可用工具定义,根据理解判断是否需要调用一个或多个工具来完成请求。
-
函数调用生成:如果 LLM 决定使用工具,会生成结构化输出(通常为 JSON),指定要调用的工具名称及参数(从用户请求中提取)。
-
工具执行:智能体框架或编排层拦截结构化输出,识别请求的工具并用提供的参数实际执行外部函数。
-
观察/结果:工具执行的输出或结果返回给智能体。
-
LLM 处理(可选但常见) :LLM 将工具输出作为上下文,用于生成最终回复或决定下一步(可能再次调用工具、反思或直接答复)。
RAG
检索增强生成(RAG, Retrieval-Augmented Generation)让大语言模型(LLM, Large Language Model)从“内置知识”升级为“可挂载外部知识”。逻辑上,它就像给 LLM 挂上一个“外接硬盘”。
传统 LLM 的局限性:
- 知识截止点:模型训练数据有时间限制,无法获取最新信息
- 领域专业性不足:对特定领域的深度知识掌握有限
- 可追溯性差 尤其在医疗,法律等场景生成内容需要指明出处。
- 个性化缺失:无法基于用户的个人知识库进行回答
流程
召回
召回大致分为三类:文本召回,向量召回,规则召回。
文本召回
返回与query分词后结果相匹配的内容。
例子
| doc id | ||
|---|---|---|
| 1 | 设置文件夹置顶或取消置顶的方式xxxx |
Query : 如何设置文件夹置顶
【设置】和【设置】 【置顶】与【置顶】相匹配,最终召回docid为1的结果。
向量召回
将query和候选数据转化为统一维度的向量,再通过相似度计算找到与查询向量最相似的 Top-N 个候选向量,最终返回对应的原始数据。
例子
| doc id | ||
|---|---|---|
| 1 | 设置文件夹置顶或取消置顶的方式xxxx |
Query : 如何配置文件夹到头部
【设置】和【配置】 【到头部】和【置顶】的向量相似度极高可以召回doc id 为1的结果。
规则召回
基于某些规则,配置对应的query满足相应规则的时候所召回的内容。
LLM 输出配置
记忆
短期记忆(上下文记忆)
保存当前正在处理或最近访问的信息
func main() {
// 1. 初始化 LLM
llm, err := initGemini()
if err != nil {
log.Fatalf("初始化 LLM 失败:%v", err)
}
ctx := context.Background()
c := chains.NewConversation(llm, memory.NewConversationBuffer())
_, err = chains.Run(ctx, c, "Hi! I'm canshu")
fmt.Println(err)
if err != nil {
log.Fatal(err)
}
res, err := chains.Run(ctx, c, "What is my name?")
fmt.Println(res, err)
}
Your name is canshu! You just introduced yourself to me at the very beginning of our conversation.
长期记忆(持久记忆)
作为智能体需要在多次交互、任务或较长周期内保留信息的仓库,类似于长期知识库
学习与进化
Agent、分为“先天知识”(LLM训练数据+初始Prompt注入)和“后天知识”(新经验提炼的增量知识),知识层面的学习核心是增量更新与高效复用。
增量知识提炼与向量知识库更新
这是最常用的落地方式,无需微调LLM,通过“经验结构化→向量入库→检索复用”实现知识积累。
- 步骤1:从执行日志/反馈中提炼结构化知识(如“上海冬季雨天建议携带防水鞋”“航班查询MCP需传入身份证号后6位”);
- 步骤2:将结构化知识转化为向量嵌入(通过LLM Embedding模型,如text-embedding-ada-002);
- 步骤3:将向量数据写入向量数据库,更新知识库;
- 步骤4:后续任务执行时,通过语义检索从知识库中调取相关知识,补充到LLM上下文,辅助决策。
示例:天气查询Agent从历史反馈中学习并更新知识:
- 原始经验:用户反馈“上次建议携带雨伞,但上海冬季雨天还需要保暖”;
- 提炼知识:“上海冬季雨天出行建议:携带折叠伞+防水鞋+薄羽绒服(气温通常10℃以下)”;
- 向量入库:将该知识嵌入后存入Chroma;
- 后续复用:当用户查询“上海12月雨天出行建议”时,Agent检索到该知识,直接整合到回答中。
实时上下文
针对临时经验(如一次性任务的特殊规则),无需入库,直接将历史经验作为上下文注入后续任务的Prompt中,实现快速适配。
- 工具调用异常反馈:当MCP调用失败(如参数错误、接口超时),Agent自动记录错误信息,并在本轮任务中调整参数或更换工具(如“重新格式化参数后再次调用”“切换备用天气MCP”);
- 用户实时反馈:当用户指出错误(如“日期查询错误”),Agent立即修正,并将该错误案例记录为经验,避免后续重复犯错。
强化学习(RL)驱动策略优化
将Agent的行为转化为“决策序列”,通过奖励函数评估行为优劣,迭代优化策略网络:
- 状态空间:当前任务目标、上下文信息、已执行步骤;
- 动作空间:工具调用、步骤调整、参数选择;
- 奖励函数:任务成功率、执行步数(效率)、结果质量(用户满意度)、资源消耗(如工具调用次数);
- 优化过程:Agent执行行为后,根据奖励值更新策略网络,后续更倾向于选择高奖励行为(如“少步骤完成天气查询”“避免无效工具调用”)。
示例:Agent初期可能先查天气再查日期(冗余步骤),通过奖励函数(“执行步数越少奖励越高”),逐步优化为“先查日期(推导明天日期)再查天气”,提升效率。
行为日志挖掘与规则提炼
通过批量分析历史执行日志,提炼可复用的行为规则,更新Agent的决策模板或Prompt约束:
- 成功案例挖掘:总结“高成功率任务”的共同执行流程,形成标准化策略(如“行程规划任务必选:先确认用户时间→查询交通→预订酒店→反馈备选方案”);
- 失败案例纠错:定位高频错误(如“天气MCP调用参数格式错误”),提炼规避规则(如“调用weather_tool必须严格按照‘城市 YYYY-MM-DD’格式输入”),写入Prompt或工具调用校验逻辑;
- 规则更新:将提炼的规则同步到Agent的决策体系(如通过框架的Prompt模板更新、工具校验函数升级)。
工具/MCP适配的自适应调整
当外部工具或MCP接口更新时,Agent无需人工修改代码,通过反馈实现自动适配:
- 接口变更感知:通过工具调用异常日志(如“返回字段缺失”“接口地址变更”)感知MCP更新;
- 适配规则学习:从开发者提供的少量更新文档或试错反馈中,提炼新的调用规则(如“新天气MCP需添加token请求头,参数city改为city_code”);
- 动态更新调用逻辑:Agent自动调整工具的参数封装、请求格式,无需重启服务。
推理
智能体系统工程化
golang sdk对比
Go 语言的 AI Agent 开发框架虽不如 Python 生态丰富,以下是当前 Go 生态中主流 AI Agent 框架的详细对比,涵盖核心定位、功能、性能、生态等关键维度。
核心框架概述
LangChain Go(langchaingo)
-
核心定位:LangChain 官方 Go 语言实现,一站式 AI Agent 开发框架,对标 Python 版 LangChain,覆盖 Agent 全生命周期能力。
-
核心功能:
- 支持主流 LLM(OpenAI、Anthropic、Ollama、本地大模型等);
- 完整的 Agent 能力:ReAct/Structured 推理模式、工具调用(HTTP、数据库、自定义工具)、记忆(临时/持久化,如 Redis 存储);
- 完善的 RAG 链路:文档加载(PDF/Markdown/CSV)、文本分割、嵌入模型、向量检索(对接 Pinecone/Chroma/Milvus);
- 链(Chain)编排、Prompt 模板、多 Agent 协作(基础版)。
Google ADK adk.wiki/
-
核心定位:Agent Development Kit (ADK) 是一个灵活且模块化的框架,用于开发和部署 AI 智能体。虽然针对 Gemini 和 Google 生态系统进行了优化,但 ADK 是模型无关的、部署无关的,并且构建为与其他框架兼容。ADK 旨在使智能体开发感觉更像软件开发,让开发人员更容易创建、部署和编排从简单任务到复杂工作流的智能体架构。
-
核心功能:
LlamaIndex Go(llamaindex-go)
-
核心定位:LlamaIndex 官方 Go 实现,主打「数据增强 LLM(RAG)」,Agent 能力为 RAG 场景配套。
-
核心功能:
- 强数据索引能力:向量索引、关键词索引、树形索引等;
- 文档处理:多格式加载、清洗、分割,支持自定义数据连接器;
- 轻量 Agent:基础工具调用、多步推理,聚焦「数据+LLM」的闭环;
- 对接主流向量数据库和嵌入模型。
AgentGo
-
核心定位:Go 原生轻量级 AI Agent 框架,专为 Go 工程化场景设计,强调极简、高性能、易扩展。
-
核心功能:
- 基础 LLM 集成(OpenAI/Ollama 为主);
- 插件化工具调用(支持自定义工具注册);
- 轻量记忆(本地内存/Redis);
- 基于 Go 协程的 Agent 流程编排;
- 本地化部署友好(无冗余依赖)。
GoAI
-
核心定位:Go 轻量 AI 交互库,可扩展为简单 Agent,主打「快速落地」。
-
核心功能:
- LLM API 封装(OpenAI/Gemini/Ollama);
- 基础 Prompt 模板;
- 极简工具调用(无复杂流程);
- 无内置记忆/高级 Agent 逻辑。
Chainforge Go
-
核心定位:侧重 AI 工作流/链编排的 Agent 框架,强调可观测性和可扩展性。
-
核心功能:
- 可视化/代码化链编排;
- 基础工具调用、轻量记忆;
- 可观测性(日志、链路追踪、性能监控);
- 多 LLM 适配和故障重试。
框架对比总表
| 维度 | LangChain Go | LlamaIndex Go | AgentGo | GoAI | Chainforge Go |
|---|---|---|---|---|---|
| 核心定位 | 一站式 Agent 框架 | RAG 核心 Agent 框架 | Go 原生轻量 Agent | 极简 AI 交互库 | 工作流编排 Agent |
| 核心功能 | 全功能(Agent/RAG/工具/记忆) | RAG 强,Agent 基础 | 轻量 Agent+工具调用 | 仅基础 LLM 交互 | 工作流+可观测性 |
| 生态活跃度 | 最高 | 高(RAG 领域) | 中 | 低 | 低 |
| 性能(高并发/轻量) | 优秀 | 优秀(检索优化) | 极致 | 极致 | 中等 |
| 易用性 | 中等 | 高 | 高 | 极高 | 中等 |
| 第三方依赖 | 中等 | 轻量 | 极简 | 无 | 少量 |
| 多 Agent 协作 | 基础支持 | 无 | 无 | 无 | 基础支持 |
| 本地化部署友好度 | 中 | 高 | 极高 | 极高 | 中 |