2.从零制作第一个天气 Agent:理解 Prompt、Skill 与 LangChain

目录

  • [一、什么是 Prompt、Skill 和 Agent](#一、什么是 Prompt、Skill 和 Agent)
  • [二、制作Agent为什么选择 LangChain参与制作](#二、制作Agent为什么选择 LangChain参与制作)
  • [三、制作第一个天气 Agent](#三、制作第一个天气 Agent)
    • [1. 创建虚拟环境](#1. 创建虚拟环境)
    • [2. 安装依赖](#2. 安装依赖)
    • [3. 配置 DeepSeek API Key](#3. 配置 DeepSeek API Key)
    • [4. 编写代码](#4. 编写代码)
  • [四、这个天气程序为什么能称为 Agent](#四、这个天气程序为什么能称为 Agent)
  • [五、如何逐步熟练掌握 Agent](#五、如何逐步熟练掌握 Agent)
  • [六、下一步:制作一个本地笔记问答 Agent](#六、下一步:制作一个本地笔记问答 Agent)

从零制作第一个天气 Agent:理解 Prompt、Skill 与 LangChain

一、什么是 Prompt、Skill 和 Agent

可以用"员工做事"来理解它们之间的关系。

  • Prompt(提示词):工作说明书。它规定 Agent 的角色、规则和回答方式。
  • Skill(技能):可执行的具体能力,例如查天气、读文件、查数据库、发送邮件。
  • Agent(智能体):能够理解用户目标,决定是否调用技能、调用哪个技能,并根据结果继续完成任务的系统。

它们的关系如下:

text 复制代码
用户的自然语言需求
        ↓
Agent 理解需求
        ↓
Prompt 约束 Agent 的行为
        ↓
Agent 选择合适的 Skill/Tool
        ↓
Skill 执行具体动作并返回结果
        ↓
Agent 组织最终回答

需要注意:模型本身擅长理解和生成语言,但它并不天然拥有实时数据、文件访问或执行能力。Skill 给它行动能力,Agent 则负责调度模型和 Skill。


二、制作Agent为什么选择 LangChain参与制作

LangChain 不是模型,也不是天气接口,而是连接模型与外部工具的框架。

在本例中,LangChain 主要完成三件事:

  1. 把 Python 函数包装成模型可以理解的工具。
  2. 把工具说明、Prompt 和用户问题发送给模型。
  3. 管理"模型调用工具 → 工具返回结果 → 模型继续回答"的循环。

使用 LangChain 的好处是:

  • 可以较方便地切换 DeepSeek、OpenAI、Claude 或本地模型;
  • 可以快速给 Agent 增加多个工具;
  • 后续可以加入记忆、检索、权限、人工审批和日志追踪;
  • 不需要手动解析模型发出的工具调用指令。

三、制作第一个天气 Agent

1. 创建虚拟环境

在项目目录打开 PowerShell:

powershell 复制代码
python -m venv .venv
.venv\Scripts\Activate.ps1

如果 PowerShell 拦截激活脚本:

powershell 复制代码
Set-ExecutionPolicy -Scope Process Bypass
.venv\Scripts\Activate.ps1

2. 安装依赖

powershell 复制代码
python -m pip install -U langchain langchain-openai requests python-dotenv

依赖用途:

作用
langchain 创建和运行 Agent
langchain-openai 通过 OpenAI 兼容协议连接 DeepSeek
requests 请求天气服务
python-dotenv .env 文件读取 API Key

3. 配置 DeepSeek API Key

main.py 同级目录创建 .env 文件:

env 复制代码
DEEPSEEK_API_KEY=你的_DeepSeek_API_Key

不要把 API Key 写进代码,也不要把 .env 上传到 GitHub。DeepSeek获取API KEY的方法可以参考----获取 API Key 与调用 API 步骤详解

4. 编写代码

创建 main.py

python 复制代码
import os

import requests
from dotenv import load_dotenv
from langchain.agents import create_agent
from langchain.tools import tool
from langchain_openai import ChatOpenAI

load_dotenv()


@tool
def get_weather(city: str) -> str:
    """查询指定城市当前的实时天气。

    参数:
        city: 城市名称,例如"成都""上海"或"Tokyo"。

    返回:
        当前天气、温度、体感温度、湿度和风速。
    """
    try:
        response = requests.get(
            f"https://wttr.in/{city}",
            params={"format": "j1", "lang": "zh"},
            timeout=10,
        )
        response.raise_for_status()

        current = response.json()["current_condition"][0]
        description = current["weatherDesc"][0]["value"]

        return (
            f"{city}当前天气:{description};"
            f"温度 {current['temp_C']}°C;"
            f"体感温度 {current['FeelsLikeC']}°C;"
            f"湿度 {current['humidity']}%;"
            f"风速 {current['windspeedKmph']} km/h。"
        )

    except requests.RequestException as error:
        return f"天气服务请求失败:{error}"
    except (KeyError, IndexError, ValueError):
        return "天气服务返回的数据格式无法解析。"


model = ChatOpenAI(
    model="deepseek-v4-flash",
    api_key=os.environ["DEEPSEEK_API_KEY"],
    base_url="https://api.deepseek.com",
    temperature=0,
)

agent = create_agent(
    model=model,
    tools=[get_weather],
    system_prompt="""
你是一个中文天气助理。

规则:
1. 用户询问某个地点的当前天气时,必须调用 get_weather 工具。
2. 不允许凭记忆编造实时天气。
3. 如果工具调用失败,需要如实说明。
4. 回答应简洁、清楚。
""",
)

result = agent.invoke(
    {
        "messages": [
            {
                "role": "user",
                "content": "成都现在天气怎么样?",
            }
        ]
    }
)

print(result["messages"][-1].content)

最终的文件结构如下图所示:

运行:

powershell 复制代码
python main.py

最终运行结果

四、这个天气程序为什么能称为 Agent

如果只是普通 Python 程序,通常会写成:

python 复制代码
weather = get_weather.invoke({"city": "成都"})
print(weather)

在这段代码中,开发者已经写死了:

  • 调用哪个函数;
  • 参数是什么;
  • 什么时候调用。

而天气 Agent 的流程不同:

text 复制代码
用户:"成都现在天气怎么样?"
        ↓
模型理解用户想获取"实时天气"
        ↓
模型发现 get_weather 是合适的工具
        ↓
模型从句子中识别地点"成都"
        ↓
模型生成工具调用:get_weather(city="北京")
        ↓
LangChain 执行 Python 工具
        ↓
工具请求天气网站并返回数据
        ↓
模型根据工具结果生成最终回答

因此,它不只是从文字中"提取关键字",而是结合以下信息进行判断:

  • 用户的自然语言需求;
  • Prompt 中规定的行为规则;
  • 工具的名称、描述和参数;
  • 工具执行后返回的结果。

这就是 Agent 的基本循环:

text 复制代码
理解目标
→ 选择行动
→ 调用工具
→ 观察结果
→ 生成回答或继续行动

目前的天气 Agent 只有一个工具,因此它是一个功能较单一的入门 Agent。但它已经具备 Agent 的核心结构。


五、如何逐步熟练掌握 Agent

初学 Agent 时,最容易犯的错误是:一上来就想做一个万能 Agent。

例如希望一个 Agent 同时具备搜索、写代码、读文件、操作数据库、生成报告、发邮件和多 Agent 协作能力。这样会导致问题难以定位,也很难理解每个模块的作用。

更好的方法是:每次只做一个小 Agent,并且每次只增加一项新能力。

推荐学习路线如下:

阶段 小项目 重点能力
第一阶段 天气 Agent 工具调用、自然语言转参数
第二阶段 本地文件问答 Agent 文件读取、检索、基于资料回答
第三阶段 待办事项 Agent 多工具选择、增删改查、状态管理
第四阶段 自动报告 Agent 查询数据、分析数据、生成文档
第五阶段 客服或订单 Agent 业务规则、权限、人工确认
第六阶段 多 Agent 协作 规划、执行、审核分工

制作每个 Agent 前,可以先问自己四个问题:

  1. 用户希望它完成什么具体目标?
  2. 它需要哪些工具才能完成目标?
  3. 哪些动作不能由它自动执行,例如删除数据、退款、发送消息?
  4. 如何验证它真的完成了任务,而不只是"声称完成了"?

六、下一步:制作一个本地笔记问答 Agent

天气 Agent 解决的是"获取实时外部信息"。

下一步可以制作"本地 Markdown 笔记问答 Agent",它解决的是"从自己的资料中寻找答案"。

用户可以这样提问:

text 复制代码
我的笔记中有哪些关于 Python 装饰器的内容?
请总结成三点,并保存成一张复习卡片。

这个 Agent 的整体思路可以是:

text 复制代码
用户提出问题
        ↓
Agent 判断需要查询本地笔记
        ↓
搜索 notes 文件夹中的相关 Markdown 文件
        ↓
读取相关文件内容
        ↓
根据文件内容总结答案
        ↓
将总结结果保存为新的复习卡片

它未来可以拥有的 Skill 包括:

text 复制代码
search_notes(keyword)      # 搜索笔记
read_note(filename)        # 读取笔记
save_summary(title, text)  # 保存总结
list_tasks()               # 查看学习任务
add_task(task)             # 新增学习任务

这个项目比天气 Agent 更接近实际使用场景,也能帮助理解 Agent 的更多核心能力:工具设计、知识检索、上下文管理、文件读写、结果可信度与权限控制。

从小而明确的 Agent 开始,逐步增加一个工具、一条规则或一种能力,比直接追求"万能 Agent"更容易真正掌握 Agent 的制作与使用。

相关推荐
知了一笑1 小时前
AI知识库,是捷径吗?
人工智能·ai·知识库
风雨中的小七1 小时前
和AI一起搞事情#8. 分析1000+对话得到:技能炼金术
prompt
xiezhr1 小时前
每天白嫖 WorkBuddy 100 积分,我让WorkBuddy自己领
ai·ai agent·workbuddy
linqiw10 小时前
Embabel 上手:Java Agent 是怎么干活的
agent
TechEdu20260611 小时前
[人工智能]AI芯片家族与产品目录指南
人工智能·ai
不会写代码的女程序猿11 小时前
中小康养门店选型参考|明理 AI 四诊仪场景适配与投入回报分析
大数据·人工智能·科技·ai·健康医疗