跳到主要内容

代理

代理通过允许语言模型根据用户输入动态选择使用哪些工具来实现自主行为。与预设的链不同,代理可以在实时决策中决定其行动。

核心概念

一个代理系统包括以下几个关键组件:

  • 代理:负责选择要使用的工具
  • 工具:代理可以调用的功能/API
  • 执行器:管理代理的执行循环和工具调用
  • 内存:维护代理交互中的对话上下文

代理的工作原理

  1. 接收输入:代理接收到用户查询或任务
  2. 规划行动:代理分析输入并决定使用哪些工具
  3. 执行工具:代理以适当的参数调用选定的工具
  4. 处理结果:代理评估工具的输出
  5. 决定下一步:代理确定是否需要更多操作,或者任务已完成
  6. 响应:代理向用户提供最终回复

代理类型

MRKL 代理(ReAct)

使用推理和行动模式,在思考做什么和采取行动之间交替进行。

OpenAI 函数代理

利用OpenAI的函数调用功能实现更结构化的工具使用和参数传递。

对话代理

专为多轮对话设计,维护上下文并在执行任务时使用工具。

计划与执行代理

首先创建一个操作计划,然后系统地执行每一步。

可用工具

LangChainGo 提供了多个内置工具:

  • 计算器:进行数学计算
  • 网络搜索:在网络上查找信息
  • 文件操作:读取、写入和修改文件
  • 数据库查询:执行数据库操作
  • API 调用:向外部服务发出HTTP请求
  • 自定义工具:为特定使用场景创建自己的工具

构建代理

基本代理设置

// 创建工具
tools := []tools.Tool{
tools.Calculator{},
tools.WebSearch{APIKey: "your-api-key"},
}

// 创建代理
agent := agents.NewOneShotAgent(llm, tools)

// 创建执行器
executor := agents.NewExecutor(agent)

// 执行
result, err := executor.Call(ctx, map[string]any{
"input": "25 * 4 是多少,今天天气怎么样?",
})

自定义工具

type CustomTool struct{}

func (c CustomTool) Name() string {
return "custom_tool"
}

func (c CustomTool) Description() string {
return "执行自定义操作"
}

func (c CustomTool) Call(ctx context.Context, input string) (string, error) {
// 在这里编写您的自定义逻辑
return "工具结果", nil
}

最佳实践

  1. 工具选择:选择互补的工具,覆盖使用场景
  2. 提示工程:设计清晰的工具描述和代理提示
  3. 错误恢复:实现工具失败时的备用策略
  4. 资源管理:设置超时和限制工具执行的时间
  5. 安全性:验证工具输入并清理输出
  6. 监控:跟踪代理性能和决策质量

代理组件