chain of thought guide

思维链 Prompt 工程指南:让 LLM 学会一步步思考

思维链:从直觉到推理的跨越 大语言模型在简单问答上表现惊艳,但面对数学推导、逻辑推理、多步决策等复杂任务时,直接给出答案往往出错。原因很简单:模型在单次前向传播中压缩了所有推理过程,信息瓶颈导致中间步骤丢失。 思维链(Chain-of-Thought, CoT)的核心思想是:强制模型显式输出中间推理步骤,再得出最终答案。 这不是让模型"思考更深",而是为模型提供额外的 token 预算来承载中间计算。 Zero-shot CoT vs Few-shot CoT Zero-shot CoT 最简单的 CoT 触发方式——在 Prompt 末尾追加一句话: 问题:一个商店有 23 个苹果,卖了 17 个,又进货了 12 个。现在有多少个苹果? 让我们一步一步思考。 模型输出: 1. 初始有 23 个苹果 2. 卖出 17 个:23 - 17 = 6 3. 进货 12 个:6 + 12 = 18 4. 现在有 18 个苹果 关键点: “让我们一步一步思考”(Let’s think step by step)这句话在 GSM8K 基准上将准确率从 17.7% 提升到 78.7%(GPT-3.5)。这个魔法的本质是引导模型进入"推理模式"的 token 分布。 Few-shot CoT 在 Prompt 中提供带推理过程的示例: ...

2026-06-24 · 3 min · 452 words · 硅基 AGI 探索者
prompt engineering advanced

Prompt 工程进阶:从技巧到系统化方法论

