
通义千问1.5-1.8B-Chat-GPTQ-Int4实战基于Agent架构的自动化任务编排你是不是也遇到过这种情况老板突然让你“整理一下最近AI领域的热点新闻下班前给我个总结”或者自己想做研究需要“搜集几个开源大模型的评测数据做个对比表格”。这些任务听起来简单但做起来却要打开一堆网页复制粘贴再整理归纳费时费力。如果有个“智能小助手”能听懂你的复杂指令自动帮你把活干了是不是就轻松多了今天我们就来聊聊怎么用一个小巧但聪明的模型——通义千问1.5-1.8B-Chat的量化版本来打造这样一个能自己“思考”和“行动”的AI Agent智能体让它帮你自动完成任务。这个Agent的核心思想很简单它不再是一个只会一问一答的聊天机器人而是一个能理解你的复杂目标自己规划步骤、调用工具比如搜索网页、读写文件最终把结果交给你的“小管家”。我们这次就用一个具体的例子——“搜集最近三天AI领域的新闻并总结”来手把手带你看看它是怎么工作的。1. 为什么需要AI Agent从聊天到“做事”的跨越传统的对话模型比如我们常见的聊天机器人模式是“你问一句它答一句”。它的能力边界基本就框定在它被训练时学到的知识里。你问它“太阳为什么东升西落”它能给你一个很好的解释。但你如果让它“去网上查查今天北京的天气然后告诉我该穿什么衣服”它就无能为力了因为它没有“手”去打开浏览器查询天气网站。AI Agent就是为了解决这个“有脑无手”的问题而生的。你可以把它想象成一个有了“身体”的大脑。这个“大脑”大语言模型负责理解你的意图、规划步骤、做决策而“身体”各种工具和API则负责执行具体的动作比如搜索、计算、操作文件。一个典型的Agent工作流程可以概括为“思考-行动-观察”的循环思考根据你的指令和当前已知信息决定下一步该做什么。行动选择并调用一个合适的工具比如“执行网络搜索”。观察获取工具执行后的结果比如搜索到的网页内容。带着新的观察结果回到第1步继续“思考”直到任务完成。这个模式在学术上有个挺有名的框架叫ReAct (Reasoning Acting)它强调让模型在输出最终答案前先把它的推理链Reasoning和要执行的动作Acting写出来这样不仅能提升任务完成的准确性也让整个过程变得可解释、可调试。那么为什么选择通义千问1.5-1.8B-Chat并且还是GPTQ-Int4量化版呢原因很实在足够聪明1.8B参数在轻量级模型中属于“优等生”理解复杂指令和规划任务的能力已经不错。身材小巧经过GPTQ-Int4量化后模型体积和内存占用大幅减少对硬件极其友好普通家用电脑都能轻松跑起来部署成本低。对话优化这个Chat版本是针对对话场景微调的更擅长理解人类的自然语言指令这正是Agent所需要的“大脑”。接下来我们就看看怎么把这个小巧的“大脑”组装成一个能干的“小管家”。2. 搭建你的第一个AI Agent系统要构建一个Agent我们需要准备三样东西一个会思考的模型大脑、一套它能用的工具双手、以及一个管理它们如何协作的框架工作流程。我们一步步来。2.1 环境与模型准备首先我们把核心“大脑”请出来。通义千问1.5-1.8B-Chat-GPTQ-Int4模型在很多开源模型社区都能找到加载起来非常方便。这里我们用流行的transformers库和auto-gptq库来加载它。# 安装必要的库 pip install transformers torch auto-gptq# 加载量化模型和分词器 from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline model_name Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4 # 示例模型路径请根据实际仓库调整 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained( model_name, device_mapauto, # 自动分配设备CPU/GPU trust_remote_codeTrue ) # 创建一个文本生成的管道 chat_pipeline pipeline( text-generation, modelmodel, tokenizertokenizer, max_new_tokens512 )这样我们的模型就准备好了。你可以简单测试一下它的基础对话能力。2.2 给Agent装上“双手”定义工具一个只会空想的Agent是没用的我们必须赋予它行动的能力。我们来定义几个在“搜集新闻并总结”这个任务中可能用到的简单工具。在实际项目中这些工具可以连接真实的搜索引擎API、数据库等。# 模拟的工具函数库 class AgentTools: 一个简单的工具集合 staticmethod def search_web(query: str): 模拟网络搜索功能实际应接入SerpAPI、Google Search API等 # 这里为了演示返回模拟数据 print(f[工具调用] 正在搜索: {query}) mock_results [ {title: 大模型价格战升级某厂商宣布API价格下调50%, snippet: 近日国内AI公司..., source: 科技新闻网, date: 2024-05-18}, {title: 轻量级模型成为边缘AI新宠, snippet: 随着终端设备算力提升..., source: AI产业观察, date: 2024-05-17}, {title: 多模态AI应用在内容创作领域爆发, snippet: 从文生图到文生视频..., source: 创新媒体, date: 2024-05-16} ] # 过滤一下模拟“最近三天”的结果 filtered_results [r for r in mock_results if r[date] 2024-05-16] return filtered_results staticmethod def extract_key_info(articles): 从搜索结果中提取关键信息标题、核心内容 print(f[工具调用] 正在从{len(articles)}篇文章中提取信息) extracted [] for article in articles: extracted.append({ 标题: article[title], 核心内容: article[snippet], 来源: article[source] }) return extracted staticmethod def write_summary(bullet_points): 根据要点撰写一段总结性文字 print(f[工具调用] 正在撰写总结) # 这里可以调用模型来生成更流畅的总结我们简单拼接一下 summary 近日AI领域主要动态如下\n \n.join([f- {point} for point in bullet_points]) return summary staticmethod def save_to_file(content, filenamenews_summary.txt): 将结果保存到文件 print(f[工具调用] 正在保存结果到 {filename}) with open(filename, w, encodingutf-8) as f: f.write(content) return f内容已成功保存至 {filename}有了这些工具函数我们的Agent就有了可以调用的“手”。下一步是告诉Agent在什么情况下该用哪只手。2.3 设计Agent的“工作流”ReAct模式实践现在我们来设计Agent的核心逻辑。我们将实现一个简化版的ReAct循环。关键点在于我们要求模型在回复时遵循一个固定的格式明确写出它的“思考”和下一步“动作”。def run_agent_react(user_query, max_steps10): 运行一个基于ReAct思路的简单Agent # 系统提示告诉模型它是个Agent以及该如何工作 system_prompt 你是一个AI助手能够通过调用工具来完成用户的任务。请严格按照以下格式回应 思考[你的推理过程分析当前情况决定下一步做什么] 行动工具名(参数) 观察[工具返回的结果] 当你认为任务已经完成最终答案应该给用户时请使用 最终答案[给用户的最终回复] # 工具描述告诉模型它有哪些工具可用 tools_description 你可用的工具 1. search_web(query): 根据查询词进行网络搜索返回相关文章列表。 2. extract_key_info(articles): 从文章列表中提取关键信息标题、核心内容。 3. write_summary(bullet_points): 根据要点列表撰写一段连贯的总结。 4. save_to_file(content, filename): 将文本内容保存到指定文件。 # 初始化对话历史和上下文 full_context system_prompt \n tools_description \n\n用户请求 user_query \n\n history [] for step in range(max_steps): print(f\n 步骤 {step1} ) # 1. 让模型“思考”并决定“行动” prompt full_context \n.join(history) \n思考 response chat_pipeline(prompt, max_new_tokens200)[0][generated_text] # 从响应中提取“思考”和“行动”部分这里需要简单的文本解析 # 这是一个简化的解析实际应用需要更健壮的解析器 lines response.split(\n) thought action for line in lines: if line.startswith(思考): thought line[3:].strip() elif line.startswith(行动): # 提取 工具名(参数) action_line line[3:].strip() # 简单解析出工具名和参数 import re match re.match(r(\w)\(([^)]*)\), action_line) if match: tool_name match.group(1) tool_param match.group(2).strip(\\) # 去掉可能的引号 action (tool_name, tool_param) print(f思考: {thought}) if action: print(f行动: 调用 {action[0]}, 参数: {action[1]}) # 2. 执行“行动”调用工具 observation if action: tool_name, param action try: if tool_name search_web: result AgentTools.search_web(param) observation f搜索到{len(result)}条相关结果。 elif tool_name extract_key_info: # 这里需要从历史中获取articles参数演示中我们简化处理 # 实际应该维护一个状态机或更复杂的上下文 print((演示中假设提取了信息)) observation 关键信息已提取完毕。 elif tool_name write_summary: print((演示中假设撰写了总结)) observation 总结已撰写完成。 elif tool_name save_to_file: print((演示中假设保存了文件)) observation 文件已保存。 else: observation f错误未知工具 {tool_name}。 except Exception as e: observation f工具调用出错{e} else: # 如果没有行动检查是否是最终答案 for line in lines: if line.startswith(最终答案): final_answer line[5:].strip() print(f\n任务完成最终答案\n{final_answer}) return final_answer observation 未识别出有效行动指令。 print(f观察: {observation}) # 3. 将本轮“思考-行动-观察”加入历史进入下一轮循环 history.append(f思考{thought}) if action: history.append(f行动{action[0]}({action[1]})) history.append(f观察{observation}) # 防止无限循环 if step max_steps - 1: print(达到最大步数任务可能未完成。) break return None # 运行Agent试试看 if __name__ __main__: user_task 搜集最近三天AI领域的新闻并总结然后保存到文件里。 run_agent_react(user_task)运行上面的代码你会在控制台看到类似这样的输出具体内容因模型随机性可能不同 步骤 1 思考用户需要最近三天AI领域的新闻。我需要先搜索相关信息。 行动调用 search_web, 参数最近三天 AI 领域 新闻 观察搜索到3条相关结果。 步骤 2 思考我已经有了新闻列表现在需要从这些结果中提取出关键信息以便后续总结。 行动调用 extract_key_info, 参数上一步的搜索结果 观察关键信息已提取完毕。 步骤 3 思考关键信息已经提取出来了现在我需要根据这些要点撰写一段连贯的总结文字。 行动调用 write_summary, 参数提取出的关键要点列表 观察总结已撰写完成。 步骤 4 思考总结已经写好了用户要求保存到文件里。我需要调用保存文件的工具。 行动调用 save_to_file, 参数撰写好的总结内容, news_summary.txt 观察文件已保存。 步骤 5 思考所有步骤都已完成。搜索、提取、总结、保存文件的任务都已经执行完毕。现在可以给用户最终答复了。 最终答案已完成您的要求。我已搜索了最近三天AI领域的新闻提取了关键信息并撰写了一份总结内容已保存至“news_summary.txt”文件中。主要新闻涉及大模型市场价格动态、轻量级模型发展趋势以及多模态AI应用等内容。看这个Agent就像一个有条不紊的项目经理自己把任务拆解拆成搜索、提取、总结、保存然后一步步调用工具去完成最后向你汇报。整个过程是透明的你能看到它的“思考”过程。3. 让Agent更实用优化与扩展思路上面的例子是一个最基础的演示。要打造一个真正实用的Agent我们还需要考虑更多。3.1 工具描述的优化在给模型的系统提示中我们对工具的描述可以更详细、更结构化这样模型才能更准确地理解何时该调用哪个工具。例如使用类似以下格式tools_description_detailed 你拥有以下工具请仔细阅读描述决定是否使用 - 名称search_web 描述此工具用于在互联网上搜索最新信息。当你需要获取实时、非模型训练数据内的信息时使用它。 参数query (字符串类型)一个明确的搜索关键词。 返回一个包含标题、摘要、来源和日期的文章列表。 - 名称extract_key_info 描述此工具用于从一堆文本如文章列表中提炼出最核心的要素如事件、观点、数据等。 参数text_list (列表类型)一个包含文本对象的列表。 返回一个结构化或简化后的信息列表。 ... 3.2 引入“记忆”与状态管理我们的简单例子中工具之间的参数传递比如把search_web的结果传给extract_key_info是靠“想象”的。现实中我们需要一个状态管理机制。可以维护一个全局的working_memory字典或者使用更高级的框架如LangChain来管理对话历史和工具执行结果确保信息能在不同的步骤间正确传递。3.3 处理复杂任务与错误一个健壮的Agent需要能处理意外情况。比如工具调用失败网络搜索API超时了怎么办我们应该在“观察”中反馈这个错误并让模型决定是重试还是换种方法。任务分解不清用户说“帮我分析一下公司的销售数据并预测下季度趋势”。这个任务可能需要先调用read_database工具再调用data_analysis工具最后调用generate_report工具。模型需要具备更强的复杂任务分解能力。验证结果在给出最终答案前是否可以增加一个self_check自我检查步骤让模型评估当前结果是否已满足用户要求4. 总结与展望通过这个实战项目我们看到了如何将一个轻量级的对话模型通义千问1.5-1.8B-Chat-GPTQ-Int4从一个“知识库”升级为一个“行动派”。核心在于引入了ReAct这类“思考-行动”框架并为其配备了可调用的工具函数。这使得AI能够突破自身知识库的局限真正与外部世界互动完成从信息查询到内容生成再到文件处理的一系列自动化任务。这种基于Agent的架构其想象空间非常大。你可以根据不同的场景为它装备不同的“工具套装”个人效率助手集成日历安排会议、邮件发送摘要、文档整理笔记工具。数据分析Agent集成数据库查询、Python计算、图表生成工具自动完成数据提取、分析和可视化报告。客服工单处理Agent集成用户数据库、知识库搜索、工单系统API自动回答常见问题或生成初步处理意见。当然我们今天的实现还比较基础。工业级的Agent系统会涉及更复杂的规划算法如Chain of Thought, Tree of Thoughts、更可靠的工具调用解析、以及长期记忆管理等。但万变不离其宗其核心思想依然是让大语言模型担任“指挥官”和“决策者”协调一系列专业化“工具”来共同完成复杂目标。用通义千问这样的小模型来入门实践Agent架构成本低、速度快非常适合学习和原型验证。当你摸清了其中的门道完全可以迁移到更强大的模型上去构建更智能、更可靠的自动化工作流。不妨就从今天这个能帮你“搜新闻”的小助手开始动手试试吧。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。