通义千问1.5-1.8B-Chat-GPTQ-Int4 WebUI 构建智能Agent基于Python的自动化任务规划与执行想象一下你有一个不知疲倦的虚拟助手。你只需要告诉它“帮我查一下最近一周关于‘AI编程工具’的热门文章整理出核心观点并写一份分析报告。” 它就能自己打开浏览器搜索、筛选信息、提取要点最后生成一份结构清晰的文档。这听起来像是科幻电影里的场景但今天我们完全可以用一个轻量级的开源模型配合一些巧妙的代码把它变成现实。这就是智能Agent的魅力。它不再是一个简单的问答机器而是一个能理解你的意图、规划执行步骤、并调用工具完成复杂任务的“智能体”。对于开发者、数据分析师或者内容创作者来说这意味着能将大量重复、繁琐的调研和整理工作自动化把精力真正集中在思考和决策上。本文将带你一起基于通义千问1.5-1.8B-Chat的量化版本GPTQ-Int4通过其WebUI接口动手构建一个具备任务规划与执行能力的Python智能Agent。我们会用一个实际的案例——自动化的网络信息搜集与报告生成——来贯穿整个过程看看这个小模型如何发挥大作用。1. 智能Agent从概念到动手搭建在开始写代码之前我们得先搞明白我们要建的到底是什么。你可以把智能Agent想象成一个有“大脑”和“手脚”的机器人。它的“大脑”就是通义千问模型负责理解你的指令比如“搜集AI编程工具信息”并把它拆解成一系列可执行的子任务比如“第一步搜索关键词第二步过滤结果第三步总结观点”。这个过程叫做任务规划。而它的“手脚”就是我们为它编写的各种工具函数。比如一个用来执行网页搜索的函数一个用来解析网页内容的函数一个用来写Markdown报告的函数。大脑规划好步骤后就会指挥手脚去调用对应的工具。整个系统的核心工作流是这样的你下达指令 → Agent大脑模型分析并生成规划 → 系统执行规划中的第一步 → 将第一步的结果反馈给大脑 → 大脑分析后生成第二步的规划 → 如此循环直到所有任务完成。这个过程中如何让模型“想清楚”再“动手”以及如何设计好用的工具就是我们要解决的关键问题。接下来我们就从环境准备开始。2. 环境准备与通义千问WebUI对接我们的构建基础是通义千问1.5-1.8B-Chat模型的GPTQ-Int4量化版本。选择这个版本主要是因为它对硬件要求非常友好在消费级显卡上就能流畅运行并且通过WebUI提供了标准化的API接口让我们能专注于Agent的逻辑开发而不必深陷于模型部署的细节。首先确保你有一个可以运行该模型WebUI的环境。假设你已经通过CSDN星图镜像广场或其他方式部署好了服务其API接口通常在本地http://localhost:8000或类似地址。我们的Agent将作为一个独立的Python程序通过HTTP请求与这个WebUI进行对话。为此我们需要安装几个必要的库pip install requests python-dotenv这里requests库用于发送HTTP请求调用模型APIpython-dotenv则用来管理配置信息比如API的地址这样更安全也更灵活。接下来我们创建一个基础的模型客户端类。这个类封装了与通义千问WebUI对话的细节# agent_core.py import requests import json from typing import Dict, Any, Optional class QwenClient: 通义千问WebUI API客户端 def __init__(self, base_url: str http://localhost:8000): self.base_url base_url.rstrip(/) self.chat_endpoint f{self.base_url}/v1/chat/completions # 在实际使用中你可能需要添加API密钥等认证信息 self.headers { Content-Type: application/json, # Authorization: fBearer {your_api_key} # 如果需要的话 } def chat(self, prompt: str, history: Optional[list] None) - str: 发送消息到模型并获取回复。 Args: prompt: 本次输入的提示词 history: 对话历史格式为 [{role: user, content: ...}, {role: assistant, content: ...}] Returns: 模型返回的文本内容 messages history or [] messages.append({role: user, content: prompt}) payload { model: Qwen1.5-1.8B-Chat-GPTQ-Int4, # 模型名称需与WebUI配置一致 messages: messages, temperature: 0.1, # 较低的温度使输出更稳定、可预测适合任务规划 max_tokens: 1024 } try: response requests.post(self.chat_endpoint, headersself.headers, jsonpayload, timeout30) response.raise_for_status() result response.json() return result[choices][0][message][content] except requests.exceptions.RequestException as e: return f请求模型API时出错: {e} except (KeyError, json.JSONDecodeError) as e: return f解析模型响应时出错: {e} # 简单测试一下连接 if __name__ __main__: client QwenClient() test_reply client.chat(你好请简单介绍一下你自己。) print(模型回复:, test_reply)运行这个测试脚本如果看到模型返回了自我介绍说明我们的基础通信链路已经打通了。有了这个“大脑”的连接器我们就可以开始为Agent设计“手脚”——也就是各种工具了。3. 设计Agent的“工具箱”让模型学会使用工具一个强大的Agent离不开一套好用的工具。工具的本质是函数它们能完成模型自身做不到的事情比如访问网络、读写文件、进行复杂计算等。我们的目标是让模型能够理解在什么情况下该调用哪个工具。首先我们定义几个在信息搜集场景下最常用的工具# tools.py import requests from bs4 import BeautifulSoup import json import re from typing import List, Dict import markdown2 # 用于生成报告需安装pip install markdown2 class WebSearchTool: 模拟网页搜索工具示例中使用公开的搜索API或静态数据 staticmethod def search_web(query: str, max_results: int 5) - List[Dict]: 根据查询词进行网页搜索返回标题、链接和摘要。 注意此处为示例实际应用中应替换为合规的搜索引擎API如SerpAPI、Google Custom Search等。 print(f[工具调用] 正在搜索: {query}) # 示例这里我们模拟返回一些静态结果真实情况请调用API # 假设我们调用了一个假设的API端点 mock_results [ { title: 2024年最受欢迎的5个AI编程助手, link: https://example.com/article1, snippet: 文章介绍了GitHub Copilot、Amazon CodeWhisperer等工具的核心功能与对比。 }, { title: 如何利用AI提升代码编写效率, link: https://example.com/article2, snippet: 本文从实际开发场景出发探讨了AI结对编程的最佳实践。 }, # ... 更多模拟结果 ] return mock_results[:max_results] class ContentParserTool: 网页内容解析工具 staticmethod def extract_main_content(url: str) - Dict[str, str]: 从给定的URL中提取正文标题和核心内容。 这是一个简化示例真实环境需处理反爬、动态加载等问题。 print(f[工具调用] 正在解析内容: {url}) try: # 注意实际使用中请遵守网站的robots.txt并考虑使用合法合规的爬虫策略 response requests.get(url, timeout10, headers{User-Agent: Mozilla/5.0}) response.raise_for_status() soup BeautifulSoup(response.content, html.parser) # 简单的正文提取通常正文在article或p标签中 title soup.title.string if soup.title else 无标题 # 移除脚本、样式等 for script in soup([script, style]): script.decompose() text soup.get_text() lines (line.strip() for line in text.splitlines()) chunks (phrase.strip() for line in lines for phrase in line.split( )) content .join(chunk for chunk in chunks if chunk) return {title: title, content: content[:2000]} # 截取部分内容 except Exception as e: return {title: 解析失败, content: f获取或解析页面时出错: {e}} class ReportGeneratorTool: 报告生成工具 staticmethod def generate_markdown_report(data: List[Dict], topic: str) - str: 将搜集和分析后的数据整理成Markdown格式的报告。 print(f[工具调用] 正在生成关于{topic}的报告) report f# {topic} 信息分析报告\n\n report f*报告生成时间{json.dumps(data, ensure_asciiFalse, indent2)[:100]}...*\n\n report ## 概述\n report f本次共分析了 {len(data)} 条相关信息。\n\n report ## 关键信息摘要\n for i, item in enumerate(data, 1): report f### {i}. {item.get(title, 无标题)}\n report f- **来源**{item.get(source, 未知)}\n report f- **核心观点**{item.get(summary, item.get(snippet, 暂无摘要))[:150]}...\n\n report ## 总结与趋势\n report 根据以上信息可以观察到当前AI编程工具领域主要聚焦于...此处由模型或规则生成\n return report staticmethod def save_report(report_text: str, filename: str analysis_report.md): 将报告保存为文件 with open(filename, w, encodingutf-8) as f: f.write(report_text) print(f[工具调用] 报告已保存至: {filename}) return filename有了工具下一步是关键如何让模型知道这些工具的存在并学会在合适的时机调用它们这就要靠工具描述和提示词工程了。我们需要用模型能理解的语言清晰地告诉它每个工具是干什么的、怎么用。4. 大脑的“操作手册”用Prompt工程引导任务规划模型本身并不知道我们有WebSearchTool或ContentParserTool。我们需要通过系统提示词System Prompt来赋予它这种认知和能力。一个好的系统提示词就像一份详细的“操作手册”和“工作流程规范”。我们的提示词需要包含以下几个核心部分Agent的身份与能力定义告诉模型它现在是一个智能助手拥有调用工具的能力。工具清单与使用规范清晰列出所有可用的工具包括工具名、功能描述、输入参数和输出格式。规划与执行流程规定模型思考和工作必须遵循的步骤比如先规划、再执行、最后总结。输出格式要求严格要求模型以特定的结构化格式如JSON来回应这样我们的程序才能准确解析它的“想法”。下面是一个针对我们信息搜集Agent的系统提示词示例# prompts.py def get_system_prompt() - str: return 你是一个高级智能任务规划与执行助手Agent。你的核心能力是理解复杂的人类指令将其分解为具体的、可执行的任务步骤并通过调用我为你提供的工具来完成任务。 ## 你可以使用的工具 1. web_search(query: str, max_results: int): 根据查询词进行网页搜索。输入搜索关键词字符串。输出一个包含title(标题)、link(链接)、snippet(摘要)的字典列表。 2. parse_content(url: str): 解析给定URL网页的正文内容。输入网页URL字符串。输出一个包含title(页面标题)和content(正文内容)的字典。 3. generate_report(data: list, topic: str): 根据提供的数据列表和主题生成Markdown格式的分析报告。输入数据列表每项为字典报告主题字符串。输出报告文本字符串。 4. save_report(report_text: str, filename: str): 将报告文本保存到指定文件。输入报告文本文件名。输出保存成功的文件名。 ## 你的工作流程必须严格遵守 1. **理解与分析**仔细理解用户的最终目标。 2. **任务规划**将目标分解为一系列顺序或并行的子任务。每个子任务应明确指定使用哪个工具以及输入参数。 3. **执行与反馈**在脑海中模拟或等待我系统执行你规划的工具调用并接收执行结果。 4. **决策与迭代**根据上一步的结果决定是继续下一个子任务还是需要调整规划。 5. **总结与交付**所有任务完成后整理最终结果如报告文本并告知用户。 ## 你的输出格式必须严格遵守 请始终以以下JSON格式进行回应它代表你的“思考”和“行动指令” json { thought: 你的思考过程分析当前状况和下一步计划。, plan: [子任务1描述, 子任务2描述, ...], action: { tool: 要调用的工具名称如 web_search如果无需调用则设为 null, args: {arg1: value1, arg2: value2} // 工具所需的参数 } }在最终任务完成时action应为null并在thought中提供最终答案。示例用户“帮我找找关于Python异步编程的最新文章。” 你的回应第一次{ thought: 用户需要关于Python异步编程的最新文章。我需要先搜索相关信息然后可能解析有价值的文章内容。第一步是使用web_search工具进行搜索。, plan: [1. 使用web_search搜索‘Python 异步编程 最新文章’。, 2. 从结果中选取2-3个最有价值的链接。, 3. 使用parse_content解析选取的文章内容。, 4. 将解析的内容整理成摘要给用户。], action: { tool: web_search, args: {query: Python 异步编程 最新文章, max_results: 5} } }现在请开始工作。记住逐步思考清晰规划。 这个提示词比较长但至关重要。它明确了规则给出了示例能极大地提高模型输出结构的稳定性和可靠性。接下来我们就要创建Agent的核心循环让模型、提示词和工具协同工作起来。 ## 5. 核心引擎构建任务规划与执行循环 现在我们将大脑QwenClient、工具库和操作手册系统提示词组装起来形成Agent的核心执行循环。这个循环会不断重复“模型思考规划 → 系统执行工具 → 结果反馈给模型”的过程。 python # agent.py import json from qwen_client import QwenClient from tools import WebSearchTool, ContentParserTool, ReportGeneratorTool from prompts import get_system_prompt class TaskPlanningAgent: 任务规划与执行智能体 def __init__(self, model_client: QwenClient): self.client model_client self.system_prompt get_system_prompt() # 工具映射字典将工具名与实际的可调用函数关联起来 self.tools { web_search: WebSearchTool.search_web, parse_content: ContentParserTool.extract_main_content, generate_report: ReportGeneratorTool.generate_markdown_report, save_report: ReportGeneratorTool.save_report, } self.conversation_history [ {role: system, content: self.system_prompt} ] def execute_tool(self, tool_name: str, args: dict): 根据模型指令执行对应的工具 if tool_name not in self.tools: return f错误未知的工具 {tool_name}。 try: tool_func self.tools[tool_name] # 将参数字典展开为关键字参数传入函数 result tool_func(**args) return result except Exception as e: return f调用工具 {tool_name} 时出错: {e} def parse_model_response(self, response_text: str) - dict: 尝试从模型回复中解析出结构化的JSON指令 # 模型可能会在JSON块外添加一些说明文字我们需要提取出 json ... 块内的内容 import re json_match re.search(rjson\n(.*?)\n, response_text, re.DOTALL) if json_match: json_str json_match.group(1) else: # 如果没有代码块尝试直接解析整个响应假设它直接是JSON json_str response_text try: return json.loads(json_str) except json.JSONDecodeError: # 如果解析失败返回一个安全的后备指令 print(f无法解析模型响应为JSON: {response_text[:200]}...) return { thought: 模型返回了非结构化响应。, plan: [], action: None } def run(self, user_query: str, max_steps: int 10): 运行Agent处理用户查询 print(f用户指令: {user_query}) print(*50) # 将用户指令加入对话历史 self.conversation_history.append({role: user, content: user_query}) step 0 final_result None while step max_steps: step 1 print(f\n[步骤 {step}]) # 1. 获取模型响应规划/决策 response_text self.client.chat(, historyself.conversation_history) # Prompt已在历史中 print(f模型原始响应:\n{response_text[:500]}...\n) # 2. 解析响应获取行动指令 instruction self.parse_model_response(response_text) thought instruction.get(thought, ) plan instruction.get(plan, []) action instruction.get(action, {}) print(f模型思考: {thought}) if plan: print(f当前计划: {plan}) # 将模型的响应作为助手发言加入历史维持上下文 self.conversation_history.append({role: assistant, content: response_text}) # 3. 判断是否需要执行工具 tool_to_call action.get(tool) if action else None tool_args action.get(args, {}) if action else {} if not tool_to_call: print(模型未指示调用工具任务可能已完成或需要用户输入。) # 尝试从响应中提取最终答案 final_result thought or response_text break # 4. 执行工具 print(f执行工具: {tool_to_call} 参数: {tool_args}) tool_result self.execute_tool(tool_to_call, tool_args) print(f工具执行结果: {str(tool_result)[:300]}...) # 5. 将工具执行结果作为系统或用户消息反馈给模型继续循环 # 这里我们将结果格式化为一个“系统”或“用户”的观察消息 observation f工具 {tool_to_call} 的执行结果如下\n\n{tool_result}\n self.conversation_history.append({role: user, content: observation}) # 简单防止无限循环 if step max_steps: print(f达到最大步骤数 ({max_steps})停止执行。) final_result 任务执行超时或步骤过多。 break print(\n *50) print(任务执行结束。) return final_result # 主程序一个完整的案例演示 if __name__ __main__: # 初始化 qwen_client QwenClient(http://localhost:8000) # 替换为你的WebUI地址 agent TaskPlanningAgent(qwen_client) # 运行一个复杂任务 user_task 请帮我搜集最近关于‘AI编程助手’的讨论整理出3个主要观点或工具并生成一份简要的Markdown分析报告最后保存为‘ai_coding_tools_report.md’文件。 final_output agent.run(user_task) print(\n最终输出:) print(final_output)这个TaskPlanningAgent类就是整个系统的大脑协调中心。它维护着与模型的对话历史解析模型的每一步决策调用相应的工具并将结果反馈回去形成一个闭环。max_steps参数可以防止任务陷入无限循环。6. 案例实战看Agent如何自动完成信息搜集与报告让我们用一个更具体的例子来看看这个Agent实际跑起来是什么样子。假设我们运行上面的主程序给Agent下达指令“请帮我搜集最近关于‘AI编程助手’的讨论整理出3个主要观点或工具并生成一份简要的Markdown分析报告最后保存为文件。”Agent的执行过程可能会是这样的模拟输出用户指令: 请帮我搜集最近关于‘AI编程助手’的讨论整理出3个主要观点或工具并生成一份简要的Markdown分析报告最后保存为‘ai_coding_tools_report.md’文件。 [步骤 1] 模型思考: 用户需要关于“AI编程助手”的信息并最终生成报告。我需要先搜索相关信息然后解析内容提取关键点最后生成并保存报告。第一步是使用web_search进行搜索。 当前计划: [1. 使用web_search搜索“AI编程助手 最新讨论”。, 2. 从结果中筛选出3个最有价值的链接。, 3. 使用parse_content解析这些链接的内容。, 4. 从解析的内容中提取3个主要观点或工具。, 5. 使用generate_report基于提取的信息生成报告。, 6. 使用save_report将报告保存为文件。] 执行工具: web_search 参数: {query: AI编程助手 最新讨论, max_results: 5} [工具调用] 正在搜索: AI编程助手 最新讨论 工具执行结果: [{title: 2024年开发者最期待的AI编程工具, link: https://example.com/ai-tools-2024, snippet: 讨论了GitHub Copilot... [步骤 2] 模型思考: 搜索完成获得了5条结果。现在需要从中筛选出3个最有价值的链接进行内容解析。我认为前三个结果看起来比较相关。 当前计划: ... (更新计划第二步已完成) 执行工具: parse_content 参数: {url: https://example.com/ai-tools-2024} [工具调用] 正在解析内容: https://example.com/ai-tools-2024 工具执行结果: {title: 2024年开发者最期待的AI编程工具 - Example Tech, content: 文章正文内容...} ... (步骤3、4继续解析其他两个链接并提取信息) [步骤 5] 模型思考: 已经成功从三篇文章中提取了关键信息1. GitHub Copilot在代码补全上的优势。2. Amazon CodeWhisperer对安全性的重视。3. 新兴工具如Cursor的集成开发体验。现在可以调用generate_report来生成报告了。 执行工具: generate_report 参数: {data: [观点1, 观点2, 观点3], topic: AI编程助手主要观点分析} [工具调用] 正在生成关于AI编程助手主要观点分析的报告 工具执行结果: # AI编程助手主要观点分析 信息分析报告... [步骤 6] 模型思考: 报告已生成。最后一步是调用save_report工具将报告内容保存到指定的文件中。 执行工具: save_report 参数: {report_text: # AI编程助手主要观点分析..., filename: ai_coding_tools_report.md} [工具调用] 报告已保存至: ai_coding_tools_report.md 工具执行结果: ai_coding_tools_report.md [步骤 7] 模型思考: 所有任务均已完成。报告已成功生成并保存为‘ai_coding_tools_report.md’。可以向用户交付最终结果了。 模型未指示调用工具任务可能已完成或需要用户输入。 任务执行结束。 最终输出: 任务已完成。我已根据您的要求搜索并分析了关于“AI编程助手”的近期讨论提取了三个主要观点/工具并生成了Markdown分析报告。报告已保存为‘ai_coding_tools_report.md’文件请您查收。通过这个流程我们可以看到Agent成功地将一个复杂的自然语言指令分解为了“搜索 - 筛选 - 解析 - 提取 - 生成报告 - 保存文件”这一系列自动化步骤并最终交付了成果。整个过程无需人工干预展示了智能体在自动化工作流中的巨大潜力。7. 总结构建这个基于通义千问的智能Agent整个过程就像在教一个聪明的实习生如何系统性地工作。我们给了它一个清晰的大脑通过Prompt定义角色和流程一套顺手的工具搜索、解析、生成函数以及一个监督它按步骤行进的循环机制。这个方案的优点在于轻量且灵活。1.8B的量化模型在普通电脑上就能跑起来降低了尝试门槛。整个架构是模块化的你可以很容易地替换大脑换成其他模型API、增加新的工具比如数据库查询、发送邮件、调用其他API或者修改提示词来改变Agent的行为风格让它适应客服、数据分析、内容创作等不同场景。当然这只是一个起点。真实的Agent系统还需要考虑更多比如错误处理与重试机制工具调用失败怎么办、长期记忆与管理如何记住之前的对话和结果、更复杂的规划能力处理并行任务、条件分支等等。但通过这个实践我们已经掌握了构建智能体最核心的范式规划Plan、执行Act、观察Observe的循环。下次当你面对一个需要多步骤、跨工具完成的重复性任务时不妨想想是不是可以设计一个这样的智能助手来帮你完成。从一个小而美的场景开始尝试你会发现让AI自主工作的乐趣和效率提升远超想象。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。