如何构建一个简易流程的大模型智能体(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 程序里)收到了这个信号。
阅读全文