山东大学项目实训-大数据租房推荐智能体(一)
整体任务搭建完整的agent框架设计项目结构agent工作流程编写prompt和重试机制约束LLM输出实现多轮对话管理让agent能够理解当下环境和用户意图编排正确的工具调用顺序。一第一步是设计和构建项目结构使用codex根据项目任务描述参考Claude Code的agent框架构建项目结构得到如下结构house-recommend/├── data/ # 数据目录│ └── mockListings.json # 模拟房源数据├── docs/ # 文档目录│ ├── architecture.md # 架构文档│ └── prompt_templates_v1.md # 提示模板├── src/ # 源代码目录│ ├── agent/ # 智能体相关代码│ ├── config/ # 配置文件│ ├── domain/ # 领域模型│ ├── memory/ # 记忆系统│ ├── runtime/ # 运行时│ ├── tools/ # 工具定义│ └── types/ # 类型定义├── storage/ # 存储目录├── .env.example # 环境变量示例├── package.json # 依赖配置└── tsconfig.json # TypeScript 配置接着开始编写核心agent代码定义智能体类通过.env配置API和Modelexport class ReactRentalAgent { // 定义智能体模型 private readonly model new ChatOpenAI({ apiKey: env.OPENAI_API_KEY, model: env.OPENAI_MODEL, temperature: 0.2, });使用langchain提供的message类搭建短期记忆后面扩展长期记忆import { AIMessage, BaseMessage, HumanMessage, ToolMessage } from langchain/core/messages; export class ConversationMemory { private readonly messages: BaseMessage[] []; // 定义智能体记忆种子方法 // 用于初始化智能体记忆添加用户输入 // param input 用户输入 seed(input: string) { this.messages.push(new HumanMessage(input)); } // 定义智能体记忆添加方法 // 用于添加智能体回复 // param message 智能体回复 // returns 无 appendAssistant(message: AIMessage) { this.messages.push(message); } // 定义智能体记忆添加方法 // 用于添加工具观察 // param observation 工具观察 // returns 无 appendToolObservation(observation: ToolMessage) { this.messages.push(observation); } // 定义智能体记忆获取方法 // 用于获取智能体记忆中的所有消息 // returns 所有消息的数组 getMessages(): BaseMessage[] { return [...this.messages]; } }编写主循环采用Reasoning Acting的方式agent自行判断是否需要调用工具如果需要使用工具则执行对应工具并将结果加入观察中继续循环直到完成工作。通过AGENT_MAX_ITERATIONS限制agent循环次数避免死循环。先直接使用langchain封装好的工具类简化开发。async run(input: string): PromiseAgentExecutionResult { // 初始化智能体记忆 const memory new ConversationMemory(); memory.seed(input); // 定义智能体执行步骤数组 const steps: AgentExecutionResult[steps] []; // 绑定智能体模型到工具 const toolEnabledModel this.model.bindTools(this.tools); // 执行智能体循环 for (let iteration 0; iteration env.AGENT_MAX_ITERATIONS; iteration 1) { // 调用智能体模型 const response (await toolEnabledModel.invoke(this.buildMessages(memory))) as AIMessage; memory.appendAssistant(response); // 如果智能体回复中没有工具调用返回最终结果 if (!response.tool_calls || response.tool_calls.length 0) { return { output: this.getMessageText(response), steps, }; } // 调用工具 for (const toolCall of response.tool_calls) { // 寻找工具 const tool this.tools.find((candidate) candidate.name toolCall.name); if (!tool) { throw new Error(Tool ${toolCall.name} is not registered.); } // 调用工具并存入steps const observation await tool.invoke(toolCall.args); steps.push({ toolName: toolCall.name, observation: typeof observation string ? observation : JSON.stringify(observation), }); // 存入工具观察 memory.appendToolObservation( new ToolMessage({ tool_call_id: toolCall.id ?? toolCall.name, content: typeof observation string ? observation : JSON.stringify(observation), }), ); } } throw new Error(Agent stopped after ${env.AGENT_MAX_ITERATIONS} iterations without a final answer.); }非核心代码省略避免blog过长目前为止完成了整个项目的基本结构搭建分好了各个模块的文件夹为后续扩展开发打下基础。编写了核心主循环和短期记忆通过langchain框架提供的封装类简化了初期代码构建后续可根据情况决定优化langchain或是自己开发更好的模块。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2499443.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!