人工智能正从“单轮对话”的工具,迈向能感知、规划、执行并持续学习的“智能体(Agent)”时代。对于开发者和企业而言,抓住Agent趋势,就意味着掌握了构建下一代AI应用的核心能力。
今天,我们将抛开复杂理论,直接进入实战。本文将手把手带你,基于阿里云的通义千问系列模型及模型服务平台,从零开始构建一个具备专属能力的AI智能体,涵盖从环境准备、智能体框架设计、核心能力开发到部署上线的完整闭环。
一、 认知与准备:什么是智能体,以及你需要什么
在开始编码之前,我们需要统一认知。一个基础的AI智能体通常包含三个核心模块:
“大脑” (Brain): 即大语言模型,负责理解、推理和决策。我们选择阿里云通义千问作为基础模型。
“感知与手” (Perception & Tools): 智能体调用外部API、查询数据库、执行代码的能力。这通过 “Function Calling” (工具调用) 实现。
“记忆与规划” (Memory & Planning): 让智能体拥有上下文记忆,并能拆解复杂任务为可执行的子步骤。
环境准备清单:
阿里云账号: 确保已开通并完成实名认证。
开通服务: 在阿里云控制台开通 “模型服务灵积” (DashScope) 和 “函数计算FC”(用于部署后端工具)。
获取密钥: 在DashScope控制台获取你的 API-KEY,这是调用通义千问模型的凭证。
开发环境: 本地Python环境(推荐3.8+)或阿里云云效/Cloud IDE。
二、 第一步:搭建智能体的“基础骨架”
我们从一个最简单的对话循环开始,验证核心模型通路。
python
安装必要库
pip install dashscope
import dashscope
from dashscope import Generation
设置你的API-KEY
dashscope.api_key = '你的API-KEY'
def qwen_chat(messages):
"""基础对话函数"""
response = Generation.call(
model='qwen-plus', # 也可选用 qwen-turbo, qwen-max
messages=messages,
result_format='message' # 返回消息格式
)
if response.status_code == 200:
return response.output.choices[0]['message']['content']
else:
return f'请求失败: {response.code} - {response.message}'
开始第一次对话
messages = [{'role': 'user', 'content': '你好,介绍一下你自己。'}]
reply = qwen_chat(messages)
print(f"智能体: {reply}")
运行这段代码,你将得到通义千问的回复。这证明你的“大脑”已成功接入。但这只是一个聊天机器人,还不是智能体。
三、 第二步:赋予智能体“手脚”——工具调用
智能体的强大在于它能操作外部世界。我们以“查询实时天气”和“执行简单计算”为例,为智能体打造两个工具。
- 定义工具列表 (Tool Definitions):
用JSON Schema清晰地描述每个工具的输入、输出和功能。
python
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "获取指定城市的当前天气情况",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "城市名称,如:北京"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"], "description": "温度单位"}
},
"required": ["location"]
}
}
},
{
"type": "function",
"function": {
"name": "calculator",
"description": "执行数学计算",
"parameters": {
"type": "object",
"properties": {
"expression": {"type": "string", "description": "数学表达式,如:(12 + 5) * 3"}
},
"required": ["expression"]
}
}
}
]
- 实现工具函数 (Tool Implementations):
python
import requests
import json
def get_current_weather(location, unit="celsius"):
# 这里调用一个模拟天气API,真实场景可接入阿里云市场或高德API
# 仅为示例
weather_data = {
"北京": {"temperature": 22, "condition": "晴", "unit": unit},
"杭州": {"temperature": 25, "condition": "多云", "unit": unit},
}
return json.dumps(weather_data.get(location, {"error": "城市未找到"}))
def calculator(expression):
try:
# 安全警告:生产环境请使用更安全的评估方式,如 ast.literal_eval
result = eval(expression)
return json.dumps({"result": result})
except Exception as e:
return json.dumps({"error": f"计算失败: {e}"})
- 实现带工具调用的智能体循环:
这是核心逻辑。模型将根据对话决定是否调用工具,以及如何调用。
python
def run_agent_with_tools(user_input, conversation_history):
messages = conversation_history + [{'role': 'user', 'content': user_input}]
# 第一次调用:让模型判断是否需要调用工具
response = Generation.call(
model='qwen-plus',
messages=messages,
tools=tools, # 关键:传入工具定义
tool_choice='auto', # 让模型自动选择
)
assistant_message = response.output.choices[0]['message']
messages.append(assistant_message) # 将模型的响应加入历史
# 检查模型是否要求调用工具
tool_calls = assistant_message.get('tool_calls')
if tool_calls:
print(f"智能体决定调用工具: {tool_calls}")
for tool_call in tool_calls:
func_name = tool_call['function']['name']
func_args = json.loads(tool_call['function']['arguments'])
# 根据函数名分发到对应的工具函数
if func_name == 'get_current_weather':
tool_result = get_current_weather(**func_args)
elif func_name == 'calculator':
tool_result = calculator(**func_args)
else:
tool_result = json.dumps({"error": "未知工具"})
# 将工具执行结果作为新的消息追加给模型
messages.append({
"role": "tool",
"content": tool_result,
"tool_call_id": tool_call['id'] # 关键:关联工具调用
})
# 第二次调用:让模型基于工具结果生成最终回答
second_response = Generation.call(
model='qwen-plus',
messages=messages,
)
final_reply = second_response.output.choices[0]['message']['content']
else:
final_reply = assistant_message['content']
return final_reply, messages # 返回最终回答和更新后的历史
测试这个进阶智能体
history = []
user_query = "杭州今天天气怎么样?用摄氏度告诉我。"
reply, history = run_agent_with_tools(user_query, history)
print(f"用户: {user_query}")
print(f"智能体: {reply}")
user_query2 = "如果温度是25度,那么华氏度是多少?"
reply2, history = run_agent_with_tools(user_query2, history)
print(f"用户: {user_query2}")
print(f"智能体: {reply2}")
此时,你的智能体已经能“思考并行动”。它听到“杭州天气”后,会自主调用get_current_weather工具,拿到数据后,再组织语言回答你。
四、 第三步:进阶与优化——记忆、规划与工程化
一个可用的智能体还需要:
记忆管理: 上述代码中的 conversation_history 就是最简单的短期记忆。对于长对话,你需要实现向量数据库(如阿里云Hologres)来存储和检索关键记忆。
任务规划: 对于“帮我制定一份周末去北京旅游的预算清单”这类复杂请求,你需要引导模型先输出规划(拆分为查询天气、查找酒店、计算交通费等步骤),再逐步执行。这可以通过 “ReAct”模式 或阿里云百炼平台提供的 “编排”功能 更高效地实现。
工程化部署: 将智能体后端部署为阿里云函数计算FC的HTTP服务,前端通过Web或钉钉机器人等渠道交互。利用FC的弹性伸缩,轻松应对流量波动。
五、 总结与展望:你的智能体,现在与未来
通过以上三步,你已经完成了从0到1的搭建。这个智能体具备了:
✅ 强大的通义千问模型作为推理核心。
✅ 灵活的工具调用能力,可无限扩展(接入数据库、CRM、内部系统API)。
✅ 基础的对话记忆和连贯性。
未来的迭代方向:
能力升级: 接入阿里云 “百炼”平台,利用其内置的Agent框架、知识库检索和可视化编排工具,大幅降低开发复杂度。
专业化: 为你的智能体注入垂直领域知识库(基于阿里云OpenSearch),打造法律、医疗、客服等专业助手。
自主化: 结合AutoGPT理念,赋予智能体更高级的目标分解和自我反思能力。
Agent的世界刚刚打开。现在,你已经拥有了启动的钥匙。接下来,就是结合你的业务场景,用阿里云提供的强大、稳定的云原生AI基础设施,去构建那个独一无二的智能体。
立即行动:
开通 DashScope模型服务灵积
克隆本文代码,替换你的API-KEY。
尝试为你的智能体添加第三个工具(如“发送邮件”或“查询数据库”)。
期待在云栖社区看到你分享的、更精彩的智能体应用实践!