如何构建一个简易流程的大模型智能体(agent)?
摘要:下面是一个使用 Rig 构建的简单 Agent 示例。它定义了一个计算工具,并让 Agent 自主决定是否调用它。 为什么不用langChain? 这个问题放到最后说 1 核心代码示例 在 Cargo.toml 中,只需要 rig-core
下面是一个使用 Rig 构建的简单 Agent 示例。它定义了一个计算工具,并让 Agent 自主决定是否调用它。
为什么不用langChain? 这个问题放到最后说
1 核心代码示例
在 Cargo.toml 中,只需要 rig-core 和 tokio。
use rig::{completion::Prompt, providers::openai};
use serde::{Deserialize, Serialize};
// 1. 定义工具的输入参数(强类型,类似 Java 的 DTO)
#[derive(Deserialize, Serialize, JsonSchema)]
struct AddArgs {
x: i32,
y: i32,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::pub_error::Error>> {
// 2. 初始化客户端 (这里以 OpenAI 为例,也支持 Gemini/Claude)
let client = openai::Client::from_env();
// 3. 定义一个工具 (Tool)
// 在 Rust 里,工具就是一个带有元数据的函数
let add_tool = rig::tool::Tool::new(
"add",
"Adds two numbers together",
|args: AddArgs| async move {
Ok(args.x + args.y)
},
);
// 4. 构建 Agent (典型的 Builder 模式)
let agent = client
.agent("gpt-4o")
.preamble("你是一个精通数学的助手。")
.tool(add_tool) // 注册工具
.build();
// 5. 提示并运行
let response = agent.prompt("请问 123 加上 456 等于多少?").await?;
println!("Agent 回复: {}", response);
Ok(())
}
简单不简单
JsonSchema 派生宏: 在 Rust 里,通过 #[derive(JsonSchema)],Rig 会自动生成 LLM 需要的 JSON 描述。这比 Python 里手动写描述字符串要安全得多,修改字段名时编译器会帮你检查。
异步原生 (Tokio):由于 Agent 往往需要等待网络 IO(模型响应、API 调用),Rig 基于 tokio 构建,能完美集成到你的高性能后端服务中。
零碎抽象:Rig 不像 LangChain 那样强迫你学习 Chain、Memory、OutputParser 等几十个概念。它认为 Agent = Model + Prompt + Tools。这种扁平化设计让调试变得非常简单。
2 简易流程
既然第四步请求了gpt为什么第三步还要创建一个函数,难道gpt会使用这个函数吗?
当然!
这是非常关键的一个点,也是 Agent(智能体) 与普通 Chatbot(聊天机器人) 的本质区别。
答案是:GPT 可能会发出了一个“调用指令”。
这里把这个过程拆解为三个阶段(这在 Java 中类似于远程过程调用 RPC 或反射):
1. 宣告能力
在第 4 步 build() 时,Rig 会把第 3 步定义的工具元数据(函数名:add,描述:Adds two numbers together,参数结构:x, y)转换成一个 JSON Schema,并随问题一起发给 GPT。
发送给 GPT 的隐藏信息:
“用户问了:123+456 等于多少?另外,我这有一个工具叫 add(x, y),如果你觉得用得着,可以告诉我。”
2. 逻辑决策
GPT 接收到请求后,它不会直接回答“答案是 579”。它会分析语义,发现自己需要做数学运算,于是它不返回文本,而是返回一个 Function Call 请求。
GPT 返回给 Rig 的信号:
{ "call": "add", "arguments": { "x": 123, "y": 456 } }
3. 本地执行
这时候,Rig 框架(在你的 Rust 程序里)收到了这个信号。
