💻 源码
"""
CoT 三种模式的核心演示逻辑。

本文件负责「组装 messages + 调用模型」:
  build_*_messages()  →  拼提示词(可打印对比)
  run_*()             →  发请求并返回 messages + 回复
"""

from __future__ import annotations

from dataclasses import dataclass

from llm_client import call_llm
from prompts import (
    FEW_SHOT_EXAMPLE_ASSISTANT,
    FEW_SHOT_EXAMPLE_USER,
    SYSTEM_DIRECT,
    SYSTEM_FEW_SHOT_COT,
    SYSTEM_ZERO_SHOT_COT,
    USER_DIRECT_TEMPLATE,
    USER_FEW_SHOT_COT_TEMPLATE,
    USER_ZERO_SHOT_COT_TEMPLATE,
)
from questions import DemoQuestion

@dataclass
class ModeResult:
    """单次模式运行的完整结果,含提示词与模型回复。"""

    messages: list[dict[str, str]]
    reply: str
    prompt_summary: str


def build_direct_messages(question: DemoQuestion) -> list[dict[str, str]]:
    """无 CoT:system + user,只要求直接给答案。"""
    return [
        {"role": "system", "content": SYSTEM_DIRECT},
        {"role": "user", "content": USER_DIRECT_TEMPLATE.format(question=question.question)},
    ]


def build_zero_shot_cot_messages(question: DemoQuestion) -> list[dict[str, str]]:
    """零样本 CoT:system + user,要求分步思考,不给示例。"""
    return [
        {"role": "system", "content": SYSTEM_ZERO_SHOT_COT},
        {
            "role": "user",
            "content": USER_ZERO_SHOT_COT_TEMPLATE.format(question=question.question),
        },
    ]


def build_few_shot_cot_messages(question: DemoQuestion) -> list[dict[str, str]]:
    """少样本 CoT:system + 示例问答 + 新题目。"""
    return [
        {"role": "system", "content": SYSTEM_FEW_SHOT_COT},
        {"role": "user", "content": FEW_SHOT_EXAMPLE_USER},
        {"role": "assistant", "content": FEW_SHOT_EXAMPLE_ASSISTANT},
        {
            "role": "user",
            "content": USER_FEW_SHOT_COT_TEMPLATE.format(question=question.question),
        },
    ]


def run_direct(question: DemoQuestion) -> ModeResult:
    messages = build_direct_messages(question)
    reply = call_llm(messages)
    return ModeResult(
        messages=messages,
        reply=reply,
        prompt_summary="仅 system + user;要求只输出一行最终答案,禁止推理过程",
    )


def run_zero_shot_cot(question: DemoQuestion) -> ModeResult:
    messages = build_zero_shot_cot_messages(question)
    reply = call_llm(messages)
    return ModeResult(
        messages=messages,
        reply=reply,
        prompt_summary="system + user;user 中追加「请一步一步思考」,无示例",
    )


def run_few_shot_cot(question: DemoQuestion) -> ModeResult:
    messages = build_few_shot_cot_messages(question)
    reply = call_llm(messages)
    return ModeResult(
        messages=messages,
        reply=reply,
        prompt_summary="system + 示例user + 示例assistant + 新user;模型模仿示例推理格式",
    )