Qwen1.5-1.8B GPTQ智能体Agent开发入门你是不是觉得“智能体”这个词听起来特别高大上感觉是那些大公司才玩得转的东西其实没那么复杂。简单来说智能体就是一个能自己思考、自己动手的AI程序。比如你告诉它“帮我查一下北京的天气然后根据天气推荐一个周末出行计划”它就能自己先去查天气再根据结果给你出主意。听起来很酷对吧但一想到要自己动手实现是不是又觉得头大模型太大跑不动代码太复杂看不懂。别担心今天我们就来聊聊怎么用一个小巧但能干的模型——Qwen1.5-1.8B的GPTQ量化版本来亲手搭建一个属于你自己的智能体。整个过程就像搭积木一步步来你会发现其实挺有意思的。1. 智能体到底是什么我们先从“点外卖”说起在深入代码之前咱们先抛开那些复杂的术语用最生活化的例子来理解智能体。想象一下你想点一份外卖。一个最基础的聊天机器人可能只会根据你的关键词回复“好的已为您推荐附近餐厅。” 这显然不够智能。而一个智能体的工作流程是这样的思考你输入“我想吃披萨预算50块左右”。智能体首先会“想”“用户的核心需求是‘披萨’约束条件是‘预算50元’。要完成这个任务我需要先获取用户位置然后搜索附近的披萨店最后筛选出符合预算的。”行动接着它会调用“获取定位”工具拿到你的位置再用“搜索餐厅”工具去查找附近的披萨店列表。观察工具返回了一堆餐厅信息和价格。智能体“观察”这些结果发现有些店超预算了。再思考再行动它再次“思考”“需要过滤出价格低于50元的店铺并按评分排序。” 于是它调用“数据过滤”和“排序”工具或者直接让模型处理这些信息。最终输出最后它把筛选后的、带有人均价格和评分的两三家店推荐给你并附上一句“这几家都在您预算内评分也不错可以考虑哦。”看到没智能体不再是简单的“输入-输出”而是一个“思考-行动-观察-再思考”的循环。它知道自己能力的边界不会做菜但懂得利用工具搜索、计算来完成任务。这就是智能体的核心让大模型学会使用工具从而解决更复杂的实际问题。我们今天要用的Qwen1.5-1.8B GPTQ模型就是一个经过压缩和优化的“大脑”。它体积小1.8B参数经过GPTQ量化后对硬件要求更低但保留了不错的理解和推理能力非常适合我们入门学习智能体开发。2. 搭建你的智能体开发环境工欲善其事必先利其器。我们先来把“厨房”收拾好。整个过程很简单跟着做就行。2.1 基础环境准备首先确保你的电脑上安装了Python建议3.8以上版本。然后我们创建一个新的项目文件夹并安装最核心的库。打开你的终端命令行依次输入以下命令# 创建一个新的项目目录 mkdir qwen-agent-demo cd qwen-agent-demo # 创建并激活一个Python虚拟环境推荐避免包冲突 python -m venv venv # 在Windows上激活 # venv\Scripts\activate # 在Mac/Linux上激活 # source venv/bin/activate # 安装核心依赖 transformers用于加载模型 torch是深度学习框架 pip install transformers torch acceleratetransformers是Hugging Face出品的库让我们能非常方便地下载和使用各种预训练模型包括我们要用的Qwen。torch是PyTorch当前最主流的深度学习框架之一。accelerate可以帮助我们优化模型加载和推理。2.2 获取并加载Qwen1.5-1.8B GPTQ模型Qwen1.5-1.8B GPTQ模型已经由社区量化好并上传到了Hugging Face模型库。我们不需要自己量化直接下载使用即可。GPTQ量化能显著减少模型占用的显存让我们在消费级显卡甚至CPU上虽然慢点也能运行。下面这段代码就是加载这个模型的核心from transformers import AutoModelForCausalLM, AutoTokenizer import torch # 指定模型名称。这里用的是经过GPTQ量化的Qwen1.5-1.8B版本 model_name Qwen/Qwen1.5-1.8B-GPTQ-Int4 # 加载分词器负责把文字转换成模型能看懂的数字 tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) # 加载模型。device_map“auto”让库自动决定把模型放在GPU还是CPU上 model AutoModelForCausalLM.from_pretrained( model_name, device_mapauto, # 自动分配设备 torch_dtypetorch.float16, # 使用半精度浮点数节省显存 trust_remote_codeTrue ) # 告诉模型我们要开始推理了不是训练 model.eval() print(f模型 {model_name} 加载成功)把这段代码保存为load_model.py并运行。第一次运行时会下载模型文件大约1-2GB需要一点时间请保持网络通畅。下载完成后你会看到成功的提示。小提示如果你没有GPU或者遇到显存不足的情况可以将device_map“auto”改为device_map“cpu”并在加载模型时去掉torch_dtypetorch.float16这个参数。这样模型会在CPU上运行速度会慢一些但肯定能跑起来。3. 打造智能体的核心让模型学会“用工具”模型本身只是一个语言专家它不知道如何查天气、做计算。我们需要教它使用工具。这里我们介绍一个非常经典且直观的框架思路ReActReason Act。ReAct的核心就是让模型生成格式化的文本来指导行动。格式通常像这样Thought: 模型思考下一步该做什么Action: 要调用的工具名称Action Input: 给工具的输入参数然后我们程序会执行这个Action把结果作为Observation返回给模型模型再根据观察进行下一轮思考。3.1 定义几个简单的工具我们先来造两个“工具”一个计算器和一个模拟的天气查询工具。# tools.py import json import random class SimpleTools: 一个简单的工具集合 staticmethod def calculator(expression: str) - str: 一个超级简单的计算器仅用于演示。 注意实际应用中请使用更安全的方法如ast.literal_eval。 try: # 警告这里使用eval仅为了演示生产环境极其危险 # 请勿在实际项目中对不可信输入使用eval。 result eval(expression) return f计算器返回结果: {expression} {result} except Exception as e: return f计算器出错: {e} staticmethod def get_weather(city: str) - str: 模拟天气查询工具 # 模拟一些天气数据 weather_data { 北京: {weather: 晴, temp: 25°C, humidity: 40%}, 上海: {weather: 多云, temp: 28°C, humidity: 65%}, 广州: {weather: 阵雨, temp: 30°C, humidity: 80%}, 深圳: {weather: 晴间多云, temp: 31°C, humidity: 75%}, } city_data weather_data.get(city, None) if city_data: return f{city}的天气是{city_data[weather]}气温{city_data[temp]}湿度{city_data[humidity]}。 else: # 如果城市不在列表中随机生成一个模拟结果 conditions [晴, 多云, 阴, 小雨] return f{city}的天气是{random.choice(conditions)}气温{random.randint(20, 35)}°C。 # 创建一个工具字典方便模型通过名称调用 TOOLS { calculator: SimpleTools.calculator, get_weather: SimpleTools.get_weather, } # 给模型一个工具描述让它知道有哪些工具可用 TOOL_DESCRIPTIONS 你可以使用以下工具 1. calculator: 用于数学计算。输入是一个数学表达式字符串例如 “3 5 * 2”。 2. get_weather: 用于查询城市天气。输入是一个城市名称字符串例如 “北京”。 当你需要使用工具时请严格按照以下格式回复 Thought: 首先我需要思考用户的问题并决定使用哪个工具。 Action: 工具名称 Action Input: 工具的输入内容 我们把工具描述TOOL_DESCRIPTIONS放在这里后面会把它和用户问题一起送给模型相当于给了模型一份“工具说明书”。3.2 实现ReAct推理循环现在我们来编写智能体的“大脑”——负责驱动“思考-行动-观察”循环的引擎。# agent_engine.py from load_model import model, tokenizer # 导入之前加载的模型和分词器 from tools import TOOLS, TOOL_DESCRIPTIONS def run_agent_react(user_query: str, max_steps: int 5): 运行一个简单的ReAct智能体。 参数: user_query: 用户的问题 max_steps: 最大循环步数防止无限循环 # 初始化对话历史和系统提示。系统提示告诉模型它的角色和行为规范。 system_prompt f你是一个有帮助的AI助手可以调用工具来解决问题。{TOOL_DESCRIPTIONS} 如果你认为不需要使用工具就能直接回答用户的问题请直接给出答案。 开始吧 # 将系统提示和用户问题组合成初始对话 messages [ {role: system, content: system_prompt}, {role: user, content: user_query} ] print(f用户: {user_query}) print(- * 40) for step in range(max_steps): # 1. 将当前对话历史转换成模型输入的文本 text tokenizer.apply_chat_template( messages, tokenizeFalse, # 我们不在这里分词让模型生成时再分 add_generation_promptTrue ) # 2. 让模型生成回复思考行动 inputs tokenizer(text, return_tensorspt).to(model.device) # 生成参数最大长度、采样温度控制随机性 outputs model.generate( **inputs, max_new_tokens256, temperature0.1, # 温度设低一点让输出更确定更适合工具调用 do_sampleTrue, ) # 解码模型生成的内容去掉输入部分 full_response tokenizer.decode(outputs[0][inputs[input_ids].shape[1]:], skip_special_tokensTrue) # 3. 解析模型的回复看它是否调用了工具 thought, action, action_input None, None, None # 简单的解析逻辑查找“Thought:”、“Action:”等关键词 lines full_response.strip().split(\n) for line in lines: if line.startswith(Thought:): thought line.replace(Thought:, ).strip() print(f智能体思考: {thought}) elif line.startswith(Action:): action line.replace(Action:, ).strip() elif line.startswith(Action Input:): # Action Input 可能包含换行这里简单处理 action_input line.replace(Action Input:, ).strip() # 4. 情况A模型直接给出了最终答案 if not action: final_answer full_response.strip() print(f智能体最终回答: {final_answer}) print( * 40) return final_answer # 5. 情况B模型要求调用工具 print(f智能体行动: 调用工具 [{action}] 输入: [{action_input}]) if action in TOOLS: # 执行工具 observation TOOLS[action](action_input) print(f工具观察结果: {observation}) # 将“观察”结果添加到对话历史让模型进行下一轮思考 messages.append({role: assistant, content: full_response}) messages.append({role: user, content: fObservation: {observation}}) else: # 如果工具不存在将错误信息作为观察返回 observation f错误: 工具 {action} 不存在。请检查工具名称。 print(f工具观察结果: {observation}) messages.append({role: assistant, content: full_response}) messages.append({role: user, content: fObservation: {observation}}) # 如果循环达到最大步数仍未得出最终答案 print(达到最大步数未得出最终答案。) return 抱歉我无法在限定步骤内解决这个问题。这个run_agent_react函数就是智能体的主循环。它不断地把当前的对话历史和工具描述送给模型。让模型生成回复。解析回复看模型是想直接回答还是想调用工具。如果调用工具就执行工具并把结果作为新的信息喂给模型。重复这个过程直到模型给出最终答案或超过最大步数。4. 让我们来实际运行一下环境、工具、引擎都准备好了是时候点火试车了。我们创建一个主程序来测试几个场景。# main.py from agent_engine import run_agent_react if __name__ __main__: print(启动 Qwen1.5-1.8B GPTQ 智能体演示...) print( * 60) # 测试场景1简单计算需要调用工具 print(\n 测试1: 数学计算) query1 “请计算一下 (15 7) * 3 等于多少” result1 run_agent_react(query1) # 测试场景2查询天气需要调用工具 print(\n 测试2: 天气查询) query2 “上海今天天气怎么样” result2 run_agent_react(query2) # 测试场景3复杂任务可能需要多步推理和工具调用 print(\n 测试3: 复杂任务 - 出行计划) query3 “我想周末去北京玩请先告诉我北京的天气然后根据天气推荐是去故宫还是去颐和园更合适” result3 run_agent_react(query3, max_steps8) # 复杂任务给更多步数 # 测试场景4无需工具的直接问答 print(\n 测试4: 直接知识问答) query4 “请用一句话介绍一下太阳。” result4 run_agent_react(query4) print(\n所有测试完成)运行python main.py你会看到类似下面的输出具体内容可能因模型随机性略有不同启动 Qwen1.5-1.8B GPTQ 智能体演示... 测试1: 数学计算 用户: 请计算一下 (15 7) * 3 等于多少 ---------------------------------------- 智能体思考: 用户需要计算一个数学表达式。我应该使用计算器工具。 智能体行动: 调用工具 [calculator] 输入: [(15 7) * 3] 工具观察结果: 计算器返回结果: (15 7) * 3 66 智能体思考: 我已经得到了计算结果。 智能体最终回答: (15 7) * 3 的计算结果是 66。 测试2: 天气查询 用户: 上海今天天气怎么样 ---------------------------------------- 智能体思考: 用户想查询上海的天气。我需要使用天气查询工具。 智能体行动: 调用工具 [get_weather] 输入: [上海] 工具观察结果: 上海的天气是多云气温28°C湿度65%。 智能体思考: 我已经获取了天气信息可以回答用户了。 智能体最终回答: 上海今天的天气是多云气温大约28摄氏度湿度65%。 看到智能体一步步思考、调用工具、再整合信息回答的过程了吗这就是智能体的魅力所在。对于第三个复杂任务它可能会先调用天气工具然后根据返回的天气情况比如“晴”或“雨”再组织语言给出推荐。5. 下一步可以尝试什么恭喜你已经成功搭建了一个最基本的智能体虽然它现在只能做计算和查模拟天气但整个框架已经搭好了。你可以像乐高一样往里面添加更多、更强大的“积木”。添加真实工具把get_weather工具换成真正的天气API比如和风天气、OpenWeatherMap的接口。添加搜索引擎工具通过API调用Serper、Google Search等、数据库查询工具、文件读写工具等等。优化提示工程我们现在的系统提示system_prompt还比较简单。你可以让它更详细规定更严格的输出格式或者给一些少样本示例Few-Shot让模型更好地理解任务。尝试更成熟的框架我们为了理解原理自己实现了一个简单的ReAct循环。在实际项目中你可以直接使用那些功能更全、更稳定的框架比如LangChain、LlamaIndex或Transformers Agents。它们提供了更便捷的工具集成、记忆管理和复杂流程控制。增加记忆能力让智能体能够记住之前对话的内容处理多轮对话。部署成服务用 FastAPI 或 Gradio 把这个智能体包成一个Web应用或图形界面分享给别人用。用Qwen1.5-1.8B GPTQ这样的小模型入门智能体开发最大的好处是试错成本低。你可以快速验证想法调整提示词添加新工具整个过程响应很快。等你的智能体逻辑在这个小模型上跑顺了如果想追求更复杂的推理能力再考虑换用更大的模型也会更有方向。动手试试吧给你的智能体加一个“查股票”或者“订闹钟”的工具看看它能不能帮你规划一下明天的日程。这个从零到一的过程才是最有趣的。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。