尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Agent开发实战:基于千问模型构建本地智能体

Agent开发实战:基于千问模型构建本地智能体 前千问负责人林俊旸创办新公司的消息让 Agent 再次成为大模型行业的热门话题。与之前“卷模型参数、卷榜单分数”的阶段不同这一轮创业者把方向对准了真实业务落地。对我们开发者来说Agent 已经不只是论文里的概念而是值得系统掌握的一整套工程能力。这篇文章会从 Agent 的基本概念讲起拆解 Agent 开发的核心技术点并用千问模型完成一个可运行的本地 Agent 项目最后整理部署和开发过程中常见问题。不管是刚开始接触 Agent 的新手还是已经在做相关项目的开发同学都可以按文章思路走一遍。1. 从一条行业消息说起Agent 正在成为大模型落地的主战场最近有一则行业消息很受关注前千问大模型负责人林俊旸离职创业新公司方向直指 Agent并且有媒体报道腾讯参与了跟投。虽然产品和融资的具体细节还处在早期披露阶段但这个信号已经足够明显大模型行业正在从“模型能力竞赛”切换到“智能体应用落地”阶段。过去两年我们在实践中的感受是大模型 API 调用本身并不难难的是怎么让它稳定地完成一个真实业务任务。比如让模型查天气、查库存、订会议室听起来简单但真正落地时会遇到工具调用格式不稳定、上下文管理混乱、多步任务执行中断、模型响应超时等问题。这些问题靠“调 Prompt”解决不了必须有系统化的 Agent 工程方案。因此这篇文章不只是介绍新闻事件更想结合 Agent 开发的实际经验把下面几个问题讲清楚Agent 到底是什么和普通的对话机器人有什么区别。Agent 开发涉及哪些核心技术比如工具调用、记忆、任务规划、安全和多 Agent 协作。如何基于千问模型搭建一个本地可运行的 Agent 项目。本地部署、模型推理、框架集成过程中常见报错如何排查。从 Demo 到生产环境Agent 工程化应该注意什么。对开发者来说掌握 Agent 开发不只是赶热点而是下一阶段大模型应用开发的必要技能。下面先从概念说起。2. Agent 是什么从“会对话”到“会干活”2.1 Agent 的通俗定义Agent中文常翻译为“智能体”。通俗地说它不是一个聊天窗口而是一个能理解目标、拆解步骤、调用工具、最终完成任务的自动执行系统。举个例子普通聊天机器人你问它“明天上午十点的会议帮我订个会议室”它大概率只能回复一段建议文字。但一个完整的 Agent 会先解析你的意图知道要订会议室。查询日历找到明天上午十点对应的日期和空余情况。调用会议室预订接口选择合适的会议室。预订成功后在日历中生成日程。最后告诉你预订结果。这个过程涉及意图理解、任务规划、工具调用、结果验证是一套“感知 → 决策 → 行动”的闭环。Agent 的价值就在于把大模型从“内容生成器”升级为“任务执行器”。2.2 Agent、Chatbot、Workflow、RAG 的区别很多开发者容易把 Agent 和几个相邻概念混在一起这里做一个简单区分概念核心特点典型场景Chatbot聊天机器人以多轮对话为主不主动调用外部工具客服问答、闲聊RAG检索增强生成先检索知识库再把检索结果交给模型生成企业知识库问答Workflow工作流固定步骤、固定流程由代码控制流转定时任务、审批流程Agent智能体模型自主决策根据任务动态选择步骤和工具自动运维、数据分析、业务自动化关键区别在于Workflow 的流程是人写死的Agent 的路径是模型根据目标动态生成的。所以在实际项目中很多团队会采用“Workflow Agent”的混合架构核心流程固定用 Workflow需要灵活处理的分支交给 Agent。2.3 Agent 的常见业务形态从目前的落地情况来看Agent 常见形态包括个人助理型处理日程、邮件、文档调用日历和邮箱接口。数据分析型连接数据库根据自然语言生成 SQL执行查询并生成图表。运维自动化型读取监控指标、分析日志、执行故障排查脚本。客服工单型理解用户诉求查询订单系统自动回复或升级人工。多 Agent 协作型多个 Agent 分别负责信息收集、方案设计、执行校验通过消息机制协作。理解了 Agent 的定位下面进入技术层面看看 Agent 开发到底涉及哪些核心组件。3. Agent 开发的核心技术拆解3.1 大模型底座在线 API 与本地部署的取舍Agent 的大脑是大模型。当前开发 Agent首先面临一个选择使用在线 API 还是本地部署模型。在线 API 的代表包括千问的 DashScope API、OpenAI 等。优点是模型能力强、开箱即用、不需要自己维护 GPU 资源适合快速验证原型。例如千问的 qwen-plus、qwen-max 等模型在工具调用和中文理解上表现都比较稳定很多 Agent 项目直接通过 OpenAI 兼容接口调用。本地部署的代表工具包括 Ollama、LM Studio、llama.cpp 等。优点在于数据不出内网、调用成本可控、可离线运行。常见做法是把千问开源系列模型如 Qwen2.5用 GGUF 格式量化后交给 Ollama 或 LM Studio 加载运行。从实践看推荐这样分配原型验证阶段使用在线 API优先保证效果。生产环境隐私敏感场景使用本地部署模型或采用 API 本地兜底的混合方案。边缘设备场景使用量化后的小模型例如在 RK3588 这类边缘开发板上跑 1.5B-7B 量级的模型。下面是一个调用千问在线 API 的最小示例注意要把 API Key 换成自己的from openai import OpenAI client OpenAI( api_keysk-你的API-KEY, base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 ) response client.chat.completions.create( modelqwen-plus, messages[ {role: user, content: 你好请介绍一下你自己} ] ) print(response.choices[0].message.content)这个示例虽然简单但它验证了 Agent 开发需要的第一项能力与大模型建立稳定连接。3.2 工具调用让模型拥有行动能力Agent 区别于普通对话的关键点在于工具调用也就是 Function Calling / Tool Use。简单理解就是模型不直接执行操作而是输出“我想调用哪个函数、参数是什么”然后由我们的代码去真正执行最后把执行结果返回给模型。以千问 API 为例工具调用的基本流程是在请求中声明可用的工具列表。模型根据用户提问决定是否需要调用工具。如果调用模型会返回 tool_calls 字段。我们执行工具把结果作为新的消息返回给模型。模型基于工具结果生成最终回答。下面是一个完整示例from openai import OpenAI client OpenAI( api_keysk-你的API-KEY, base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 ) tools [ { type: function, function: { name: get_weather, description: 获取指定城市的天气信息, parameters: { type: object, properties: { city: { type: string, description: 城市名称 } }, required: [city] } } } ] messages [ {role: user, content: 北京今天天气怎么样} ] response client.chat.completions.create( modelqwen-plus, messagesmessages, toolstools, tool_choiceauto ) print(response.choices[0].message)如果模型认为需要查询天气它会返回类似下面的结果{ tool_calls: [ { id: call_xxx, type: function, function: { name: get_weather, arguments: {\city\: \北京\} } } ] }我们的代码解析这个结果执行真实的天气查询函数再把结果拼接成一条role: tool的消息传给模型模型最终会总结出“北京今天晴气温 10-20℃”这样的回答。这里的重点在于工具描述要写清楚函数用途和参数含义模型才能准确选择。描述模糊模型就容易乱调用。3.3 记忆上下文管理是 Agent 的灵魂Agent 通常需要多轮交互和多步执行这就离不开记忆管理。记忆通常分为短期记忆和长期记忆。短期记忆指当前任务会话中的上下文。在模型接口中我们通过维护 messages 列表来实现短期记忆。需要注意上下文长度限制随着对话变长要么截断早期内容要么做摘要压缩。长期记忆指跨会话保存的信息例如用户偏好、历史操作、领域知识。长期记忆通常用向量数据库实现将关键信息向量化后存入向量库需要时通过相似度检索取回。这里给出一个简单的基于文件的短期记忆管理示例class SimpleMemory: def __init__(self, max_messages20): self.messages [] self.max_messages max_messages def add(self, role, content): self.messages.append({role: role, content: content}) if len(self.messages) self.max_messages: # 简单策略丢弃最早的消息 self.messages self.messages[-self.max_messages:] def get_messages(self): return self.messages生产项目中长期记忆建议使用成熟的向量数据库例如 Milvus、Chroma、pgvector。不要把所有历史都塞进 prompt成本和效果都不理想。3.4 任务规划从单步问答到多步执行复杂任务需要 Agent 具备规划能力。常见的规划策略包括ReAct模型交替执行“思考Reasoning”和“行动Acting”每一步先想清楚再调用工具观察结果后继续。Plan-and-Execute先让模型生成完整计划再逐条执行计划中的步骤。Chain-of-Thought通过提示词引导模型逐步推理适合不需要调用外部工具的纯推理任务。对于大多数工程场景ReAct 是性价比最高的方案。它不需要额外训练只要把“思考过程 工具结果 下一步行动”组织好模型就能完成多步任务。3.5 多 Agent 协作与安全边界当单个 Agent 能力不足或职责分割明显时可以考虑多 Agent 协作。典型模式有领导者-执行者模式一个主 Agent 负责拆解任务多个子 Agent 分别执行。流水线模式上游 Agent 的输出作为下游 Agent 的输入。竞争模式多个 Agent 各自生成方案再投票或评分选出最优。多 Agent 协作不是银弹它带来更复杂的消息传递、任务同步和错误追踪问题。项目初期建议先从一个 Agent 多个工具开始架构稳定后再拆分为多 Agent。安全边界同样重要。Agent 本质上拥有调用工具和操作系统的能力必须遵循最小权限原则工具执行前加入人工审批环节尤其是涉及删除、写入、支付等高风险操作。不让 Agent 直接接触数据库、服务器密码等敏感信息。对工具调用结果做校验防止模型伪造数据。设置调用次数、执行时长和网络访问白名单等限制。4. 完整实战基于千问模型的本地 Agent 项目理论学习之后我们动手做一个本地 Agent 小项目。这个项目使用 Ollama 加载千问模型实现一个能调用“时间查询”和“计算器”工具的 Agent用来演示 Agent 的完整工作流程。4.1 环境准备建议环境如下实际版本以你本机为准操作系统Windows 10/11、macOS、Linux 均可。Python3.9 或以上版本。Ollama用于本地运行大模型。千问模型通过 Ollama 下载例如 qwen2.5:7b。依赖库openai用于 Ollama 的 OpenAI 兼容接口、requests。安装 Ollama 后执行ollama pull qwen2.5:7b ollama serve验证模型是否就绪ollama list如果输出结果中出现qwen2.5:7b说明模型已经下载完成。4.2 项目结构创建项目目录agent-demo/ ├── tools.py ├── agent.py └── requirements.txtrequirements.txt 内容如下openai1.0.0 requests2.31.0安装依赖pip install -r requirements.txt4.3 编写工具在 tools.py 中定义两个工具函数。注意这里计算器使用 eval 仅用于演示生产环境必须换成安全的表达式解析方案。# tools.py import datetime def get_current_time(): 获取当前时间返回字符串 now datetime.datetime.now() return now.strftime(%Y-%m-%d %H:%M:%S) def calculator(expression: str): 计算数学表达式例如 1 2 * 3 try: # 仅用于演示生产环境不要直接使用 eval result eval(expression, {__builtins__: {}}, {}) return f计算结果: {result} except Exception as e: return f计算错误: {e} TOOL_MAP { get_current_time: get_current_time, calculator: calculator } TOOL_SCHEMAS [ { type: function, function: { name: get_current_time, description: 获取当前日期和时间, parameters: { type: object, properties: {}, required: [] } } }, { type: function, function: { name: calculator, description: 计算数学表达式, parameters: { type: object, properties: { expression: { type: string, description: 例如: 1 2 * 3 } }, required: [expression] } } } ]4.4 编写 Agent 主循环在 agent.py 中实现核心逻辑。我们通过 Ollama 的 OpenAI 兼容接口连接千问模型工具调用采用 ReAct 思路模型返回工具调用请求我们执行工具再把结果重新传给模型。# agent.py import json from openai import OpenAI from tools import TOOL_MAP, TOOL_SCHEMAS OLLAMA_BASE_URL http://localhost:11434/v1 MODEL_NAME qwen2.5:7b client OpenAI( base_urlOLLAMA_BASE_URL, api_keyollama # Ollama 兼容接口不校验 key但字段需要非空 ) def run_agent(user_input: str): messages [ {role: system, content: 你是一个智能助手可以调用工具来回答问题。}, {role: user, content: user_input} ] max_rounds 5 for round_index in range(max_rounds): print(f\n[Round {round_index 1}]) response client.chat.completions.create( modelMODEL_NAME, messagesmessages, toolsTOOL_SCHEMAS, tool_choiceauto ) message response.choices[0].message # 如果模型没有要求调用工具直接输出最终答案 if not message.tool_calls: print(Final Answer:, message.content) return # 把模型的响应追加到消息列表 messages.append({ role: assistant, content: message.content or , tool_calls: [ { id: tc.id, type: function, function: { name: tc.function.name, arguments: tc.function.arguments } } for tc in message.tool_calls ] }) # 逐个执行工具 for tc in message.tool_calls: func_name tc.function.name func_args json.loads(tc.function.arguments) print(fCall func: {func_name}, args: {func_args}) if func_name in TOOL_MAP: result TOOL_MAP[func_name](**func_args) else: result f未知工具: {func_name} # 把工具执行结果加入消息列表 messages.append({ role: tool, tool_call_id: tc.id, content: result }) print(达到最大轮次任务结束。) if __name__ __main__: print( 本地 Agent 演示 ) while True: user_input input(\n请输入你的问题输入 exit 退出: ) if user_input.lower() exit: break run_agent(user_input)4.5 运行与验证启动程序python agent.py输入“现在几点了”Agent 会先调用 get_current_time再结合结果回答。输入“计算 25 * 4 10”Agent 会调用 calculator。预期输出类似下面这样 本地 Agent 演示 请输入你的问题输入 exit 退出: 现在几点了 [Round 1] Call func: get_current_time, args: {} [Round 2] Final Answer: 当前时间是 2025-01-18 14:23:05。这个项目虽然简单但已经包含了 Agent 的完整闭环意图理解 → 工具选择 → 执行工具 → 结果返回 → 最终生成回答。后续可以在此基础上扩展更多工具例如天气查询、HTTP 请求、数据库查询等。5. Agent 开发常见问题与排查思路Agent 项目在开发和部署阶段很容易遇到问题。下面整理几个高频问题并结合搜索结果中的关键词给出排查方向。问题现象常见原因解决思路LM Studio 本地千问模型推理很慢模型太大、未启用 GPU、上下文过长使用量化模型开启 GPU 加速调小 num_ctxOllama 千问模型响应慢CPU 推理、模型量化级别过高更换量化级别检查 GPU 显存占用CC Switch 找不到千问大模型模型目录未识别、配置路径不正确检查模型文件格式重新指定模型目录the agent execution provider did not respond in time模型响应超时或工具执行线程阻塞增加超时时间检查网络缩短上下文3090 双卡跑千问大模型显存不足模型参数量超过显存或者并行配置不正确使用量化模型、开启多卡推理、调整加载策略RK3588 部署千问运行缓慢边缘设备算力有限模型过大使用小尺寸量化模型例如 1.5B-3B 级别Hermes Agent 安装失败Python 版本过低、依赖冲突检查 Python 版本使用虚拟环境重试5.1 LM Studio 本地千问模型很慢这是本地部署最常见的痛点。速度慢的原因通常是模型体量大、处理器在跑 CPU 推理、上下文窗口被设置得很大。排查步骤在 LM Studio 中确认是否启用了 GPU 加速如果没有独立显卡CPU 推理慢是正常的。下载 GGUF 量化版本例如 Q4_K_M而不是原版 FP16 模型。降低上下文长度例如从 8192 改成 4096。关闭其他占用内存的应用。5.2 “the agent execution provider did not respond in time” 错误这个报错常见于 Agent 框架中意思是 Agent 的执行提供程序没有在限定时间内响应。可能原因包括模型推理时间超过了框架默认的 time-out 时间。工具调用过程中网络请求阻塞。上下文太长导致模型响应变慢。解决思路检查框架的 timeout 配置适当调大。如果使用本地模型优先选择量化级别合适的模型。精简 prompt 和工具描述减少无效 token。5.3 CC Switch 找不到千问大模型CC Switch 这类工具主要用于模型切换和配置管理。找不到千问模型多数是因为模型文件不在它扫描的目录中或者模型格式不被识别。排查方向确认千问模型文件是否已经下载完成。检查模型路径是否被 CC Switch 正确扫描到。GGUF 格式模型要放在指定模型目录下。有时候需要重启工具才能识别新建的模型目录。5.4 本地模型部署的硬件瓶颈如果是 3090 双卡跑 27B 级别模型需要注意显存占用是否超过单卡 24GB。27B 模型需根据量化级别估算显存Q4 量化大约 14-16GBQ8 量化约 27-30GB。双卡推理需要 Tensor Parallel 支持要确认推理框架配置正确。建议先用小模型验证链路再切换到目标模型。对于 RK3588 这类边缘设备推荐使用 CPU 友好的小模型例如 1.5B 或 3B 的量化版本同时注意推理速度和内存带宽限制。6. Agent 开发的工程化最佳实践从 Demo 到生产环境Agent 项目要考虑的问题会成倍增加。下面几条实践建议来自真实项目经验值得提前规划。6.1 不要一开始就自研 Agent 框架目前市面上已经有不少 Agent 框架和编排工具。对于大多数团队建议先使用成熟框架跑通业务再逐步深入定制。框架能帮你处理工具注册、消息循环、上下文管理等大量重复工作把精力集中在业务工具和提示词优化上。如果项目相对简单也可以直接基于 OpenAI 兼容接口自建 Agent 循环就像本文示例那样灵活性更高。6.2 工具设计要稳定、可观测工具是 Agent 与真实世界交互的接口。工具函数命名要清晰描述要具体参数要收敛。一个工具只做一件事。同时要记录每次工具调用的入参、出参、耗时和错误方便定位问题。6.3 上下文管理要分层不要一股脑把所有历史消息都传给模型。建议按策略分层最近的对话记录完整保留。较早的对话做摘要。长期偏好和知识放入向量数据库。每次请求前做相关性过滤。6.4 安全是上线前提Agent 如果需要操作数据库、服务器或支付系统一定要遵守最小权限原则数据库账号只授予必要权限不要使用 DBA 级别账号。高风险操作加人工审批。工具函数做好参数校验和日志审计。Agent 的输出不能直接作为 SQL 或 Shell 命令执行必须在代码层做校验。6.5 成本控制要从 token 开始Agent 的 token 消耗通常比普通对话高很多因为每次工具调用都要把工具描述和中间结果重新传给模型。控制成本的常见方式使用尽量小的可用模型。控制工具描述的紧凑程度。使用缓存减少重复计算。设置单次任务的最大轮次和 token 上限。6.6 建立评测集用数据驱动迭代Agent 项目很容易出现“这次能用下次又不行”的问题。建议为典型业务场景建立评测集每次改动后跑一遍回归测试。评测维度包括任务完成率、工具调用准确率、最终回答相关性、平均轮次和耗时。7. 总结与下一步学习路线这篇文章从林俊旸创办新公司的事件切入梳理了 Agent 开发的完整技术链路。通过手写一个基于千问模型的本地 Agent 项目你应该已经理解了 Agent 的核心原理大模型负责理解和决策工具调用负责与外部系统交互记忆系统负责上下文管理安全机制负责约束 Agent 行为边界。按照下面的路线继续深入会比较顺畅熟练掌握至少一个大模型 API 的调用包括消息格式、角色区分和参数含义。练习 Function Calling把常用业务能力封装成工具。理解 ReAct 等规划策略能够手动实现 Agent 循环。引入向量数据库为 Agent 增加长期记忆。结合实际业务场景设计一个多工具 Agent。研究多 Agent 协作模式关注任务编排和消息通信。最后关注 Agent 安全、评测、成本优化等工程问题。Agent 开发是典型的工程密集型方向没有太多捷径最好的学习方式就是拿一个真实场景做项目在问题中积累经验。如果你在部署、工具调用或模型选型上踩过坑欢迎在评论区一起讨论。
返回列表