资讯动态

三、《从零手撸 Agent》 · system prompt 与核心参数:调好你的旋钮

发布时间:2026/9/6 12:27:43 来源:尧图企业网站定制
上一篇讲了 messages 的骨架。这一篇深入两个可调控的东西system prompt 怎么写才有效以及 API 的几个关键参数到底在控制什么。参数部分全部配实验建议边跑边读。一、system prompt写给模型的” 岗位说明书”1.1 一个对比例子不用 system promptmessages [{role: user, content: 帮我看看这段代码有什么问题x 5 / 0}]回答可能很啰嗦先讲什么是除法再讲异常处理体系最后才说 “你除以零了”用 system promptmessages [ {role: system, content: 你是一个代码审查员。只指出问题和修法每条不超过两行不讲背景知识。}, {role: user, content: 帮我看看这段代码有什么问题x 5 / 0}, ]回答除以零错误。改为先判断除数是否为 0或用 try/except 捕获 ZeroDivisionError。同样的问题输出天差地别。system prompt 决定模型” 用什么身份、什么方式” 回答。1.2 一个实用的 system prompt 模板有效的 system prompt 通常包含这四块按需取舍SYSTEM_PROMPT # 角色 你是一个Python代码审查助手。 # 行为规则 1. 只指出问题不重写整个文件 2. 每个问题格式[严重程度] 位置 - 问题 - 建议修法 3. 不确定的地方明确说不确定禁止猜测 # 输出格式 用Markdown列表输出最多5条按严重程度排序。 # 边界 如果代码与Python无关回复仅支持Python代码。 四块分别是角色你是谁→ 规则怎么做→ 格式输出长什么样→ 边界什么时候拒绝。1.3 写 system prompt 的三个新手误区误区一堆形容词。“你是一个非常非常专业的专家”—— 没用。模型不因为夸它而变强。要写可执行的规则不写情绪。误区二规则互相矛盾。“回答要详尽” “不超过 50 字”—— 模型只能随机服从一个。写完通读一遍删掉冲突项。误区三用否定句写期望行为。“不要啰嗦” 不如” 每条不超过两行”。模型对正向指令的服从度更高否定句只在划红线时用“禁止编造 API 名称”。二、参数详解每个都做实验2.1 temperature随机性旋钮原理一句话模型每生成一个 token其实是对所有候选词算出一个概率分布temperature 决定从这个分布里抽样时的” 冒险程度”。0永远选概率最高的词 → 同样输入几乎得到同样输出确定性越高如 1.5低概率词也有机会被选中 → 输出多变、有创意、也更不稳定实验代码同一个刁钻问题不同 temperature 各跑 3 次def ask(temp: float) - str: resp client.chat.completions.create( modeldeepseek-chat, temperaturetemp, messages[{role: user, content: 用一个比喻解释什么是递归一个词的比喻也算}], ) return resp.choices[0].message.content[:30] for t in (0, 0.7, 1.5): print(f--- temperature{t} ---) for _ in range(3): print( , ask(t))你会观察到t0 时三次输出几乎相同t1.5 时三次各不相同而且偶尔出现奇怪的比喻。怎么选场景推荐原因代码生成、数据抽取、分类0 ~ 0.3要稳定可复现日常对话、总结改写0.5 ~ 0.8平衡创意写作、起名字0.9 ~ 1.2要发散本系列属于 Agent 开发几乎全程 0~0.3—— 你要的是一个可靠的执行者不是艺术家。2.2 max_tokens输出长度上限resp client.chat.completions.create( modeldeepseek-chat, messages[...], max_tokens100, # 回答最多100个token超过就硬截断 )两个用途省钱护栏防止模型失控输出长文强制造短回答配合” 用一句话回答” 的提示效果更好注意一个坑如果输出被截断resp.choices [0].finish_reason 会是length而不是stop。调试时发现回答莫名断在半句话先检查这个字段print(resp.choices[0].finish_reason) # stop正常结束 length被截断2.3 model选哪个模型同一家通常有多个模型档位如 deepseek-chat /deepseek-reasoner规律普通对话模型快、便宜适合 Agent 里的常规节点推理模型reasoner 类贵、慢但复杂问题正确率高第 09 篇详解工程经验不要全程用最贵的。路由 / 格式化 / 简单判断用便宜模型关键决策才上推理模型 —— 这是成本工程的基本功。2.4 stream流式开关streamTrue# 逐 token 返回第 04 篇整篇讲它 这里先记住参数名即可。三、把参数和 system prompt 组合成一个可复用的函数从这篇开始我们会反复用到一个封装好的 chat () 函数建议存成 llm[_utils.py](_utils.py)后续文章直接 import# llm_utils.py import os from openai import OpenAI client OpenAI( api_keyos.environ[OPENAI_API_KEY], base_urlhttps://api.deepseek.com, ) def chat( messages: list[dict], model: str deepseek-chat, temperature: float 0.3, max_tokens: int 1024, ) - str: 统一封装的LLM调用。Agent开发默认低temperature。 resp client.chat.completions.create( modelmodel, messagesmessages, temperaturetemperature, max_tokensmax_tokens, ) if resp.choices[0].finish_reason length: print([警告] 输出被max_tokens截断) return resp.choices[0].message.content # 用法示例 if __name__ __main__: print(chat([ {role: system, content: 你是简洁的编程助手。}, {role: user, content: 一句话解释什么是异步编程。}, ]))封装的好处参数默认值统一所有调用都是 0.3截断警告自动打换模型只改一处。四、一个综合实验观察” 规矩” 的服从度测试 system prompt 在长对话中会不会失效system 你回答任何问题都只能用是或否。 history [{role: system, content: system}] for q in [Python是编程语言吗, 天空是蓝的吗, 详细介绍一下Python的历史, 详细讲讲图灵的故事]: history.append({role: user, content: q}) a chat(history, temperature0) history.append({role: assistant, content: a}) print(fQ: {q}\nA: {a[:50]}\n)典型现象前几轮严格答” 是 / 否”到后面开始” 越狱” 变长篇大论。结论system prompt 不是硬约束是软引导上下文越长服从度越低。两个对策重要格式要求在最后一轮 user 消息里再强调一次末尾指令服从度最高输出必须严格结构化时用代码解析 失败重试兜底而不是相信 prompt第 15 篇讲 OutputParser 的动机就在这五、小结system prompt 四块结构角色 → 规则 → 格式 → 边界写正向可执行的规则temperature 0~0.3 用于 Agent实验证明 0 确定性强max_tokens 是护栏检查 finish_reason 判断截断模型分档混用便宜模型干杂活推理模型干难活system prompt 会随对话变长而失效 —— 重要约束要末尾重申 代码兜底六、自测☐ 用四块结构给” 外卖推荐助手” 写一个 system prompt☐ 跑 temperature 实验亲眼看到 0 和 1.5 的差别☐ 把 max_tokens 设成 20 问一个长问题观察 finish_reason下一篇[04 流式输出] —— AI 是一个字一个字想出来的这个特性怎么用代码接住。写在最后写在最后如果想系统、完整地吃透 Harness、Hermes 整套前沿智能体开发体系完成从只会调模型到可控、高质量、可落地的 AI 工程交付进阶可以关注慕课网近期上新的《HarnessHermes 多智能体开发特训营》。 课程直达​https://class.imooc.com/sale/hagent

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价