尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

解析51万行AI Agent源码:从TypeScript工程化到ReAct架构实战

解析51万行AI Agent源码:从TypeScript工程化到ReAct架构实战 1. 项目概述从“51万行源码”说起最近在AI Agent的圈子里一个号称拥有“51万行源码”的项目引起了不小的震动。很多人第一反应是这得是多庞大的一个系统是不是又一个堆砌代码的“巨无霸”但当我真正沉下心来一行行去梳理、去理解这背后的工程架构时我发现这“51万行”背后藏着的远不止是代码量而是一套堪称“工程天花板”的现代AI Agent开发范本。它不是一个简单的脚本集合而是一个完整的、面向生产级的、由TypeScript和React Ink等技术栈构建的复杂系统。这个项目之所以能被称为“天花板”核心在于它完整地呈现了一个顶级AI Agent从核心推理逻辑到外围基础设施再到交互界面的全栈工程化实践。它回答了许多开发者心中的疑问一个真正可用的、健壮的、可扩展的AI Agent应该长什么样它如何处理复杂的任务规划如何管理海量的工具Skills如何保证系统的稳定性和可观测性以及如何让开发者能够高效地与之交互和调试这51万行代码就像一张精密的地图为我们描绘了通往成熟AI Agent产品的必经之路。无论你是想学习TypeScript在复杂系统中的应用还是想深入理解AI Agent的架构设计这个项目都是一个不可多得的“富矿”。2. 核心架构拆解Harness、Agent、Skill与LLM的四层世界要理解这个庞大的系统我们必须先建立起清晰的架构认知。整个项目的核心可以抽象为一个四层架构模型这并非简单的堆叠而是职责分明的解耦设计。2.1 基础设施层Harness系统的“骨架”与“神经系统”Harness这个词用得极为精妙直译为“马具”引申为“ harness the power of...”驾驭...的力量。在这一层它指的就是包裹在AI Agent核心逻辑之外的一整套基础设施。Harness层不负责代替Agent进行思考或决策它的核心使命是提供稳定、可靠、可观测的运行环境与服务支撑。你可以把它想象成航天飞机的发射架和地面指挥中心。航天飞机Agent负责执行太空任务推理与行动但离开发射架环境配置、资源管理、燃料供应模型调用、上下文管理、遥测数据日志、监控和指挥指令流程控制它根本无法升空更别提完成任务。这个项目中的Harness层具体承担了以下关键职责生命周期管理负责Agent的启动、初始化、运行状态监控和优雅关闭。上下文管理与持久化高效地管理对话历史、工具调用记录、中间状态并可能提供向量数据库等存储后端确保Agent拥有“记忆”。工具Skill的注册、发现与路由作为一个中央仓库管理所有可用的工具。当Agent决定调用某个工具时Harness负责找到正确的工具实例并安全地执行它。外部资源集成统一管理对各类API如天气、数据库、搜索引擎、第三方服务以及文件系统的访问提供认证、重试、熔断等机制。可观测性Observability集成完整的日志记录结构化日志、指标收集Metrics和分布式追踪Tracing让系统的每一步运行都清晰可见便于调试和性能分析。配置与秘钥管理集中化地管理模型API密钥、服务端点、超时参数等所有配置避免硬编码提升安全性。注意很多初学者搭建的Agent原型会把这些逻辑和核心推理代码混杂在一起导致代码迅速变得臃肿且难以维护。这个项目通过Harness层将它们清晰地剥离是工程成熟度的重要标志。2.2 智能体层Agent系统的“大脑”与“决策中心”这是整个系统的核心是体现“智能”的地方。Agent层接收来自用户或上游系统的目标Goal并利用LLM进行任务分解、规划、执行与反思。在这一项目中Agent的实现绝非一个简单的prompt LLM call而是一个复杂的状态机或工作流引擎。其核心工作流通常遵循经典的“规划-执行-观察-反思”Plan-Act-Observe-Reflect循环或更复杂的ReActReasoning and Acting模式任务解析与规划Agent首先理解用户的终极目标并将其分解为一系列可执行的子任务Sub-tasks。例如目标“帮我分析上季度销售数据并生成报告”可能被分解为“获取销售数据”、“清洗数据”、“按产品线聚合”、“生成可视化图表”、“撰写分析摘要”等步骤。工具选择与调用针对每个子任务Agent需要从Harness层管理的工具库Skills中选择最合适的一个或多个工具。这通常通过让LLM根据工具的描述Function Calling的Schema或描述文本来做决策。执行与观察Agent通过Harness调用选中的工具并获取执行结果Observation。这个结果可能是成功的数据、错误信息或部分结果。反思与迭代Agent根据观察结果判断当前子任务是否完成目标是否推进。如果遇到错误或结果不理想它会进行反思Reflection调整计划或重试然后进入下一个循环。这个项目的Agent层很可能实现了多种Agent类型比如专注于顺序任务的工作流Agent、能够并行处理任务的Swarm Agent、或是具备长期记忆的自主Agent。2.3 技能层Skill/工具层系统的“手”与“工具箱”Skill是Agent能力的具体延伸。每一个Skill都对应一个Agent可以调用的具体功能比如“搜索网络”、“查询数据库”、“发送邮件”、“执行代码”、“操作文件”等。在这个大型项目中Skill的数量可能非常庞大并且被精心地组织和管理。一个设计良好的Skill通常包含清晰的接口定义使用TypeScript接口或类似OpenAI Function Calling的JSON Schema进行严格定义包括名称、描述、参数列表类型、说明、是否必需和返回值类型。独立的实现逻辑Skill的实现代码是独立的只关注如何完成自己的特定功能不关心Agent的整体状态。例如一个“发送邮件”的Skill只负责连接SMTP服务器、组装邮件内容并发送。错误处理与安全性Skill内部需要有完善的错误处理并将错误信息以结构化的方式返回给Agent。同时对于危险操作如文件删除、系统命令执行必须有严格的安全边界和权限检查。可测试性每个Skill都应该易于进行单元测试和集成测试。项目的“51万行代码”中有相当一部分就来自于这些丰富、健壮、可复用的Skill实现。它们被模块化地组织可能按照领域如data/,web/,system/或功能进行分类。2.4 大语言模型层LLM系统的“思维引擎”LLM是驱动Agent进行推理和决策的“燃料”。在这一层项目工程化的重点不在于训练模型而在于如何高效、稳定、经济地“使用”模型。这包括多模型抽象与路由定义统一的LLM调用接口背后可以接入OpenAI GPT系列、Anthropic Claude、开源模型通过Llama.cpp或vLLM等。系统可以根据任务类型、成本、性能要求智能地选择模型Model Routing。提示词Prompt工程与管理将复杂的提示词模板化、模块化。不同的Agent角色、不同的任务阶段使用不同的提示词模板。这些模板可能被存储在外部文件或配置中心便于管理和A/B测试。上下文长度优化实现高效的上下文窗口管理如自动总结长对话历史、优先保留关键信息等策略以在有限的Token窗口内传递最有效的信息。流式响应与异步处理支持LLM输出的流式传输以提供更快的用户体验。同时对于长耗时任务需要完善的异步调用和回调机制。这四层架构环环相扣Harness为Agent提供舞台Agent驱动Skill完成任务LLM为整个过程注入智能。理解这个分层是读懂这51万行源码的关键。3. 技术栈深度解析TypeScript与React Ink的工程化实践这个项目选择TypeScript作为主力语言并用React Ink构建命令行界面CLI这本身就是极具代表性的现代Node.js全栈工程化选择。3.1 为什么是TypeScript类型安全与大型项目治理在51万行代码的尺度上JavaScript的动态类型特性会成为维护的噩梦。TypeScript的静态类型系统是驾驭如此庞大规模代码库的“缰绳”。接口Interface与类型Type定义整个系统的核心契约从Harness的配置项、Agent的状态、Skill的输入输出到LLM的请求响应全部由严格的TypeScript类型来定义。这相当于为整个系统绘制了一份精确的“图纸”任何不符合图纸的拼装错误的函数调用、参数传递都会在编译阶段被立即发现而不是在运行时崩溃。例如定义一个WeatherSkill的调用参数类型能确保Agent永远不会错误地传递一个城市ID而不是城市名。模块化与命名空间项目必然采用了高度模块化的组织方式。使用ES Modules或特定的模块解析策略将Harness、Agent、Skills以及各种工具类utils、常量constants清晰地分隔在不同的目录和文件中。TypeScript的namespace或module机制可以帮助管理全局类型避免命名冲突。高级类型技巧的应用为了构建灵活的Agent系统开发者很可能大量使用了泛型Generics、条件类型Conditional Types、映射类型Mapped Types等高级特性。例如一个通用的executeSkillT extends SkillSchema函数可以根据传入的Skill Schema自动推断出参数和返回值的类型。与现代工具链的完美集成TypeScript与VS Code的深度集成提供了无与伦比的开发体验——代码自动补全、智能跳转、实时错误提示。同时它与ESLint、Prettier、Jest等代码质量、格式化和测试工具链也能无缝结合保障了大型团队的协作效率。实操心得在阅读这类大型TS项目时不要一上来就钻到具体的函数实现里。先找到项目的types/或interfaces/目录或者查看主要的index.ts文件中的导出类型。理解了核心的数据结构和接口就像拿到了地图再去看具体的实现代码就会豁然开朗。3.2 React Ink为AI Agent打造沉浸式命令行界面传统的CLI是线性的、静态的。而AI Agent的运行过程是动态的、有状态的、充满交互的。React Ink这个库允许开发者使用React的声明式范式来构建丰富的命令行界面这为AI Agent的交互带来了革命性变化。组件化开发CLI开发者可以将终端界面拆分为一个个组件例如AgentStatusBar、ConversationHistoryView、ToolCallLog、StreamingOutput等。每个组件管理自己的状态和渲染逻辑代码组织清晰复用性强。动态与交互式体验可以轻松实现实时流式输出将LLM逐词生成的结果流畅地显示在终端而不是一次性打印一大段文字。状态可视化用进度条、旋转指示器、颜色变化来展示Agent的“思考中”、“调用工具中”、“成功/失败”等状态。丰富的布局支持分栏、边框、滚动区域可以同时展示对话、工具调用树、系统日志等多个面板。交互式控件在Agent运行过程中或结束后提供选择列表、输入框、确认按钮等让用户可以与运行中的Agent进行交互例如选择下一步行动、确认某个操作等。状态管理可以集成像Zustand或Redux这样的状态管理库虽然React Ink本身可能不直接依赖来管理复杂的CLI应用状态如当前会话数据、历史记录、UI主题等。在这个项目中React Ink构建的CLI不仅是用户的操作入口更是一个强大的调试和监控仪表盘。开发者可以实时看到Agent内部的思维链Chain of Thought、工具调用的详细参数和结果、以及系统的性能指标这极大降低了复杂Agent系统的调试门槛。4. 从零到一核心模块的实操构建指南理解了宏观架构我们来动手搭建一个简化版的核心模块感受一下顶级工程实践的细节。4.1 定义核心类型与接口TypeScript基石首先在src/types/core.ts中定义我们系统的基石类型// 工具Skill的定义契约 export interface SkillSchema { name: string; description: string; parameters: Recordstring, { type: string | number | boolean | object; description: string; required?: boolean; }; } // 工具调用的请求体 export interface ToolCall { id: string; skillName: string; arguments: Recordstring, any; } // 工具调用的结果 export interface ToolResult { callId: string; success: boolean; output?: any; error?: string; } // Agent的思维状态 export interface AgentThought { step: number; reasoning: string; // 推理过程 action: ToolCall | null; // 计划执行的动作 observation: string | null; // 执行后的观察 } // Agent的完整状态 export interface AgentState { goal: string; thoughts: AgentThought[]; currentStep: number; isComplete: boolean; result?: any; }这些类型定义就像乐高积木的说明书确保了后续所有模块都能严丝合缝地拼接在一起。4.2 实现一个简单的Harness层接下来在src/harness/index.ts中实现一个最小化的Harness。它主要负责工具注册和调用import { SkillSchema, ToolCall, ToolResult } from ../types/core; export class SkillHarness { private skillRegistry: Mapstring, { schema: SkillSchema; executor: Function } new Map(); // 注册工具 registerSkill(schema: SkillSchema, executor: (...args: any[]) any): void { if (this.skillRegistry.has(schema.name)) { throw new Error(Skill ${schema.name} is already registered.); } // 这里可以添加schema验证逻辑 this.skillRegistry.set(schema.name, { schema, executor }); } // 列出所有可用工具 listSkills(): SkillSchema[] { return Array.from(this.skillRegistry.values()).map(v v.schema); } // 执行工具调用 async executeToolCall(call: ToolCall): PromiseToolResult { const skill this.skillRegistry.get(call.skillName); if (!skill) { return { callId: call.id, success: false, error: Skill ${call.skillName} not found., }; } try { // 在实际项目中这里会有更严格的参数校验和类型转换 const output await skill.executor(call.arguments); return { callId: call.id, success: true, output, }; } catch (error: any) { return { callId: call.id, success: false, error: error.message || Unknown error occurred during skill execution., }; } } }这个Harness虽然简单但已经具备了核心的注册、发现和执行功能。在生产级项目中它会扩展出配置管理、依赖注入、生命周期钩子、复杂的错误处理和重试逻辑等。4.3 构建一个ReAct模式的智能体Agent现在在src/agent/reactAgent.ts中实现一个遵循ReAct推理-行动循环的Agentimport { LLMClient } from ../llm/client; // 假设的LLM客户端 import { SkillHarness } from ../harness; import { AgentState, AgentThought, ToolCall } from ../types/core; export class ReActAgent { private llm: LLMClient; private harness: SkillHarness; private state: AgentState; constructor(llm: LLMClient, harness: SkillHarness, initialGoal: string) { this.llm llm; this.harness harness; this.state { goal: initialGoal, thoughts: [], currentStep: 0, isComplete: false, }; } async run(): PromiseAgentState { console.log(Starting Agent with goal: ${this.state.goal}); while (!this.state.isComplete) { const currentThought await this.think(); // 1. 思考/推理 this.state.thoughts.push(currentThought); this.state.currentStep; if (currentThought.action) { const result await this.act(currentThought.action); // 2. 行动 // 将观察结果更新到上一步的思考中 this.state.thoughts[this.state.thoughts.length - 1].observation result.success ? JSON.stringify(result.output) : Error: ${result.error}; // 3. 根据结果判断是否继续或完成 // 这里可以加入更复杂的逻辑比如让LLM判断目标是否达成 if (result.success this.isGoalAchieved(result.output)) { this.state.isComplete true; this.state.result result.output; } // 如果失败Agent会在下一轮think中尝试反思和调整 } else { // 如果没有行动可能是推理得出结论或目标无法达成 this.state.isComplete true; } } console.log(Agent finished. Final result: ${JSON.stringify(this.state.result)}); return this.state; } private async think(): PromiseAgentThought { // 构建给LLM的提示词包含目标、历史思考、可用工具列表 const prompt this.buildReasoningPrompt(); // 调用LLM期望返回一个结构化的JSON包含reasoning和action const llmResponse await this.llm.generateStructuredOutput(prompt, { reasoning: string, action: { skillName: string, arguments: object } // 简化结构 }); return { step: this.state.currentStep 1, reasoning: llmResponse.reasoning, action: llmResponse.action ? { id: call_${Date.now()}, skillName: llmResponse.action.skillName, arguments: llmResponse.action.arguments, } : null, observation: null, }; } private async act(toolCall: ToolCall): Promiseany { console.log([Action] Executing ${toolCall.skillName} with args:, toolCall.arguments); return await this.harness.executeToolCall(toolCall); } private buildReasoningPrompt(): string { const skills this.harness.listSkills(); const skillDescriptions skills.map(s - ${s.name}: ${s.description}. Args: ${JSON.stringify(s.parameters)} ).join(\n); const thoughtHistory this.state.thoughts.map(t Step ${t.step}: Thought: ${t.reasoning} ${t.observation ? - Observed: ${t.observation} : } ).join(\n); return You are a helpful AI Assistant. Your goal is: ${this.state.goal} You have access to the following tools: ${skillDescriptions} Your previous steps: ${thoughtHistory || None} Now, think step by step. Output a JSON with two keys: 1. reasoning: Your detailed reasoning about what to do next. 2. action: If you need to use a tool, provide an object with skillName and arguments. Otherwise, set it to null. Current goal: ${this.state.goal} ; } private isGoalAchieved(output: any): boolean { // 这是一个非常简单的判断逻辑。实际项目中这里可能很复杂 // 甚至需要再次调用LLM来判断目标是否已达成。 // 例如如果目标是“获取天气”那么成功调用天气工具并返回结果就算达成。 return output ! undefined output ! null; } }这个Agent实现了一个最基础的ReAct循环。在实际的51万行项目中Agent的逻辑会复杂得多可能包含多轮反思、子目标分解、并行任务处理、从失败中学习等高级机制。4.4 创建并注册具体的技能Skill最后我们创建几个具体的Skill。在src/skills/weatherSkill.ts中import { SkillSchema } from ../types/core; export const weatherSkillSchema: SkillSchema { name: get_weather, description: Get the current weather for a given city., parameters: { city: { type: string, description: The name of the city, e.g., London or New York., required: true, }, unit: { type: string, description: The unit of temperature, celsius or fahrenheit. Default is celsius., required: false, } } }; export async function executeWeatherSkill(args: { city: string; unit?: string }): Promisestring { const { city, unit celsius } args; // 模拟一个API调用 console.log([Weather Skill] Fetching weather for ${city} in ${unit}...); await new Promise(resolve setTimeout(resolve, 500)); // 模拟网络延迟 // 模拟返回结果 const temp Math.floor(Math.random() * 30) 10; // 10-40度 const conditions [Sunny, Cloudy, Rainy, Partly Cloudy]; const condition conditions[Math.floor(Math.random() * conditions.length)]; return The current weather in ${city} is ${condition} with a temperature of ${temp}°${unit celsius ? C : F}.; }类似地可以创建calculatorSkill.ts、webSearchSkill.ts等。然后在应用入口将它们注册到Harness中。5. 工程化进阶大型AI Agent项目的关键实践当我们把核心模块搭建起来后要将其发展为“51万行”级别的项目还需要以下关键的工程化实践。5.1 配置管理与环境隔离一个生产级系统有大量配置不同环境的API端点、模型密钥、超时时间、日志级别等。绝对不能硬编码在代码里。通常会使用像dotenv加载环境变量并结合配置管理库如convict进行验证和类型化。分层配置default.json-production.json-环境变量覆盖。确保开发、测试、生产环境隔离。秘钥安全使用AWS Secrets Manager、HashiCorp Vault或至少是加密的配置文件来管理API密钥等敏感信息。特性开关Feature Flags允许在不部署代码的情况下动态启用或禁用某些功能或Skill便于进行灰度发布和A/B测试。5.2 测试策略从单元测试到集成测试对于AI系统测试尤其具有挑战性因为LLM的输出具有不确定性。策略需要分层Skill单元测试这是最确定的部分。测试每个Skill在给定输入下是否产生预期的输出。使用Jest或Mocha。Harness集成测试测试工具注册、发现和调用流程是否正确。Agent的“模糊”测试由于LLM的随机性不能测试Agent输出的确切字符串。而是测试结构化输出确保Agent返回的JSON符合预定义的Schema。工具调用序列给定一个目标Agent是否调用了预期的工具序列不关心具体参数值端到端E2E测试模拟用户输入运行完整的Agent流程断言最终结果如生成的文件、发送的邮件是否符合预期。这类测试运行慢且不稳定主要用于关键路径。使用Mock LLM在测试中用一个确定性的Mock客户端替换真实的LLM调用返回预设的响应。这是保证测试稳定性的关键。5.3 可观测性Observability与调试这是区分玩具项目和生产系统的分水岭。一个复杂的Agent在运行时内部状态千变万化必须有强大的观测手段。结构化日志使用Winston或Pino等日志库记录INFO、DEBUG、WARN、ERROR等级别的日志。每条日志都应包含请求ID、Agent会话ID、当前步骤等上下文信息方便追踪单个请求的全链路。指标Metrics收集关键指标如每秒请求数RPS、Agent平均完成时间、各Skill调用耗时/成功率、LLM调用Token消耗/成本、错误率等。使用Prometheus客户端暴露指标并用Grafana展示。分布式追踪Tracing集成OpenTelemetry。一个用户请求从进入CLI到Agent思考再到调用多个外部服务LLM API、天气API等整个过程形成一个追踪链路。你可以清晰地看到时间消耗在每个环节快速定位性能瓶颈。思维链Chain of Thought持久化将Agent每一步的reasoning、action、observation都存储下来例如存入数据库或Elasticsearch。这不仅是调试的利器更是后续进行效果分析、提示词优化的宝贵数据。5.4 性能优化与成本控制当Agent被大规模使用时性能和成本成为核心关切。LLM调用优化缓存对相似的LLM提示词和结果进行缓存可以大幅减少重复调用和成本。特别是对于知识性、事实性的查询。批处理如果可能将多个独立的推理请求批量发送给LLM API。模型路由根据任务复杂度将简单任务路由到更小、更快的模型如GPT-3.5-Turbo复杂任务才使用大模型如GPT-4。上下文管理自动总结当对话历史过长时自动触发一个LLM调用将旧的历史总结成一段精简的文字释放Token窗口。关键信息提取只将最相关的历史信息放入上下文而不是全部对话。异步与并发对于可以并行执行的子任务利用Promise.all或工作队列进行并发处理显著减少总体运行时间。6. 常见问题与实战排坑指南在开发和运行此类复杂Agent系统的过程中你会遇到无数坑。以下是一些典型问题及解决思路问题现象可能原因排查步骤与解决方案Agent陷入死循环1. LLM的推理逻辑出现循环。2. 工具调用失败但Agent未正确处理反复重试同一错误动作。3. 目标达成条件isGoalAchieved判断有误。1.检查日志查看每一步的reasoning和observation找到循环点。2.设置最大步数在Agent循环中强制加入maxSteps限制超过后自动终止并报错。3.改进提示词在给LLM的提示词中明确强调“避免重复步骤”和“如果多次尝试失败请总结原因并停止”。4.增强错误处理确保工具调用失败后将清晰的错误信息反馈给LLM引导其改变策略。工具调用参数错误1. LLM生成的参数不符合Skill Schema定义的类型或约束。2. Skill Schema的描述不够清晰导致LLM误解。1.强化Schema验证在Harness调用Skill前增加一层严格的参数校验类型不符时直接返回友好错误。2.优化Skill描述用更精确、无歧义的自然语言描述Skill的功能和每个参数。例如将“location”改为“city name in English, like ‘San Francisco’”。3.使用Few-Shot示例在提示词中给LLM提供1-2个正确调用该工具的示例。LLM响应格式不符合预期要求LLM返回JSON但它返回了纯文本或格式错误的JSON。1.使用结构化输出优先利用LLM API本身的结构化输出功能如OpenAI的response_format。2.后处理与重试在代码中捕获JSON解析错误尝试修复常见格式问题如缺失引号或提取JSON部分。如果失败将错误信息和原始响应再次发送给LLM要求其纠正。系统运行缓慢1. 顺序执行的工具调用过多。2. LLM响应慢或网络延迟高。3. 某个Skill本身是性能瓶颈。1.分析追踪数据使用OpenTelemetry追踪找出耗时最长的环节。2.引入并发分析任务依赖关系对独立的子任务进行并行处理。3.实施缓存对LLM响应和外部API结果进行缓存。4.设置超时与熔断为每个LLM调用和Skill调用设置合理的超时并实现熔断机制防止一个慢速服务拖垮整个系统。记忆上下文混乱长对话后Agent忘记早期的重要信息或上下文Token耗尽。1.实现记忆摘要定期如每10轮对话或当Token接近上限时触发一个摘要任务将之前的对话浓缩成一段关键要点。2.向量化记忆存储将历史对话片段转换为向量存入向量数据库如Pinecone、Chroma。当需要回忆时进行相似度搜索找回最相关的记忆片段而非全部历史。安全性问题Agent被诱导执行危险工具如删除文件、访问内部API。1.Skill权限分级为Skill标记危险等级如safe,dangerous,internal。2.用户确认对于高危险操作在CLI中弹出交互式确认或在流程中设计人工审核环节。3.沙箱环境对于执行代码、访问shell等极高风险Skill必须在严格的沙箱环境如Docker容器中运行。最后再分享一个小技巧在开发初期不要急于追求复杂的Agent逻辑。先用一个极其简单的“硬编码”Agent比如固定调用某几个工具的顺序把整个Harness、Skill、CLI的流程跑通。然后再用LLM驱动的规划器替换掉硬编码的部分。这种“由硬到软”的迭代方式能帮你快速搭建起可运行的系统骨架并隔离问题——如果系统不工作你很快就能知道是基础设施的问题还是Agent逻辑的问题。这比一开始就试图构建一个完全自主的智能体要高效和稳妥得多。
返回列表