智能体Agent开发入门基于通义千问1.5-1.8B构建你的第一个AI助手你是不是经常看到“智能体”这个词感觉它很酷但又觉得离自己很远觉得那是大公司或者顶尖工程师才能玩转的东西其实搭建一个能理解你、帮你干活儿的AI助手并没有想象中那么复杂。今天我们就来亲手做一个。不用复杂的框架就用你熟悉的Python加上一个轻量又好用的模型——通义千问1.5-1.8B来构建一个能查天气、能算账、能给你出行建议的智能小助手。整个过程就像搭积木我会一步步带你走完保证你看完就能自己动手做一个。1. 智能体到底是什么先别被概念吓到咱们先抛开那些高大上的定义。你可以把智能体想象成一个“有脑子、会动手”的虚拟小管家。“有脑子”就是它的核心一个能理解你说话的大语言模型。比如你跟它说“明天上海天气怎么样”它能明白你想问的是“上海”、“明天”的“天气”。“会动手”光理解还不够它得能干活。比如理解了你要查天气它得能去调用一个真正的天气查询接口把结果拿回来。“有记性”好的管家得记得之前的事。你问完“上海天气”接着说“那需要带伞吗”它得记得刚才聊的是上海才能给出合理的建议。所以一个简单的智能体 大模型大脑工具调用手脚记忆记事本。我们今天要做的就是把这三样东西拼装起来。为什么选通义千问1.5-1.8B这个模型呢因为它足够“轻”。参数少意味着我们在自己的电脑上就能比较容易地跑起来做实验、学原理非常合适效果对于入门来说也完全够用。2. 动手之前准备好你的“工具箱”工欲善其事必先利其器。我们不需要太多东西一个Python环境几个常用的库就够了。2.1 基础环境搭建首先确保你的电脑上有Python建议3.8或以上版本。然后我们打开命令行安装几个核心的库pip install transformers # 这是Hugging Face的模型库我们用它来加载和运行通义千问模型 pip install torch # 深度学习框架transformers的依赖 pip install requests # 用来发送网络请求比如调用天气API如果你的网络环境下载模型比较慢可能需要一点耐心或者寻找一些国内镜像源来加速。2.2 获取天气数据的能力智能体要查天气得有个信息来源。我们可以找一个免费的天气API。这里我以和风天气HeWeather为例因为它有免费的开发版足够我们学习使用。去和风天气官网注册一个账号。在控制台创建一个项目获取你的API Key。这个Key就像一把钥匙有了它你才能问天气数据。他们提供的免费套餐通常足够我们做测试用了。记住这个API Key我们等会儿写代码的时候会用到。3. 核心模块搭建给智能体装上“大脑”和“手脚”现在我们来一块块地拼装我们的智能体。我们会创建三个主要的Python文件让结构更清晰。3.1 第一步启动“大脑”模型加载与对话我们创建一个文件叫qianwen_brain.py专门负责和通义千问模型对话。# qianwen_brain.py from transformers import AutoTokenizer, AutoModelForCausalLM import torch class QianwenBrain: def __init__(self, model_nameQwen/Qwen1.5-1.8B): 初始化大脑加载通义千问模型和分词器。 注意首次运行会自动从网上下载模型请确保网络通畅。 print(f正在加载模型 {model_name}首次加载可能需要几分钟请耐心等待...) self.tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) self.model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float16, # 使用半精度减少内存占用 device_mapauto, # 自动选择GPU或CPU trust_remote_codeTrue ) print(模型加载完成) def think(self, prompt): 让大脑思考根据输入的提示词prompt生成回复。 # 将输入文本转换为模型能理解的数字ID inputs self.tokenizer(prompt, return_tensorspt).to(self.model.device) # 让模型生成文本这里设置一些生成参数 with torch.no_grad(): # 推理阶段不计算梯度以节省内存 outputs self.model.generate( **inputs, max_new_tokens256, # 最多生成256个新token do_sampleTrue, # 使用采样让输出更有创造性 temperature0.7, # 温度参数控制随机性 ) # 将生成的数字ID解码回我们能看懂的文本 response self.tokenizer.decode(outputs[0], skip_special_tokensTrue) # 只返回新生成的部分去掉原始的prompt return response[len(prompt):].strip() # 简单测试一下大脑是否工作 if __name__ __main__: brain QianwenBrain() test_prompt 你好请介绍一下你自己。 print(f用户: {test_prompt}) print(fAI: {brain.think(test_prompt)})运行这个文件如果看到模型开始加载并最终能和你打招呼恭喜你“大脑”激活成功3.2 第二步打造“手脚”工具调用光有大脑会思考还得有手脚去执行。我们创建agent_tools.py定义智能体能用的工具。# agent_tools.py import requests import json import math class AgentTools: def __init__(self, weather_api_key): # 初始化时传入天气API的密钥 self.weather_api_key weather_api_key self.weather_base_url https://devapi.qweather.com/v7/weather/now def get_weather(self, city): 工具1查询城市实时天气。 调用和风天气API返回天气信息。 try: # 首先需要根据城市名获取该城市的Location ID geo_url fhttps://geoapi.qweather.com/v2/city/lookup?location{city}key{self.weather_api_key} geo_resp requests.get(geo_url, timeout10) geo_data geo_resp.json() if geo_data[code] ! 200 or not geo_data[location]: return f抱歉找不到城市{city}的天气信息。 location_id geo_data[location][0][id] # 用Location ID查询实时天气 weather_url f{self.weather_base_url}?location{location_id}key{self.weather_api_key} weather_resp requests.get(weather_url, timeout10) weather_data weather_resp.json() if weather_data[code] 200: now weather_data[now] result ( f{city}的当前天气{now[text]} f温度{now[temp]}摄氏度 f体感温度{now[feelsLike]}摄氏度 f湿度{now[humidity]}% f风向{now[windDir]}风力{now[windScale]}级。 ) return result else: return 天气查询失败请稍后再试。 except requests.exceptions.RequestException as e: return f网络请求出错{e} except Exception as e: return f查询天气时发生未知错误{e} def calculate(self, expression): 工具2简单数学计算。 注意这里使用eval有安全风险仅用于演示。生产环境务必使用更安全的方式如ast.literal_eval或专门库。 try: # 非常简单的安全过滤仅允许数字和基本运算符 allowed_chars set(0123456789-*/(). ) if not all(c in allowed_chars for c in expression): return 计算表达式包含不安全字符。 # 使用math模块中的函数避免直接eval不可控内容 result eval(expression, {__builtins__: None}, {math: math}) return f计算结果{expression} {result} except Exception as e: return f计算失败{e} def get_tools_description(self): 返回工具的描述用于告诉大脑模型现在有哪些工具可用。 这个描述很重要模型需要知道它能用什么、怎么用。 tools_desc [ { name: get_weather, description: 查询指定城市的实时天气信息。需要提供城市名称例如上海、北京。, parameters: {type: object, properties: {city: {type: string}}} }, { name: calculate, description: 执行一个简单的数学计算。需要提供一个数学表达式字符串例如3 5 * 2、sqrt(16)。, parameters: {type: object, properties: {expression: {type: string}}} } ] return json.dumps(tools_desc, ensure_asciiFalse)这里我们定义了两个工具查天气和做计算。注意看get_tools_description函数它用结构化的方式描述了工具这是后面让模型知道该调用哪个工具的关键。3.3 第三步连接大脑与手脚智能体核心逻辑现在到了最有趣的部分我们要创建一个“调度中心”让大脑能根据我们的指令决定什么时候思考什么时候使用工具。创建my_first_agent.py。# my_first_agent.py import re import json from qianwen_brain import QianwenBrain from agent_tools import AgentTools class MyFirstAgent: def __init__(self, weather_api_key): 初始化智能体组装大脑和工具。 self.brain QianwenBrain() self.tools AgentTools(weather_api_key) # 一个简单的列表用来记录对话历史充当短期记忆 self.conversation_history [] # 给大脑一个系统提示告诉它你是谁以及它能做什么 self.system_prompt f你是一个有用的AI助手可以调用工具来帮助用户。 你可以使用的工具如下 {self.tools.get_tools_description()} 当用户的问题需要调用工具时请严格按照以下JSON格式回复 {{action: tool_call, tool_name: 工具名, parameters: {{参数名: 参数值}}}} 例如用户问“北京天气怎么样”你应该回复 {{action: tool_call, tool_name: get_weather, parameters: {{city: 北京}}}} 如果不需要调用工具就像平常一样用自然语言回复。 请保持对话友好且有帮助。 self.conversation_history.append({role: system, content: self.system_prompt}) def _parse_model_response(self, response): 解析模型的回复判断是普通对话还是工具调用指令。 # 尝试查找JSON格式的工具调用指令 try: # 使用正则表达式匹配可能被包裹在文本中的JSON json_match re.search(r\{.*action.*tool_name.*\}, response, re.DOTALL) if json_match: tool_call json.loads(json_match.group()) if tool_call.get(action) tool_call: return tool_call except json.JSONDecodeError: pass # 如果不是工具调用就当作普通文本回复 return {action: reply, content: response} def run_tool(self, tool_name, parameters): 根据工具名和参数实际调用工具。 if tool_name get_weather: return self.tools.get_weather(parameters.get(city)) elif tool_name calculate: return self.tools.calculate(parameters.get(expression)) else: return f未知的工具{tool_name} def chat(self, user_input): 智能体的主要聊天循环。 print(f\n[用户] {user_input}) # 将用户输入加入历史 self.conversation_history.append({role: user, content: user_input}) # 构建给模型的完整提示包含历史对话 # 这里简单地将历史拼接起来更复杂的系统会做更精细的处理 prompt_parts [] for msg in self.conversation_history[-6:]: # 只保留最近几轮对话作为上下文防止太长 role msg[role] content msg[content] if role system: prompt_parts.append(content) elif role user: prompt_parts.append(f用户: {content}) elif role assistant: prompt_parts.append(f助手: {content}) prompt_parts.append(助手:) # 提示模型该它说话了 full_prompt \n\n.join(prompt_parts) # 让大脑思考 raw_response self.brain.think(full_prompt) print(f[模型原始回复] {raw_response}) # 解析大脑的回复 parsed self._parse_model_response(raw_response) if parsed[action] tool_call: # 如果需要调用工具 tool_name parsed[tool_name] tool_params parsed[parameters] print(f[智能体] 检测到工具调用指令{tool_name}参数{tool_params}) # 执行工具 tool_result self.run_tool(tool_name, tool_params) print(f[工具执行结果] {tool_result}) # 把工具执行结果也加入历史并让大脑基于结果生成最终回复 self.conversation_history.append({role: assistant, content: raw_response}) # 这里我们构造一个简单的提示告诉模型工具执行的结果 follow_up_prompt f{full_prompt}\n助手:{raw_response}\n工具调用返回结果{tool_result}\n请根据以上结果回复用户 final_response self.brain.think(follow_up_prompt) # 将最终回复加入历史 self.conversation_history.append({role: assistant, content: final_response}) print(f[智能体最终回复] {final_response}) return final_response else: # 如果是普通回复直接返回 self.conversation_history.append({role: assistant, content: parsed[content]}) print(f[智能体回复] {parsed[content]}) return parsed[content] # 让我们运行起来看看 if __name__ __main__: # 替换成你在和风天气获取的真实API Key YOUR_WEATHER_API_KEY 你的和风天气API Key if YOUR_WEATHER_API_KEY 你的和风天气API Key: print(请先在 agent_tools.py 中配置你的和风天气API Key) exit() agent MyFirstAgent(YOUR_WEATHER_API_KEY) print(智能体已启动输入 退出 或 quit 结束对话。) while True: try: user_input input(\n请输入你的问题).strip() if user_input.lower() in [退出, quit, exit]: print(再见) break if user_input: agent.chat(user_input) except KeyboardInterrupt: print(\n程序被中断。) break except Exception as e: print(f出错了{e})这个文件是智能体的“总控”。它做了几件关键事管理记忆用conversation_history列表记住对话。指挥大脑把用户的问题和对话历史整理好送给模型大脑去思考。解析指令判断大脑的回复是普通聊天还是命令它去调用工具比如查天气。执行工具如果大脑说要调用工具它就指挥AgentTools去干活。整合结果拿到工具的结果比如天气数据后再让大脑组织成一句人话回复给我们。4. 看看效果和你的智能体对话现在在命令行运行python my_first_agent.py并确保你的API Key已填好。让我们试试几个场景场景一简单查询你北京今天天气怎么样 智能体[模型原始回复] {action: tool_call, tool_name: get_weather, parameters: {city: 北京}} 智能体[工具执行结果] 北京的当前天气晴温度22摄氏度体感温度21摄氏度湿度35%风向西北风力2级。 智能体[智能体最终回复] 北京今天天气晴朗气温22度体感比较舒适湿度较低西北风2级。是个出门的好天气。场景二多轮对话利用记忆你上海明天天气呢 智能体调用工具查询上海天气... 你需要带伞吗 智能体它需要结合上一轮“上海天气”的结果来推理。因为我们的记忆机制保留了上下文它能做到。场景三使用计算工具你计算一下 15 乘以 28 加上 17 等于多少 智能体[模型原始回复] {action: tool_call, tool_name: calculate, parameters: {expression: 15 * 28 17}} 智能体[工具执行结果] 计算结果15 * 28 17 437 智能体[智能体最终回复] 15乘以28等于420再加上17结果是437。看它真的像一个有逻辑的小助手了它能理解你的意图选择正确的工具执行任务并把结果用自然语言告诉你。5. 总结与下一步跟着走完这一趟你应该已经亲手搭建了一个具备基础能力的AI智能体。它虽然简单但包含了智能体最核心的三大件模型、工具和记忆。通义千问1.5-1.8B作为“大脑”负责理解和规划我们写的工具类就是它的“手脚”而那个不断增长的对话历史列表就是它的“短期记忆”。实际用起来你可能会发现这个简易版智能体有些地方可以做得更好。比如模型有时候可能不会严格按照我们规定的JSON格式返回导致工具调用失败记忆管理也比较粗糙对话长了就会失效。这些都是后续可以优化的方向比如使用更成熟的框架如LangChain、Semantic Kernel来提供更稳定的工具调用解析和更强大的记忆管理。但最重要的是通过这个实践你拆解了智能体的黑盒知道了它内部是如何流转的。下次你再听到“Agent”这个词脑子里浮现的不再是一个模糊的概念而是一个清晰的、由代码构成的协作系统。不妨就以这个“天气助手”为起点试着给它添加更多工具比如查新闻、定日历、翻译句子或者优化它的对话逻辑让它变得更聪明、更可靠。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
智能体(Agent)开发入门:基于通义千问1.5-1.8B构建你的第一个AI助手
智能体Agent开发入门基于通义千问1.5-1.8B构建你的第一个AI助手你是不是经常看到“智能体”这个词感觉它很酷但又觉得离自己很远觉得那是大公司或者顶尖工程师才能玩转的东西其实搭建一个能理解你、帮你干活儿的AI助手并没有想象中那么复杂。今天我们就来亲手做一个。不用复杂的框架就用你熟悉的Python加上一个轻量又好用的模型——通义千问1.5-1.8B来构建一个能查天气、能算账、能给你出行建议的智能小助手。整个过程就像搭积木我会一步步带你走完保证你看完就能自己动手做一个。1. 智能体到底是什么先别被概念吓到咱们先抛开那些高大上的定义。你可以把智能体想象成一个“有脑子、会动手”的虚拟小管家。“有脑子”就是它的核心一个能理解你说话的大语言模型。比如你跟它说“明天上海天气怎么样”它能明白你想问的是“上海”、“明天”的“天气”。“会动手”光理解还不够它得能干活。比如理解了你要查天气它得能去调用一个真正的天气查询接口把结果拿回来。“有记性”好的管家得记得之前的事。你问完“上海天气”接着说“那需要带伞吗”它得记得刚才聊的是上海才能给出合理的建议。所以一个简单的智能体 大模型大脑工具调用手脚记忆记事本。我们今天要做的就是把这三样东西拼装起来。为什么选通义千问1.5-1.8B这个模型呢因为它足够“轻”。参数少意味着我们在自己的电脑上就能比较容易地跑起来做实验、学原理非常合适效果对于入门来说也完全够用。2. 动手之前准备好你的“工具箱”工欲善其事必先利其器。我们不需要太多东西一个Python环境几个常用的库就够了。2.1 基础环境搭建首先确保你的电脑上有Python建议3.8或以上版本。然后我们打开命令行安装几个核心的库pip install transformers # 这是Hugging Face的模型库我们用它来加载和运行通义千问模型 pip install torch # 深度学习框架transformers的依赖 pip install requests # 用来发送网络请求比如调用天气API如果你的网络环境下载模型比较慢可能需要一点耐心或者寻找一些国内镜像源来加速。2.2 获取天气数据的能力智能体要查天气得有个信息来源。我们可以找一个免费的天气API。这里我以和风天气HeWeather为例因为它有免费的开发版足够我们学习使用。去和风天气官网注册一个账号。在控制台创建一个项目获取你的API Key。这个Key就像一把钥匙有了它你才能问天气数据。他们提供的免费套餐通常足够我们做测试用了。记住这个API Key我们等会儿写代码的时候会用到。3. 核心模块搭建给智能体装上“大脑”和“手脚”现在我们来一块块地拼装我们的智能体。我们会创建三个主要的Python文件让结构更清晰。3.1 第一步启动“大脑”模型加载与对话我们创建一个文件叫qianwen_brain.py专门负责和通义千问模型对话。# qianwen_brain.py from transformers import AutoTokenizer, AutoModelForCausalLM import torch class QianwenBrain: def __init__(self, model_nameQwen/Qwen1.5-1.8B): 初始化大脑加载通义千问模型和分词器。 注意首次运行会自动从网上下载模型请确保网络通畅。 print(f正在加载模型 {model_name}首次加载可能需要几分钟请耐心等待...) self.tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) self.model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float16, # 使用半精度减少内存占用 device_mapauto, # 自动选择GPU或CPU trust_remote_codeTrue ) print(模型加载完成) def think(self, prompt): 让大脑思考根据输入的提示词prompt生成回复。 # 将输入文本转换为模型能理解的数字ID inputs self.tokenizer(prompt, return_tensorspt).to(self.model.device) # 让模型生成文本这里设置一些生成参数 with torch.no_grad(): # 推理阶段不计算梯度以节省内存 outputs self.model.generate( **inputs, max_new_tokens256, # 最多生成256个新token do_sampleTrue, # 使用采样让输出更有创造性 temperature0.7, # 温度参数控制随机性 ) # 将生成的数字ID解码回我们能看懂的文本 response self.tokenizer.decode(outputs[0], skip_special_tokensTrue) # 只返回新生成的部分去掉原始的prompt return response[len(prompt):].strip() # 简单测试一下大脑是否工作 if __name__ __main__: brain QianwenBrain() test_prompt 你好请介绍一下你自己。 print(f用户: {test_prompt}) print(fAI: {brain.think(test_prompt)})运行这个文件如果看到模型开始加载并最终能和你打招呼恭喜你“大脑”激活成功3.2 第二步打造“手脚”工具调用光有大脑会思考还得有手脚去执行。我们创建agent_tools.py定义智能体能用的工具。# agent_tools.py import requests import json import math class AgentTools: def __init__(self, weather_api_key): # 初始化时传入天气API的密钥 self.weather_api_key weather_api_key self.weather_base_url https://devapi.qweather.com/v7/weather/now def get_weather(self, city): 工具1查询城市实时天气。 调用和风天气API返回天气信息。 try: # 首先需要根据城市名获取该城市的Location ID geo_url fhttps://geoapi.qweather.com/v2/city/lookup?location{city}key{self.weather_api_key} geo_resp requests.get(geo_url, timeout10) geo_data geo_resp.json() if geo_data[code] ! 200 or not geo_data[location]: return f抱歉找不到城市{city}的天气信息。 location_id geo_data[location][0][id] # 用Location ID查询实时天气 weather_url f{self.weather_base_url}?location{location_id}key{self.weather_api_key} weather_resp requests.get(weather_url, timeout10) weather_data weather_resp.json() if weather_data[code] 200: now weather_data[now] result ( f{city}的当前天气{now[text]} f温度{now[temp]}摄氏度 f体感温度{now[feelsLike]}摄氏度 f湿度{now[humidity]}% f风向{now[windDir]}风力{now[windScale]}级。 ) return result else: return 天气查询失败请稍后再试。 except requests.exceptions.RequestException as e: return f网络请求出错{e} except Exception as e: return f查询天气时发生未知错误{e} def calculate(self, expression): 工具2简单数学计算。 注意这里使用eval有安全风险仅用于演示。生产环境务必使用更安全的方式如ast.literal_eval或专门库。 try: # 非常简单的安全过滤仅允许数字和基本运算符 allowed_chars set(0123456789-*/(). ) if not all(c in allowed_chars for c in expression): return 计算表达式包含不安全字符。 # 使用math模块中的函数避免直接eval不可控内容 result eval(expression, {__builtins__: None}, {math: math}) return f计算结果{expression} {result} except Exception as e: return f计算失败{e} def get_tools_description(self): 返回工具的描述用于告诉大脑模型现在有哪些工具可用。 这个描述很重要模型需要知道它能用什么、怎么用。 tools_desc [ { name: get_weather, description: 查询指定城市的实时天气信息。需要提供城市名称例如上海、北京。, parameters: {type: object, properties: {city: {type: string}}} }, { name: calculate, description: 执行一个简单的数学计算。需要提供一个数学表达式字符串例如3 5 * 2、sqrt(16)。, parameters: {type: object, properties: {expression: {type: string}}} } ] return json.dumps(tools_desc, ensure_asciiFalse)这里我们定义了两个工具查天气和做计算。注意看get_tools_description函数它用结构化的方式描述了工具这是后面让模型知道该调用哪个工具的关键。3.3 第三步连接大脑与手脚智能体核心逻辑现在到了最有趣的部分我们要创建一个“调度中心”让大脑能根据我们的指令决定什么时候思考什么时候使用工具。创建my_first_agent.py。# my_first_agent.py import re import json from qianwen_brain import QianwenBrain from agent_tools import AgentTools class MyFirstAgent: def __init__(self, weather_api_key): 初始化智能体组装大脑和工具。 self.brain QianwenBrain() self.tools AgentTools(weather_api_key) # 一个简单的列表用来记录对话历史充当短期记忆 self.conversation_history [] # 给大脑一个系统提示告诉它你是谁以及它能做什么 self.system_prompt f你是一个有用的AI助手可以调用工具来帮助用户。 你可以使用的工具如下 {self.tools.get_tools_description()} 当用户的问题需要调用工具时请严格按照以下JSON格式回复 {{action: tool_call, tool_name: 工具名, parameters: {{参数名: 参数值}}}} 例如用户问“北京天气怎么样”你应该回复 {{action: tool_call, tool_name: get_weather, parameters: {{city: 北京}}}} 如果不需要调用工具就像平常一样用自然语言回复。 请保持对话友好且有帮助。 self.conversation_history.append({role: system, content: self.system_prompt}) def _parse_model_response(self, response): 解析模型的回复判断是普通对话还是工具调用指令。 # 尝试查找JSON格式的工具调用指令 try: # 使用正则表达式匹配可能被包裹在文本中的JSON json_match re.search(r\{.*action.*tool_name.*\}, response, re.DOTALL) if json_match: tool_call json.loads(json_match.group()) if tool_call.get(action) tool_call: return tool_call except json.JSONDecodeError: pass # 如果不是工具调用就当作普通文本回复 return {action: reply, content: response} def run_tool(self, tool_name, parameters): 根据工具名和参数实际调用工具。 if tool_name get_weather: return self.tools.get_weather(parameters.get(city)) elif tool_name calculate: return self.tools.calculate(parameters.get(expression)) else: return f未知的工具{tool_name} def chat(self, user_input): 智能体的主要聊天循环。 print(f\n[用户] {user_input}) # 将用户输入加入历史 self.conversation_history.append({role: user, content: user_input}) # 构建给模型的完整提示包含历史对话 # 这里简单地将历史拼接起来更复杂的系统会做更精细的处理 prompt_parts [] for msg in self.conversation_history[-6:]: # 只保留最近几轮对话作为上下文防止太长 role msg[role] content msg[content] if role system: prompt_parts.append(content) elif role user: prompt_parts.append(f用户: {content}) elif role assistant: prompt_parts.append(f助手: {content}) prompt_parts.append(助手:) # 提示模型该它说话了 full_prompt \n\n.join(prompt_parts) # 让大脑思考 raw_response self.brain.think(full_prompt) print(f[模型原始回复] {raw_response}) # 解析大脑的回复 parsed self._parse_model_response(raw_response) if parsed[action] tool_call: # 如果需要调用工具 tool_name parsed[tool_name] tool_params parsed[parameters] print(f[智能体] 检测到工具调用指令{tool_name}参数{tool_params}) # 执行工具 tool_result self.run_tool(tool_name, tool_params) print(f[工具执行结果] {tool_result}) # 把工具执行结果也加入历史并让大脑基于结果生成最终回复 self.conversation_history.append({role: assistant, content: raw_response}) # 这里我们构造一个简单的提示告诉模型工具执行的结果 follow_up_prompt f{full_prompt}\n助手:{raw_response}\n工具调用返回结果{tool_result}\n请根据以上结果回复用户 final_response self.brain.think(follow_up_prompt) # 将最终回复加入历史 self.conversation_history.append({role: assistant, content: final_response}) print(f[智能体最终回复] {final_response}) return final_response else: # 如果是普通回复直接返回 self.conversation_history.append({role: assistant, content: parsed[content]}) print(f[智能体回复] {parsed[content]}) return parsed[content] # 让我们运行起来看看 if __name__ __main__: # 替换成你在和风天气获取的真实API Key YOUR_WEATHER_API_KEY 你的和风天气API Key if YOUR_WEATHER_API_KEY 你的和风天气API Key: print(请先在 agent_tools.py 中配置你的和风天气API Key) exit() agent MyFirstAgent(YOUR_WEATHER_API_KEY) print(智能体已启动输入 退出 或 quit 结束对话。) while True: try: user_input input(\n请输入你的问题).strip() if user_input.lower() in [退出, quit, exit]: print(再见) break if user_input: agent.chat(user_input) except KeyboardInterrupt: print(\n程序被中断。) break except Exception as e: print(f出错了{e})这个文件是智能体的“总控”。它做了几件关键事管理记忆用conversation_history列表记住对话。指挥大脑把用户的问题和对话历史整理好送给模型大脑去思考。解析指令判断大脑的回复是普通聊天还是命令它去调用工具比如查天气。执行工具如果大脑说要调用工具它就指挥AgentTools去干活。整合结果拿到工具的结果比如天气数据后再让大脑组织成一句人话回复给我们。4. 看看效果和你的智能体对话现在在命令行运行python my_first_agent.py并确保你的API Key已填好。让我们试试几个场景场景一简单查询你北京今天天气怎么样 智能体[模型原始回复] {action: tool_call, tool_name: get_weather, parameters: {city: 北京}} 智能体[工具执行结果] 北京的当前天气晴温度22摄氏度体感温度21摄氏度湿度35%风向西北风力2级。 智能体[智能体最终回复] 北京今天天气晴朗气温22度体感比较舒适湿度较低西北风2级。是个出门的好天气。场景二多轮对话利用记忆你上海明天天气呢 智能体调用工具查询上海天气... 你需要带伞吗 智能体它需要结合上一轮“上海天气”的结果来推理。因为我们的记忆机制保留了上下文它能做到。场景三使用计算工具你计算一下 15 乘以 28 加上 17 等于多少 智能体[模型原始回复] {action: tool_call, tool_name: calculate, parameters: {expression: 15 * 28 17}} 智能体[工具执行结果] 计算结果15 * 28 17 437 智能体[智能体最终回复] 15乘以28等于420再加上17结果是437。看它真的像一个有逻辑的小助手了它能理解你的意图选择正确的工具执行任务并把结果用自然语言告诉你。5. 总结与下一步跟着走完这一趟你应该已经亲手搭建了一个具备基础能力的AI智能体。它虽然简单但包含了智能体最核心的三大件模型、工具和记忆。通义千问1.5-1.8B作为“大脑”负责理解和规划我们写的工具类就是它的“手脚”而那个不断增长的对话历史列表就是它的“短期记忆”。实际用起来你可能会发现这个简易版智能体有些地方可以做得更好。比如模型有时候可能不会严格按照我们规定的JSON格式返回导致工具调用失败记忆管理也比较粗糙对话长了就会失效。这些都是后续可以优化的方向比如使用更成熟的框架如LangChain、Semantic Kernel来提供更稳定的工具调用解析和更强大的记忆管理。但最重要的是通过这个实践你拆解了智能体的黑盒知道了它内部是如何流转的。下次你再听到“Agent”这个词脑子里浮现的不再是一个模糊的概念而是一个清晰的、由代码构成的协作系统。不妨就以这个“天气助手”为起点试着给它添加更多工具比如查新闻、定日历、翻译句子或者优化它的对话逻辑让它变得更聪明、更可靠。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。