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

从0到1构建奶牛行为智能监控系统(七)基于langchain的智能体构建

前面已经在服务器实现了基于vllm的qwen大模型部署,目标检测、身份识别、行为识别服务部署,数据库服务也搭建起来了,这期就介绍使用langchain构建智能体,将服务封装为工具供大模型调用

一、langchain介绍与安装

langchain智能体开发框架的内部封装好了很多智能体开发工具,可以有效降低开发复杂度。

本项目使用了langchain v0.3版本,安装方式参考官网:LangChain 中文教程 | LangChain 中文文档

二、智能体构建

2.1.大模型初始化

配置智能体所使用的大模型,这里就是我们前面部署的qwen3.5-9b模型,使用vllm部署的适配openai调用方式

def _create_llm(self) -> ChatOpenAI: return ChatOpenAI( model=self.config.llm.model_name, # 模型名称 base_url=self.config.llm.base_url, # API 地址 api_key=self.config.llm.api_key, # 密钥 temperature=self.config.llm.temperature, # 创造性程度 max_tokens=self.config.llm.max_tokens, # 最大输出长度 extra_body={ "chat_template_kwargs": { "enable_thinking": self.config.llm.enable_thinking, } }, )

2.2.定义目标检测、身份识别、行为识别服务工具集

这里将之前部署的服务包装为智能体能够调用的工具

def _create_tools(self) -> list: tools = [] tools.extend(get_detection_tools()) # 目标检测工具 tools.extend(get_behavior_tools()) # 行为分析工具 tools.extend(get_identification_tools()) # 身份识别工具 tools.extend(get_database_tools()) # 数据库查询工具 return tools

以身份识别为例,通过添加@tool修饰器,langchain会自动将方法注册为工具,方法内部使用httpx库进行http请求发送,调用我们前面部署好的各种模型服务

from langchain_core.tools import tool import httpx @tool def identify_cow(topk: int = 5) -> str: """ 根据最近上传的奶牛图像进行个体身份识别。 """ url = f"{IdentificationToolConfig.base_url}/api/identifi/detect" try: # 调用识别服务 response = httpx.post(url, params={"topk": topk}, timeout=60.0) response.raise_for_status() data = response.json() if not data.get("success"): return f"识别失败:{data.get('message', '未知错误')}" # 格式化结果 results = data.get("results", []) if not results: return "未找到匹配的奶牛。" lines = ["奶牛身份识别结果:"] for i, r in enumerate(results, 1): lines.append( f"\n匹配 {i}:ID={r.get('id')}, " f"名称={r.get('name')}, " f"置信度={r.get('confidence')}%" ) return "\n".join(lines) except httpx.ConnectError: return "身份识别服务未启动。" except httpx.TimeoutException: return "请求超时,请稍后重试。" except Exception as exc: return f"识别出错:{exc}"

2.3.提示词构建与智能体构建

这里自行写入提示词,然后使用langchain提供的方法将大模型、工具和提示词连接起来构建成智能体

prompt = ChatPromptTemplate.from_messages([ ("system", self.config.system_prompt), # 系统角色设定 MessagesPlaceholder(variable_name="chat_history"), # 对话历史占位 ("human", "{input}"), # 用户输入 MessagesPlaceholder(variable_name="agent_scratchpad"), # 工具调用痕迹 ]) //智能体构建 agent = create_tool_calling_agent(self.llm, self.tools, prompt)

2.5.主要对话接口

对话调用输入前端传入的用户信息,返回智能体结果

def chat( self, message: str, chat_history: list[BaseMessage] | None = None, ) -> dict[str, Any]: """主聊天接口""" if chat_history is None: chat_history = [] try: result = self.agent_executor.invoke({ "input": message, "chat_history": chat_history, }) return { "success": True, "response": result.get("output", ""), } except Exception as e: return { "success": False, "error": str(e), "response": f"处理请求时发生错误:{str(e)}", }
http://www.rkmt.cn/news/1375436.html

相关文章:

  • WSL2开发环境部署
  • 生物医药合成生物学解决方案(2026版)
  • 【运维必备Linux系统知识】
  • 电场相关(AI回答)
  • Python文本词频分析与词云可视化|全网可复现实战,文本清洗到可视化全流程落地 引入多维度文本预处理,精准提取核心词汇、强化文本特征挖掘、助力舆情分析、学术文本挖掘、企业舆情监测有效落地
  • 基于CNN自编码器的量子态误差缓解:从密度矩阵图像修复到NISQ应用
  • 避坑指南:Linux V4L2采集图像时,为什么你的JPG文件总是打不开?
  • 从lsusb输出到硬件信息库:如何查询Linux中USB设备的厂商和型号
  • 量子机器学习预测误差:从T/N线性关系到紧致界理论突破
  • 网盘备份怎么选:版本控制、保留策略、加密合规与自动化(含对比表)
  • 使用vscode 搭建Java 开发环境
  • Unity 2020.1实战:用UGUI和AudioSource搞定酷狗同款音乐频谱(附完整代码)
  • Go Sidecar 主循环并发化改造:让请求不再排队堵在门口
  • Unity UGUI实战:从零复刻一个带频谱可视化的音乐播放器(附完整源码)
  • 2026年5月上海搬家公司推荐:TOP5排名评测居民搬家防超时收费市场份额选择指南 - 品牌推荐
  • 三阶段机器学习框架:基于Sentinel-2遥感数据精准反演水体叶绿素a浓度
  • Android HTTPS抓包合规方案:从证书信任到Frida调试
  • Java YOLO推理精度漂移终极解决方案:从预处理到后处理的工业级优化指南
  • 基于大语言模型的表位智能设计与筛选:epiGPTope项目解析
  • 基于经典机器学习模型的GitHub代码审查评论情感分析实践
  • 强化学习赋能匹配滤波器:可解释心电R波检测新范式
  • mysql视图和用户管理
  • 基于Nginx的局域网HTTP Yum源搭建
  • Keil uVision开发环境文件类型全解析
  • 布艺沙发怎么洗?美数N20 Steam布艺清洁机,深度清洁就这么简单
  • 告别SteamVR依赖:用Unity 2022 LTS的OpenXR插件直连HTC Vive Cosmos全流程
  • 神经网络在高能物理探测器定时中的应用:从CFD到ANN的精度突破
  • 状态机设计模式优雅的进行通信解包~
  • Transformer模型推理性能实测:PyTorch+A10 GPU与MLX+Apple Silicon对比
  • 从华为EulerOS到openEuler:一个国产操作系统的开源之路与社区生态