当前位置: 首页 > news >正文

山东大学项目实训-大数据租房推荐智能体(一)

整体任务

搭建完整的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和Model

export 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): Promise<AgentExecutionResult> { // 初始化智能体记忆 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.jsqmd.com/news/612841/

相关文章:

  • 零基础玩转Fun-ASR:钉钉通义语音识别WebUI保姆级入门指南
  • 【技术解析】Ryujinx模拟器:在PC上完美运行Switch游戏的完整指南
  • 告别本地配置!Core72在线IDE:5分钟打造云端开发环境终极指南
  • Java 25虚拟线程压测全对比:Spring WebFlux vs Virtual Threads vs Project Loom原生方案,谁才是百万QPS终极解?
  • BiliDownloader:B站视频高效下载终极指南
  • SolidWorks软件授权费用结构深度剖析与系统化降本增效方案
  • D3KeyHelper:解放双手的暗黑破坏神3智能辅助工具
  • D3KeyHelper完全指南:从入门到精通的暗黑破坏神3自动化战斗与资源管理
  • “INMS: Memory Sharing for Large Language Model based Agents“ 论文笔记梢
  • 营销自动化数据驱动 - 多源数据 OLAP 架构演进趟
  • 突破ControlNet图像质量瓶颈:3大核心参数优化指南
  • 2026口碑最佳广东祛痘去闭口产品OEM加工/敏感肌修护产品OEM加工横评:十款广东佛山企业实力单品精准测评 - 十大品牌榜
  • 7步实现电脑风扇智能控制:从安装到多场景优化全指南
  • 图片文字提取效率低?Umi-OCR离线工具让文字识别更简单
  • Nunchaku-flux-1-dev从零开始:Ubuntu+Supervisor+Gradio完整部署步骤
  • Ubuntu20.04 软件和更新故障排查与优化指南
  • 城市级低空空域动态管控与“电子围栏”物理安全防御体系:构建未来城市的安全基石(WORD)
  • KKS-HF Patch:为《Koikatsu Sunshine》打造的全能游戏增强解决方案
  • 盘点天津靠谱的纯蒸汽发生器销售商,前十都有谁 - 工业品牌热点
  • 2026年研究生写文献综述的痛苦终结者:AI工具完整攻略,从检索到成稿一站式解决
  • Python每日一练:字符串反转详解与实战
  • 练习4
  • Qwen3-ForcedAligner-0.6B入门教程:双模型架构,本地智能字幕生成工具
  • TP8556N外置 MOS 平均电流型 LED 降压恒流驱动器
  • ArkUI Stage模型企业级实用教程
  • 批量修改文件属性时间使用说明:固定时间、随机时间、时间偏移三种模式怎么选
  • 鸿蒙实战手记-离线语音识别:从零构建一个会议速记助手
  • 胡桃讲编程|从代码跨入音乐:调音,本质就是另一种编程!(MIDI 核心概念篇)
  • 虚拟线程泄漏比传统线程更隐蔽?深度解析Loom监控盲区、Arthas增强诊断脚本及3类必查堆栈模式
  • 期刊论文发表不用愁!PaperXie 智能写作,四步搞定投稿难题