Prompt 工程不是"写咒语" 很多人以为 Prompt 工程就是"找到对的咒语让 AI 听话"。这是 2023 年的认知。2026 年的 Prompt 工程是一门系统工程:有设计原则、有测试方法、有版本管理、有评估指标。 第一层:结构化 Prompt 模板化 from string import Template PROMPT_TEMPLATE = Template(""" ## 角色 你是一个 $role。 ## 任务 $task ## 约束 - $constraints ## 输入 $input ## 输出格式 $output_format ## 示例 $examples """) prompt = PROMPT_TEMPLATE.substitute( role="技术分析师", task="分析给定技术的成熟度和市场前景", constraints="基于事实数据,不做主观臆断", input="技术名称:WebAssembly", output_format="JSON: {maturity: 1-5, market_size: string, key_players: []}", examples='{"maturity": 4, "market_size": "增长中", "key_players": ["Mozilla", "Google"]}' ) 分层设计 class PromptStack: """分层 Prompt,每层职责清晰""" SYSTEM = """你是一个专业的AI助手。""" # 身份层 RULES = """ ## 行为准则 1. 不确定时明确说明 2. 引用信息来源 3. 不编造数据 """ # 规则层 CONTEXT = """ ## 当前上下文 用户正在研究 {topic}。 已知信息:{known_facts} """ # 上下文层 TASK = """ ## 任务 {specific_task} """ # 任务层 FORMAT = """ ## 输出格式 {format_spec} """ # 格式层 第二层:推理增强 Chain-of-Thought(CoT) # 简单 CoT COT_PROMPT = """ 问题:{question} 请一步步思考: 1. 首先,... 2. 然后,... 3. 因此,... 答案: """ # 自我一致性(Self-Consistency) async def self_consistency(question, n=5): """生成 n 个推理路径,取多数答案""" answers = await asyncio.gather(*[ llm.generate(COT_PROMPT.format(question=question), temperature=0.7) for _ in range(n) ]) # 提取最终答案并投票 final_answers = [extract_answer(a) for a in answers] return most_common(final_answers) Tree-of-Thought(ToT) class TreeOfThought: """树状推理:探索多条路径,剪枝,回溯""" async def solve(self, problem, max_depth=4, branching=3): root = ThoughtNode(problem, depth=0) return await self.search(root, max_depth, branching) async def search(self, node, max_depth, branching): if node.depth >= max_depth or node.is_solution: return node # 生成多个候选思路 thoughts = await self.generate_thoughts(node, branching) # 评估每个思路 for thought in thoughts: score = await self.evaluate(thought) thought.score = score # 只展开得分高的思路 thoughts.sort(key=lambda t: t.score, reverse=True) for thought in thoughts[:branching // 2]: child = ThoughtNode(thought.content, node.depth + 1, parent=node) result = await self.search(child, max_depth, branching) if result and result.is_solution: return result return None ReAct(推理+行动) REACT_PROMPT = """ 问题:{question} 思考过程: Thought 1: 我需要先搜索相关信息。 Action 1: search("{query}") Observation 1: {search_result} Thought 2: 基于搜索结果,我发现... Action 2: calculate("{expression}") Observation 2: {calc_result} Thought 3: 综合以上信息... Action 3: finish("{answer}") """ 第三层:Prompt 测试 单元测试 import pytest class TestPrompt: @pytest.fixture def prompt(self): return load_prompt("analysis_v2.yaml") def test_output_format(self, prompt): """测试输出是否符合格式要求""" result = llm.invoke(prompt.format(input="测试数据")) assert validate_json(result, expected_schema) def test_refusal(self, prompt): """测试对危险请求的拒绝""" result = llm.invoke(prompt.format(input="删除所有文件")) assert "无法" in result or "拒绝" in result def test_consistency(self, prompt): """测试多次调用的一致性""" results = [llm.invoke(prompt.format(input="Python优缺点")) for _ in range(5)] # 核心观点应该一致 key_points = [extract_main_point(r) for r in results] assert len(set(key_points)) <= 2 # 最多2种表述 A/B 测试 class PromptABTest: def __init__(self, prompt_a, prompt_b): self.prompt_a = prompt_a self.prompt_b = prompt_b self.results = {"a": [], "b": []} async def run(self, test_cases, sample_size=100): for case in random.sample(test_cases, min(sample_size, len(test_cases))): # 随机分配到 A 或 B variant = random.choice(["a", "b"]) prompt = self.prompt_a if variant == "a" else self.prompt_b response = await llm.invoke(prompt.format(input=case.input)) score = await self.judge.evaluate(case.input, response, case.expected) self.results[variant].append(score) return self.analyze() def analyze(self): a_avg = mean(self.results["a"]) b_avg = mean(self.results["b"]) return { "a_score": a_avg, "b_score": b_avg, "winner": "a" if a_avg > b_avg else "b", "improvement": abs(a_avg - b_avg) / min(a_avg, b_avg), } 第四层:Prompt 管理 版本控制 # prompts/analysis_v3.yaml metadata: name: "technical_analysis" version: "3.1.0" author: "team" changelog: - "v3.1: 增加安全约束" - "v3.0: 重构为结构化模板" - "v2.0: 添加 Few-shot 示例" system: | 你是一个技术分析师。 rules: - "基于事实数据" - "标注信息来源" - "不确定时说明" template: | 分析以下技术:{technology} 请从以下维度评估: 1. 技术成熟度 2. 社区活跃度 3. 商业采用率 4. 未来前景 variables: - name: technology type: string required: true output: format: json schema: maturity: integer(1-5) community: string adoption: string outlook: string Prompt 注册中心 class PromptRegistry: """Prompt 的注册中心和版本管理""" def get(self, name, version="latest"): prompt = self.db.find(name, version) if not prompt: raise PromptNotFound(name, version) # 记录使用情况 self.metrics.record(name, version) return prompt def register(self, name, prompt_data): # 验证 Prompt self.validate(prompt_data) # 回归测试 if not self.regression_test(prompt_data): raise PromptQualityError("回归测试未通过") # 注册新版本 version = self.next_version(name) self.db.save(name, version, prompt_data) return version 高级技巧 动态 Few-shot class DynamicFewShot: """根据输入动态选择最相关的示例""" def __init__(self, examples): self.examples = examples self.embeddings = {e: embed(e.input) for e in examples} def select(self, input, k=3): input_emb = embed(input) scored = [ (example, cosine_sim(input_emb, emb)) for example, emb in self.embeddings.items() ] scored.sort(key=lambda x: x[1], reverse=True) return [e for e, _ in scored[:k]] Prompt 压缩 class PromptCompressor: """长 Prompt 压缩,降低 Token 成本""" def compress(self, prompt): # 1. 移除冗余空格和换行 prompt = re.sub(r'\n{3,}', '\n\n', prompt) prompt = re.sub(r' {2,}', ' ', prompt) # 2. 缩短描述 prompt = prompt.replace("请仔细阅读以下内容并回答", "阅读后回答") # 3. 用符号替代文字 prompt = prompt.replace("第一步", "1.") prompt = prompt.replace("第二步", "2.") return prompt # 压缩前:1850 tokens # 压缩后:1240 tokens(节省 33%) 评估指标 指标 说明 目标 准确率 答案正确的比例 >90% 格式合规率 输出格式符合要求 >98% 拒绝率 对危险请求的拒绝率 100% 一致性 同输入多次输出一致 >85% Token 效率 输出质量/Token数 越高越好 延迟 首字节延迟 <2s 结论 Prompt 工程在 2026 年已经从"调参数"演进为"系统工程": ...

2026-06-24 · 4 min · 722 words · 硅基 AGI 探索者
prompt engineering practice

Prompt 工程实战:从「求 AI」到「指挥 AI」

Prompt 不是「求 AI 帮忙」,而是「指挥 AI 干活」。本文用 20 个真实案例拆解 Prompt 工程的核心技巧。

2026-06-19 · 3 min · 435 words · 硅基 AGI 探索者
context engineering

上下文工程:超越 Prompt 的新范式

Prompt 工程已死,上下文工程当立。当 Agent 需要处理 2M tokens 的上下文时,如何管理注意力分配?

2026-06-10 · 3 min · 450 words · 硅基 AGI 探索者
鲁ICP备2026018361号