引言:从“聊天”到“做事”,你的第一个智能体之旅
你是否曾经想过,为什么别人做的AI能自动查天气、订机票、写周报,而你自己用的却只能一问一答?区别就在于——你用的是聊天机器人,而别人用的是智能体。
智能体(Agent)与传统AI的最大不同在于:它能感知环境、自主规划、调用工具、执行行动。简单来说,聊天机器人是“动口不动手”的君子,智能体是“说到做到”的行动派。
今天这篇文章,我将带你走完智能体搭建的全流程:从明确需求开始,到设计架构,再到代码实现。全程没有晦涩的理论,只有一步步可操作的实战。无论你是刚入门的开发者,还是想快速落地的产品经理,都能在30分钟内搭建出属于自己的第一个智能体。
第一步:需求定义——想清楚再动手
在写第一行代码之前,必须先回答三个问题:你的智能体要解决什么问题?为谁服务?能做什么不能做什么?
1.1 明确任务目标
智能体搭建的任务越具体,成功率越高。不要试图做一个“万能助手”,那往往是失败的开始。
好的任务目标示例:
“一个能查询实时天气并给出穿衣建议的助手”
“一个能根据用户症状推荐常见药品的医疗咨询助手”
“一个能自动整理Excel数据并生成报表的分析助手”
差的任务目标示例:
“一个智能助手”(太宽泛,无法聚焦)
“一个能解决所有问题的AI”(不现实)
以我们今天要搭建的智能体为例:一个能查询天气和进行简单计算的个人助理。这个目标足够具体,又涵盖了工具调用的核心能力。
1.2 角色设定与能力边界
给智能体一个“人设”,能让它更符合预期。同时,明确它能做什么、不能做什么,避免“幻觉”问题。
角色设定:
text
你是一个友好的个人助理,名叫“小助手”。
你的语气亲切但专业,回答简洁明了。
当用户询问天气时,你会调用天气工具查询实时信息。
当用户需要计算时,你会调用计算工具给出准确结果。
对于超出你能力范围的问题(如情感咨询、医疗诊断),你会礼貌地告诉用户无法回答。
能力边界:
查询任意城市的实时天气
执行数学计算(加减乘除、括号运算)
不提供医疗建议
不进行情感分析
不访问实时新闻(除非未来扩展)
1.3 定义输入输出
智能体搭建的输入通常是用户的问题,输出则是自然语言回答。但对于有工具调用的场景,我们需要更清晰的输入输出规范。
输入示例:
“北京今天天气怎么样?”
“帮我算一下 (125 + 37) × 8 等于多少?”
输出示例:
“北京今天晴,气温22℃,东南风2级,适合户外活动。”
“计算结果:(125 + 37) × 8 = 162 × 8 = 1296”
第二步:架构设计——搭好骨架再填肉
明确了需求之后,我们来设计智能体的核心架构。一个标准的智能体通常包含四个核心模块:
2.1 核心四模块
感知层(Perception):接收用户输入,可以是文本、语音或图像。我们初级阶段只处理文本输入。
大脑层(Reasoning):大语言模型(LLM)负责理解问题、决定是否调用工具、生成最终回答。我们选择DeepSeek或通义千问作为基础模型。
记忆层(Memory):短期记忆维护当前对话上下文,长期记忆存储用户偏好(可选)。我们先用短期记忆实现对话连贯性。
行动层(Action):工具调用能力,通过函数调用(Function Calling)机制实现与外部世界的交互。
2.2 工作流程设计
智能体的核心工作流程是一个“思考-行动-观察”的循环,学术界称为ReAct模式:
text
用户输入 → LLM理解并推理 → 是否需要工具?
├─ 是 → 调用工具 → 获取结果 → LLM综合生成回答 → 返回用户
└─ 否 → 直接生成回答 → 返回用户
这个循环看起来简单,但背后涉及模型选择、工具定义、上下文管理等多个环节。接下来我们一步步实现。
2.3 技术选型
对于初学者,我推荐以下技术栈:
开发语言:Python 3.8+(生态最成熟)
大模型API:DeepSeek(性价比高)或通义千问(国内稳定)
开发框架:直接调用API,不依赖复杂框架(便于理解原理)
部署环境:本地开发 + 可选云函数部署
第三步:代码实现——从0到1跑起来
现在进入最激动人心的环节:写代码。我们将分三步实现:基础对话能力、工具定义、完整的智能体循环。
3.1 环境准备
首先,安装必要的Python库:
bash
pip install openai # DeepSeek兼容OpenAI SDK
pip install requests
然后,获取API密钥(以DeepSeek为例):
访问DeepSeek官网注册账号
在控制台创建API Key
保存好密钥,等下要用
3.2 第一步:实现基础对话能力
先测试模型是否能正常调用,这是智能体的“大脑”:
python
f rom openai import OpenAI
import json
# 初始化客户端(以DeepSeek为例)
client = OpenAI(
api_key=”sk-你的密钥”, # 替换为真实密钥
base_url=”https://api.deepseek.com”
)
def basic_chat(user_input):
”””基础对话函数,验证模型通路”””
messages = [
{“role”: “system”, “content”: “你是一个友好的个人助手。”},
{“role”: “user”, “content”: user_input}
]
response = client.chat.completions.create(
model=”deepseek-chat”,
messages=messages,
temperature=0.7
)
return response.choices[0].message.content
# 测试
print(basic_chat(“你好,请介绍一下你自己”))
如果能看到模型回复,恭喜你,大脑已经接入了!
3.3 第二步:定义工具(Function Calling)
这是智能体“动手能力”的关键。我们需要用JSON Schema描述每个工具的功能和参数。
python
# 定义工具列表
tools = [
{
”type”: “function”,
”function”: {
”name”: “get_weather”,
”description”: “获取指定城市的实时天气信息”,
”parameters”: {
”type”: “object”,
”properties”: {
”city”: {
”type”: “string”,
”description”: “城市名称,如:北京、上海、广州”
},
”unit”: {
”type”: “string”,
”enum”: [“celsius”, “fahrenheit”],
”description”: “温度单位,默认摄氏度”
}
},
”required”: [“city”]
}
}
},
{
”type”: “function”,
”function”: {
”name”: “calculate”,
”description”: “执行数学计算”,
”parameters”: {
”type”: “object”,
”properties”: {
”expression”: {
”type”: “string”,
”description”: “数学表达式,例如:(23 + 5) * 2”
}
},
”required”: [“expression”]
}
}
}
]
# 实现工具函数
def get_weather(city, unit=”celsius”):
”””模拟天气查询(真实场景可接入高德/和风天气API)”””
# 这里用模拟数据,实际开发中应调用真实天气API
weather_db = {
”北京”: {“temp”: 22, “condition”: “晴”, “wind”: “东南风2级”},
”上海”: {“temp”: 25, “condition”: “多云”, “wind”: “东风3级”},
”广州”: {“temp”: 28, “condition”: “小雨”, “wind”: “南风2级”},
”深圳”: {“temp”: 27, “condition”: “阴”, “wind”: “微风”}
}
city_data = weather_db.get(city, {“temp”: 20, “condition”: “未知”, “wind”: “未知”})
# 单位转换
temp = city_data[“temp”]
if unit == “fahrenheit”:
temp = round(temp * 9/5 + 32)
unit_str = “°F”
else:
unit_str = “℃”
return json.dumps({
”city”: city,
”temperature”: f”{temp}{unit_str}”,
”condition”: city_data[“condition”],
”wind”: city_data[“wind”]
}, ensure_ascii=False)
def calculate(expression):
”””执行数学计算(生产环境请用更安全的eval方式)”””
try:
# 简单计算,实际应用可考虑使用numexpr等更安全的库
result = eval(expression)
return json.dumps({“expression”: expression, “result”: result})
except Exception as e:
return json.dumps({“error”: f”计算失败: {str(e)}”})
3.4 第三步:实现完整的智能体循环
这是最核心的部分——让模型能够自主决定是否调用工具,并根据工具结果生成最终回答。
python
def run_agent(user_input, conversation_history=None):
”””运行智能体主循环”””
if conversation_history is None:
conversation_history = []
# 将用户输入加入历史
conversation_history.append({“role”: “user”, “content”: user_input})
# 第一次调用:让模型判断是否需要调用工具
response = client.chat.completions.create(
model=”deepseek-chat”,
messages=conversation_history,
tools=tools,
tool_choice=”auto” # 让模型自动选择
)
response_message = response.choices[0].message
conversation_history.append(response_message) # 将模型响应加入历史
# 检查模型是否要求调用工具
tool_calls = response_message.tool_calls
if tool_calls:
print(f” 智能体决定调用工具: {[tool.function.name for tool in 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_weather”:
tool_result = get_weather(**func_args)
elif func_name == “calculate”:
tool_result = calculate(**func_args)
else:
tool_result = json.dumps({“error”: “未知工具”})
# 将工具执行结果作为tool消息追加
conversation_history.append({
”role”: “tool”,
”tool_call_id”: tool_call.id,
”content”: tool_result
})
# 第二次调用:让模型基于工具结果生成最终回答
second_response = client.chat.completions.create(
model=”deepseek-chat”,
messages=conversation_history
)
final_reply = second_response.choices[0].message.content
conversation_history.append({“role”: “assistant”, “content”: final_reply})
else:
# 不需要调用工具,直接使用模型的回答
final_reply = response_message.content
return final_reply, conversation_history
# 测试智能体
def test_agent():
history = []
# 测试天气查询
query1 = “北京今天天气怎么样?”
reply1, history = run_agent(query1, history)
print(f” 用户: {query1}”)
print(f” 智能体: {reply1}n”)
# 测试计算功能
query2 = “帮我算一下 (125 + 37) × 8 等于多少?”
reply2, history = run_agent(query2, history)
print(f” 用户: {query2}”)
print(f”智能体: {reply2}n”)
# 测试多轮对话(智能体应该记得刚才的对话)
query3 = “刚才那个城市的气温用华氏度是多少?”
reply3, history = run_agent(query3, history)
print(f” 用户: {query3}”)
print(f” 智能体: {reply3}”)
if __name__ == “__main__”:
test_agent()
3.5 运行效果
执行上面的代码,你会看到类似这样的输出:
text
用户: 北京今天天气怎么样?
智能体决定调用工具: [‘get_weather’]
智能体: 北京今天晴,气温22℃,东南风2级。天气不错,适合外出活动。
用户: 帮我算一下 (125 + 37) × 8 等于多少?
智能体决定调用工具: [‘calculate’]
智能体: (125 + 37) × 8 = 162 × 8 = 1296。计算完成!
用户: 刚才那个城市的气温用华氏度是多少?
智能体决定调用工具: [‘get_weather’]
智能体: 北京今天气温22℃,换算成华氏度约为72°F(22 × 9/5 + 32 = 71.6°F)。
恭喜!你已经成功搭建了第一个能“思考并行动”的智能体。它不仅能回答问题,还能自主决定调用工具,并根据工具结果给出更准确的回答。
常见问题解答
Q1:为什么我的智能体不调用工具?
A:常见原因有三个:1)模型本身不支持函数调用(检查使用的模型版本);2)提示词中没有明确告诉它可以调用工具;3)工具定义有格式错误。建议先用支持的模型(如deepseek-chat或gpt-4o),并确保tools参数正确传入。
Q2:工具调用时出现“参数错误”怎么办?
A:检查JSON Schema定义是否与函数实际参数一致。例如,函数定义中参数名是city,但JSON Schema中写成location就会导致错误。
Q3:多轮对话后智能体会忘记上下文怎么办?
A:我们的代码已经通过conversation_history维护了短期记忆。如果对话特别长,可以考虑使用滑动窗口或向量数据库进行记忆压缩。
Q4:如何添加新的工具?
A:三步走:1)在tools列表中添加工具定义(JSON Schema);2)实现对应的工具函数;3)在工具分发逻辑中添加新的elif分支。这样就完成了扩展。
Q5:智能体回答太随机,如何让它更稳定?
A:调整temperature参数,值越低(如0.3)回答越确定;值越高(如0.9)越有创造性。同时,优化系统提示词,给模型更清晰的指令。
Q6:生产环境如何部署?
A:建议将智能体封装为HTTP服务(使用FastAPI等框架),部署在云函数或容器服务上。同时需要添加监控、日志和熔断机制保障稳定性。

