AIGC标识 Hello-Agent学习笔记-Day0

Day 1|从 Win10 到第一个智能体:环境配置全记录

社畜加班、笔记是Agent总结的。跑通效果:


image

学习打卡 · 《Hello-Agents 从零开始构建智能体》第一章
主线:Win10 → WSL2 → conda → pip → .env → 5 分钟跑通第一个智能体


今天的目标只有一个:把环境打通,然后亲手跑起来一个能自己决定"下一步调什么工具"的智能体。

不是聊天机器人 —— 是一个会自己规划、调工具、看结果、再决策的循环体。

Win10 → WSL2(Ubuntu 22.04) → conda create → pip install → .env 配 Key → QuickStart.py 跑通

全程约 40 分钟,其中真正写代码的部分不到 5 分钟。


一、Win10 → WSL2:为什么不用原生 Windows

第一章的代码本身在 Windows 上也能跑,但后面章节要碰 Docker、向量库、Neo4j、LlamaIndex,这些在 Linux 下少踩很多坑。所以第一天直接把环境落在 WSL2 里,一劳永逸。


二、conda 建环境

conda create -n agent python=3.12 -y
conda activate agent

单独建环境是为了和已有的 base / rag 隔开,避免依赖打架。

python --version   # Python 3.12.14

三、装依赖

第一章只需要四个包:

pip install requests tavily-python openai python-dotenv
包 作用
requests 调 wttr.in 查天气
tavily-python AI 搜索,用来推荐景点
openai 调 LLM(任何兼容 OpenAI 接口的服务都能用)
python-dotenv 从 .env 读密钥,不把 Key 写进代码

装了 python-dotenv 之后,所有密钥都能从代码里挪出去,这点很关键 —— 见下一节。


四、配 API Key:用 .env,别写死在代码里

这一步最容易出问题,因为密钥泄露往往就发生在这里。

在项目根目录建一个 .env:

LLM_MODEL_ID="deepseek-flash"
LLM_API_KEY="sk-xxxxxxxx"
LLM_BASE_URL="https://api.deepseek.com/v1"
LLM_TIMEOUT=60

TAVILY_API_KEY="tvly-xxxxxxxx"

然后代码里:

from dotenv import load_dotenv
import os

load_dotenv("/mnt/wsl/data/hello-agents/.env")

API_KEY  = os.getenv("LLM_API_KEY")
BASE_URL = os.getenv("LLM_BASE_URL")
MODEL_ID = os.getenv("LLM_MODEL_ID")

这里有个设计上的好处:因为走的是 OpenAI 兼容接口,只要改 LLM_BASE_URL 和 LLM_MODEL_ID,就能在 DeepSeek / Qwen / Moonshot 之间随便换,代码一行不用动。

踩坑 2:.env 必须加进 .gitignore。我第一版图省事把 Key 直接写在了脚本里,后来翻 git 记录才清掉 —— 一旦提交,Key 就等于公开了,只能去后台吊销重发。
教训:密钥进代码 = 迟早要吊销。


五、5 分钟实现第一个智能体

核心思路:Thought → Action → Observation

第一章最重要的概念就这一个循环:

Thought:       我要先查天气
Action:        get_weather(city="北京")
                 ↓ 执行工具
Observation:   北京当前天气:晴,气温 25 摄氏度,微风
                 ↓ 反馈给 LLM
Thought:       天气不错,该推荐户外景点了
Action:        get_attraction(city="北京", weather="晴")
                 ↓
Observation:   ...
Action:        finish(answer="...")

LLM 负责想,代码负责做,结果再喂回去让 LLM 继续想。 这就是智能体和普通聊天机器人的分水岭 —— 它会根据真实世界的返回结果改变下一步行动。

三个关键文件

1. 系统提示词(智能体的"说明书")

AGENT_SYSTEM_PROMPT = """
你是一个智能旅行助手。你的任务是分析用户的请求,并使用可用工具一步步地解决问题。

# 可用工具:
- `get_weather(city: str)`: 查询指定城市的实时天气。
- `get_attraction(city: str, weather: str)`: 根据城市和天气搜索推荐的旅游景点。

# 行动格式:
Thought: [你的思考过程和下一步计划]
Action: [你要调用的工具,格式为 function_name(arg_name="arg_value")]

# 任务完成:
收集到足够信息后,用 finish(answer="...") 输出最终答案。
"""

重点是约束输出格式。LLM 不按格式回,后面的正则就解析不出来。

2. 工具就是普通 Python 函数

def get_weather(city: str) -> str:
    url = f"https://wttr.in/{city}?format=j1"
    data = requests.get(url).json()
    c = data['current_condition'][0]
    return f"{city}当前天气:{c['weatherDesc'][0]['value']},气温{c['temp_C']}摄氏度"

available_tools = {
    "get_weather": get_weather,
    "get_attraction": get_attraction,
}

用个字典把函数名映射到函数对象,主循环就能按名字动态调用 —— 这是后面所有 Agent 框架工具注册表的雏形。

3. 主循环

prompt_history = [f"用户请求: {user_prompt}"]

for i in range(5):                      # 最多 5 轮,防死循环
    llm_output = llm.generate("\n".join(prompt_history), AGENT_SYSTEM_PROMPT)
    prompt_history.append(llm_output)

    action_str = re.search(r"Action: (.*)", llm_output, re.DOTALL).group(1).strip()

    if action_str.startswith("finish"):
        break                            # 任务完成

    tool_name = re.search(r"(\w+)\(", action_str).group(1)
    kwargs = dict(re.findall(r'(\w+)="([^"]*)"', action_str))

    observation = available_tools[tool_name](**kwargs)
    prompt_history.append(f"Observation: {observation}")

跑起来:

cd /mnt/wsl/data/hello-agents/self
python QuickStart.py

输入"帮我查一下今天北京的天气,然后根据天气推荐一个景点",就能看到它自己分两步把任务做完。

踩坑 3:模型把思考过程也吐出来了

我用的模型默认会输出思考链,导致 Action: 解析错位。解法是调用时显式关掉:

extra_body = {
    "enable_thinking": False
}
response = self.client.chat.completions.create(
    model=self.model,
    messages=messages,
    extra_body=extra_body
)

用了支持思考的模型(Qwen / DeepSeek 等)时,这一步基本是必踩的。

踩坑 4:结束格式对不上

书里第一版用的是 Action: Finish[最终答案],但新版 hello-agents 框架统一成了 finish(answer="...")。

两处都要改,而且必须一致:

  • system prompt 里的说明
  • 主循环里的 action_str.startswith("finish") 和取值正则

改了一处忘了另一处,表现就是模型答完了但循环不退出,白白跑满 5 轮。


六、今日产出

  • ✅ WSL2 + conda agent 环境(Python 3.12.14)
  • ✅ 项目统一 .env,密钥零硬编码
  • ✅ 手写 ReAct 循环跑通,智能体能自主调用两个真实工具
  • ✅ 摸清了 Thought / Action / Observation 这个贯穿全书的循环

最大的感受:所谓"智能体"没有想象中玄乎。核心就是一个 while 循环 + 一段格式约束 + 一个函数字典。真正的复杂度在怎么让 LLM 稳定地按格式输出。


明日计划

读第二章(智能体发展史),然后开始第四章 —— 把今天这个手写循环重构成可以复用的框架。


本文是《Hello-Agents》学习打卡第 1 天。项目地址:datawhalechina/Hello-Agents

posted @ 2026-09-15 01:13  HVAC_Coder  阅读(16)  评论(0)    收藏  举报