Skip to content

s02 - 加入循环

上一章的代码只能说一句话。说完了,程序就结束了。 真正的 Agent 得一直听着——你说一句,它回一句,你再说,它再回。 这一章做的事情很简单:加一个循环。

这一章要解决什么问题

上一章的代码是一次性的。你改 messages 里的内容,运行,拿到回复,结束。

但 Agent 不是这样工作的。Agent 得持续运行——接收输入、处理、输出、再接收。就像你和 ChatGPT 的对话框,你不关掉它,它就一直在。

这一章的目标:让模型在终端里跟你持续对话。

代码

新建 agent.py(或直接改上一章的):

python
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["DEEPSEEK_API_KEY"],
    base_url="https://api.deepseek.com",
)

# 对话历史——模型只看得到你喂给它的消息
messages = []

print("对话开始,输入 exit 退出。\n")

while True:
    # 拿到用户输入
    user_input = input("你: ")

    # 退出条件
    if user_input.strip().lower() in ("exit", "quit"):
        print("再见。")
        break

    # 把用户消息加入历史
    messages.append({"role": "user", "content": user_input})

    # 发给模型(带着完整历史)
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages,
    )

    # 取出模型回复
    assistant_reply = response.choices[0].message.content

    # 把模型回复也加入历史
    messages.append({"role": "assistant", "content": assistant_reply})

    # 打印
    print(f"AI: {assistant_reply}\n")

运行:

bash
python agent.py

你会看到:

对话开始,输入 exit 退出。

你: 你好
AI: 你好!有什么可以帮你的吗?

你: 什么是 Agent
AI: Agent 是一种能够自主感知环境、做出决策并采取行动来完成目标的系统...

你: 能举个例子吗
AI: 当然!比如一个智能客服 Agent,它能接收用户的问题(感知),判断该查什么资料(决策)...

你: exit
再见。

发生了什么

跟上一章比,变化就一个:加了循环

while True:让它一直跑

python
while True:
    user_input = input("你: ")

while True 是 Python 里最简单的死循环。程序会一直执行循环体里的代码,直到遇到 break

input() 让程序暂停,等你在终端打字。你按下回车,拿到你输入的字符串。

退出条件

python
if user_input.strip().lower() in ("exit", "quit"):
    print("再见。")
    break

没有 break,程序会永远跑下去。所以得给一个出口。strip() 去掉首尾空格,lower() 统一小写——这样不管用户打 ExitEXIT 还是 exit,都能退出。

messages 在长什么

这是最关键的部分。messages 列表在循环里不断变长:

python
# 第一轮对话后
messages = [
    {"role": "user", "content": "你好"},
    {"role": "assistant", "content": "你好!有什么可以帮你的吗?"},
]

# 第二轮对话后
messages = [
    {"role": "user", "content": "你好"},
    {"role": "assistant", "content": "你好!有什么可以帮你的吗?"},
    {"role": "user", "content": "什么是 Agent"},
    {"role": "assistant", "content": "Agent 是一种能够自主感知..."},
]

每一轮,你把用户的话追加进去,再把模型的回复追加进去。下一轮发请求的时候,messages 里带着之前所有的对话。

模型能看到你发的全部历史。 这就是为什么它能记住你之前说了什么。不是模型有记忆——是你每次都把完整的对话记录重新发给它。

上一章 vs 这一章

s01s02
messages 是硬编码的列表messages 是动态增长的列表
运行一次就结束循环运行,直到用户退出
模型只看到你写的那几条消息模型看到完整的对话历史

试着改改

1. 加一个 system message

在循环之前加一行:

python
messages = [
    {"role": "system", "content": "你是一个用中文回答的助手,每次回复不超过三句话。"},
]

system 角色的消息不会显示给用户,但模型会看到。它用来设定模型的行为方式。试试看模型的回复风格有没有变化。

2. 打印 messages 的长度

print(f"AI: ...") 后面加:

python
print(f"  (对话记录已有 {len(messages)} 条消息)\n")

多聊几轮,看看数字怎么变。

3. 清空历史

加一个命令,比如用户输入 clear 时清空 messages

python
if user_input.strip().lower() == "clear":
    messages = []
    print("对话已清空。\n")
    continue

continue 的意思是跳过本轮循环剩下的代码,直接回到循环开头。

教学边界

这一章只做一件事:让模型在循环里持续对话。

不涉及:

  • 工具(模型只能聊天,不能调用搜索、计算等)
  • 流式输出(回复还是一次性返回)
  • 多 Agent 协作
  • 任何持久化(关掉程序,对话历史就没了)

这些都在后面的章节里。现在你只需要理解一件事:

messages 列表就是模型的"记忆"。你每轮把它喂给模型,模型就能基于整个对话历史来回复。记忆不是模型自带的——是你构建的。

一句话记住

Agent 的第二步,是加一个循环,让 messages 列表不断生长——模型的记忆,就是你传给它的完整对话历史。