结语:你的智能体,只是开始
从需求定义到架构设计,从基础对话到工具调用,你已经走完了智能体开发的全流程。那个能查天气、能算算术的“小助手”,虽然简单,却蕴含着智能体的核心思想:感知-规划-行动的闭环。
回顾开篇的问题——为什么别人的AI能做事,你的只能聊天?现在答案很清楚了:关键在于工具调用和自主规划能力。而你,已经掌握了这一切。
接下来,你可以往这几个方向迭代:
添加更多工具:接入真实天气API、数据库查询、邮件发送等
优化记忆机制:用向量数据库实现长期记忆
探索多智能体协作:让多个智能体分工完成复杂任务
部署上线:封装成API,集成到微信、钉钉等应用中
这需求、设计、实现三步走的过程中,你觉得哪一步最让你豁然开朗?或者你在动手实践中遇到了什么问题?欢迎在评论区分享交流。

【途傲科技实用指南】
如果你正在寻找专业的智能体开发人才,或者需要外包AI应用项目,途傲科技平台汇聚了百万技术服务商,能帮你快速匹配到合适的开发团队。
在任务大厅发布需求时,建议这样描述:“我们需要一个AI智能体开发工程师,搭建一个客服咨询智能体。技术要求:1)熟悉大模型API调用和Function Calling机制;2)有扣子或Dify等低代码平台实战经验者优先;3)需设计多轮对话流程和知识库检索;4)提供过往AI项目案例。预算范围XXXX元,可长期合作。”
在人才大厅寻找开发者时,可重点关注具备以下背景的服务商:有AI智能体或聊天机器人开发案例、熟悉主流LLM API集成、在提示词工程方面有经验、过往客户评价中“交付质量”评分高。

途傲科技的服务大厅提供智能匹配功能,输入你的需求关键词,系统会推荐符合条件的优质服务商。入驻平台的商铺可查看服务商的过往案例、客户评价和技术栈详情,帮助你做出更明智的选择。
雇主攻略学习:建议新用户先浏览平台上的“AI应用开发外包攻略”专题,了解从需求发布到项目验收的全流程注意事项。平台还提供一品商城服务,可以直接选购标准化的AI开发服务套餐,适合预算有限或需求明确的项目。

加入V客优享会员,能够获得专属顾问对接、优先推荐优质服务商、需求加急等权益,彻底改变你的工作方式,让专业的事交给专业的人。途傲科技,汇聚百万服务商,为你提供从AI开发到创意设计的全方位技术服务。