- 复盘本周学了啥,别学了就忘(搞定!✅)
- 搞懂 Token 到底是啥,为啥和字数不一样(搞定!✅)
- 理解 Context Window,知道为啥对话越长越慢(搞定!✅)
- 弄明白 AI 是怎么"一个字一个字"生成内容的(搞定!✅)
- 学会 System Prompt、Few-shot 这些进阶技巧(搞定!✅)
四天下来,其实就干了这几件事:
看起来是四个独立的东西,其实背后都有共同的原理。今天来挖一挖。
你调用 API 的时候,返回结果里一直有个 usage:
{
"usage": {
"prompt_tokens": 15, "completion_tokens": 32, "total_tokens": 47
} }
之前没细说,今天解释一下:
prompt_tokens 你发过去的内容,消耗了多少 token
completion_tokens AI 回的内容,消耗了多少 token
total_tokens 加起来,这次对话总共花了多少
重要在哪?
- API 收费按 token 收,不按字数
- token 太多会超限(后面讲 Context Window)
- token 越多处理越慢
这是最容易误解的地方。
Token 是大模型处理文本的"最小单位",但一个 token 不等于一个字!
英文:
"hello" → 1 token "apple" → 1 token "ChatGPT" → 2-3 tokens
中文: "你好" → 1-2 tokens(看模型) "人工智能" → 2-4 tokens "好好学习天天向上" → 6-8 tokens
为什么会这样?
模型处理文本前,要先把文本"切开",这个过程叫 Tokenization(分词)。
不同模型切的方法不一样:
- GPT 用 BPE(Byte Pair Encoding)
- Claude 有自己的分词器
- 中文模型可能按字切,也可能按词切
反正记住:中文比英文"费 token",一个汉字可能要 1-2 个 token,英文一个词基本就 1 个 token。
别光听我说,自己跑一下看看:
# 测不同内容的 token 消耗
test_cases = [
"hello", "hello world", "你好", "你好,很高兴认识你", "The quick brown fox jumps over the lazy dog"
]
for text in test_cases:
data = { "model": "your-model", "messages": [{"role": "user", "content": text}] } response = requests.post(url, headers=headers, json=data) usage = response.json()["usage"] print(f"'{text}' → {usage['prompt_tokens']} tokens")
跑出来大概是这样:
'hello' → 1 token
‘hello world’ → 2 tokens ‘你好’ → 1-2 tokens ‘你好,很高兴认识你’ → 4-8 tokens
- 写 prompt 别写废话,省 token 省钱
- 成本估算用 token 数算,别用字数
- 英文比中文省钱(如果内容可以英文表达)
当时说:
越聊越慢,甚至报错 咋回事:messages 太长了,token 超限 咋办:删掉最早的部分历史
今天解释一下背后的原理。
简单说:模型一次能"记住"的最大 token 数量。
就像人的短期记忆有上限一样,模型也有:
注意 :这个限制是你发的 + AI 回的,加起来不能超过。
你的 messages 是这样一点点变长的:
聊了 1 轮:messages 里有 2 条 ≈ 20 tokens 聊了 10 轮:messages 里有 20 条 ≈ 200 tokens 聊了 100 轮:messages 里有 200 条 ≈ 2000 tokens 聊了 500 轮:... ≈ 10000 tokens → 可能超了!
超了会咋样?
- API 报错:
context_length_exceeded - 或者模型直接"失忆",忘了前面的内容
方法一:滑动窗口(只留最近的)
MAX_HISTORY = 10 # 只留最近 10 条
每次对话后检查
if len(messages) > MAX_HISTORY:
messages = messages[-MAX_HISTORY:] # 删掉最早的
简单粗暴,大部分场景够用。
方法二:摘要压缩
对话太长了,让 AI 总结一下前面的内容:
if len(messages) > 20: # 让 AI 总结 summary = call_ai("请一句话总结这段对话:" + str(messages[:-4])) # 用摘要替换历史 messages = [{"role": "system", "content": "之前聊过:" + summary}] + messages[-4:]
方法三:关键信息单独存
# 用户的重要信息单独记
user_info = {"name": "小明", "goal": "学英语"}
每次对话都带上
system_prompt = f"用户叫{user_info[‘name’]},目标是{user_info[‘goal’]}"
这样即使删了历史,关键信息也不会丢。
Day 3 学流式输出,AI 一个字一个字蹦:
AI:Python是...一种...编程语言...
这其实暴露了 AI 的生成方式:它不是想好整个答案再说出来,而是猜一个词,再猜下一个,再猜下一个...
你问:"今天天气"
AI 猜下一个词可能是: "很好" (30%) "不错" (25%) "很差" (10%)
选了"很好",输入变成"今天天气很好" 再猜下一个词…
一直猜下去,直到:
- 碰到结束符号
- 超过 max_tokens
- 你中断
所以流式输出能工作,是因为模型本来就是逐 token 生成的,只是普通模式是"憋完再给你",流式是"猜出一个就给你一个"。
现在你能更好理解 temperature 了。
Temperature 影响的是"猜词的概率分布"
下一个词的候选:
"很好" → 30% "不错" → 25% "还行" → 20%
temperature = 0.1(低温): "很好"的概率被放大到 80% → 更容易选它 → 输出稳定
temperature = 1.5(高温): 概率变得平均,每个词都差不多 → 低概率词也有机会 → 输出随机、有创意
简单说:
- 低 temperature → AI 更"保守",选最可能的词
- 高 temperature → AI 更"大胆",可能选意想不到的词
top_p 只从累计概率达到 p 的词里选
top_k 只从概率最高的 k 个词里选
frequency_penalty 惩罚重复出现的词
presence_penalty 惩罚已经出现过的词(鼓励新话题)
top_p 和 temperature 的区别:
temperature 是"调整概率分布的陡峭程度",top_p 是"直接砍掉低概率词"。
top_p=0.9:
按概率排序,累计达到 90% 的词保留,其他扔掉 → 扔掉那些特别离谱的选项
top_p=0.1: 只保留累计 10% 的词(可能就 1-2 个) → 更精准、更保守
一般只用 temperature 就够了,需要更精准时可以配合 top_p。
之前的 messages 都是这样的:
messages = [{"role": "user", "content": "你好"}]
其实还有个 system role:
messages = [ {"role": "system", "content": "你是教三年级小朋友的英语老师"}, {"role": "user", "content": "讲一下 cat"}
]
system 设定 AI 的身份、性格、规则
user 你的问题
assistant AI 的回复
system 的优先级最高,影响整场对话。
没 system:
你:"讲一下 cat" AI:"cat 是猫科动物,学名 Felis catus…"(太学术)
有 system:"你是教小朋友的英语老师" 你:"讲一下 cat" AI:"小朋友们,cat 就是小猫咪!喵喵叫,很可爱哦~"
# 设角色
{"role": "system", "content": "你是资深 Python 程序员"}
设输出格式
{"role": "system", "content": "用 JSON 格式回复"}
设规矩
{"role": "system", "content": "回答不超过 50 字,不确定就说’不知道’"}
设知识范围
{"role": "system", "content": "你只知道三年级英语单词"}
{"role": "user", "content": "翻译成英文:你好"}
先给几个示例,再让 AI 做同样的事:
messages = [ {"role": "user", "content": "翻译成英文:你好"}, {"role": "assistant", "content": "Hello"}, {"role": "user", "content": "翻译成英文:谢谢"}, {"role": "assistant", "content": "Thank you"}, {"role": "user", "content": "翻译成英文:很高兴认识你"} # AI 会学着格式回答
]
AI 看到示例后,会模仿同样的格式输出。
- 需要 AI 输出特定格式
- 任务规则复杂,说不清楚
- 分类任务(给几个分类示例)
你:"小明有5个苹果,给小红2个,又买了3个,现在几个?"
AI:"6个"(可能直接跳答案,中间算错)
{"role": "user", "content": "小明有5个苹果,给小红2个,又买了3个,现在几个?请一步步思考"}
AI 会这样回答:
让我一步步想:
- 小明原本有 5 个
- 给小红 2 个,剩 5-2=3 个
- 又买了 3 个,变成 3+3=6 个 答案:6 个
准确率会高很多。
- 数学题、逻辑题
- 需要推理的任务
- 复杂分析
程序处理 JSON 最方便,直接转成字典。
prompt = f"""
讲解单词 ‘{word}‘,返回 JSON 格式: { "word": "单词", "meaning": "中文意思", "phonetic": "音标", "example": "例句" } 只返回 JSON,别加别的。 """
AI 返回:
{
"word": "cat", "meaning": "猫", "phonetic": "kæt", "example": "I have a cat." }
import json
result = call_ai(prompt) word_info = json.loads(result) # 直接转字典 print(word_info["meaning"]) # 输出:猫
昨天做的英语 Agent,其实已经是个简单的 Agent 了。
Agent = 大模型 + 工具 + 记忆 + 决策
用户输入 → Agent 想想该干啥 → 选工具 → 执行 → 看结果 → 输出
这是 Agent 的经典套路:
Thought(想):用户想学 cat,我得讲解
Action(做):调用 explain_word("cat") Observation(看):拿到结果 "cat 是猫…" Answer(答):整理输出给用户
你的英语 Agent 已经是这个模式了,只是用 Python 逻辑判断的。
Agent 得记住东西:
- 短期记忆:当前对话(messages 数组)
- 长期记忆:用户偏好、学习进度
短期你已经有了,长期可以这样加:
user_memory = { "learned_words": ["cat", "dog"], # 学过的 "wrong_words": ["elephant"], # 错过的
}
system_prompt = f"用户学过:{user_memory[‘learned_words’]}"
下一步可以学:让 AI 自己决定调用哪个函数。
tools = [ { "type": "function", "function": { "name": "explain_word", "description": "讲解单词", "parameters": { "type": "object", "properties": { "word": {"type": "string", "description": "单词"} }, "required": ["word"] } } }
]
发请求带上 tools
data = {"model": "xxx", "messages": messages, "tools": tools}
AI 返回说要调用函数
response["choices"][0]["message"]["tool_calls"] = [
{"id": "call_123", "function": {"name": "explain_word", "arguments": '{"word": "cat"}'}}
]
你执行函数,把结果返回给 AI
result = explain_word("cat") messages.append({"role": "tool", "tool_call_id": "call_123", "content": result})
流程:
- 定义 tools
- 发请求带 tools
- AI 返回要调哪个函数
- 你执行,把结果返回
- AI 继续回复
咋回事:中文 token 不是按字算的,一个汉字可能 1-2 token
咋办:别用字数估算成本,用 token 数算
咋回事:messages 太长,超过 Context Window 限制了
咋办:用滑动窗口,只保留最近 N 条消息
咋回事:没设 system prompt,AI 不知道自己是谁
咋办:加 system role,设定身份和规则
咋回事:没给示例,AI 不知道你想要啥格式
咋办:用 Few-shot,给几个示例让它学着
咋回事:直接跳答案,中间推理错了
咋办:加"请一步步思考",用 Chain-of-Thought
咋回事:max_tokens 是"最多说多少",不是"要求说多少"
咋办:根据场景设合适的值,简短回答 50-100,讲解 300-500,故事 500+
今天干了啥:
✅ 复盘了本周四天的学习内容
✅ 搞懂了 Token 是啥,为啥和字数不一样
✅ 理解了 Context Window,知道咋管理对话历史
✅ 弄明白了 AI 是逐 token 生成的
✅ 学会了 System Prompt、Few-shot、CoT 这些技巧
✅ 知道了 Agent 开发的框架
下周目标:把这些理论变成代码,继续升级英语 Agent。
记于 2026-04-08,Week 1 总结,理论补齐了!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/251880.html