"""
三种模式的 messages 组装逻辑。
Few-shot CoT 的 messages 结构(重点):
system
+ 示例1 user + 示例1 assistant
+ 示例2 user + 示例2 assistant
+ 新题 user
"""
from __future__ import annotations
from examples import FEW_SHOT_EXAMPLES, FewShotExample
from llm_client import call_llm
from prompts import (
SYSTEM_DIRECT,
SYSTEM_FEW_SHOT_COT,
SYSTEM_ZERO_SHOT_COT,
USER_DIRECT_TEMPLATE,
USER_FEW_SHOT_COT_TEMPLATE,
USER_ZERO_SHOT_COT_TEMPLATE,
)
from question import TargetQuestion
def _append_few_shot_pairs(
messages: list[dict[str, str]],
examples: list[FewShotExample],
) -> None:
for example in examples:
messages.append({"role": "user", "content": example.user})
messages.append({"role": "assistant", "content": example.assistant})
def run_direct(question: TargetQuestion) -> str:
messages = [
{"role": "system", "content": SYSTEM_DIRECT},
{"role": "user", "content": USER_DIRECT_TEMPLATE.format(question=question.question)},
]
return call_llm(messages)
def run_zero_shot_cot(question: TargetQuestion) -> str:
messages = [
{"role": "system", "content": SYSTEM_ZERO_SHOT_COT},
{
"role": "user",
"content": USER_ZERO_SHOT_COT_TEMPLATE.format(question=question.question),
},
]
return call_llm(messages)
def run_few_shot_cot(
question: TargetQuestion,
examples: list[FewShotExample] | None = None,
) -> str:
shot_examples = examples if examples is not None else FEW_SHOT_EXAMPLES
messages: list[dict[str, str]] = [{"role": "system", "content": SYSTEM_FEW_SHOT_COT}]
_append_few_shot_pairs(messages, shot_examples)
messages.append(
{
"role": "user",
"content": USER_FEW_SHOT_COT_TEMPLATE.format(question=question.question),
}
)
return call_llm(messages)