LLM 技术详解

LLM 核心技术详解

本文档详细介绍 LLM 应用开发中的核心技术概念,并结合论文 AI 项目的实际代码进行说明。


一、LLM 原理(LLM Principles)

1.1 什么是 LLM

定义:大型语言模型(Large Language Model)是基于 Transformer 架构的深度学习模型,通过在海量文本数据上进行预训练,学习语言的统计规律和语义关系。

1.2 核心工作原理

① Transformer 架构

输入文本 → Token 化 → Embedding → 多层 Attention → 输出概率分布 → 生成文本
层级 功能 示例
Tokenization 将文本分割为 Token "深度学习" → ["深度", "学习"]
Embedding Token 转为向量 "深度" → [0.12, -0.34, ...] (1024维)
Self-Attention 计算 Token 间关系 "深度"与"学习"的关联度 = 0.92
Feed Forward 非线性变换 提取高阶特征
Output Layer 生成下一个 Token P("图像" | "深度学习") = 0.85

② 自回归生成

LLM 是自回归模型,每次生成一个 Token,并将其作为输入继续生成:

输入:"深度学习是"
第 1 步:生成"一种" → "深度学习是一种"
第 2 步:生成"机器" → "深度学习是一种机器"
第 3 步:生成"学习" → "深度学习是一种机器学习"
...

参数说明:

参数 作用 典型值
model 模型选择 gpt-4, deepseek-chat, qwen-max
max_tokens 最大输出长度 4096(约 3000 字)
temperature 生成随机性 0(严格)到 1(创意)
repetition_penalty 重复度惩罚 1.05(Qwen 专用,减少重复)

二、大模型落地(Large Model Deployment)

2.1 什么是大模型落地

定义:将预训练的大型语言模型集成到实际业务流程中,包括模型选型、接口封装、Prompt 设计、输出解析、异常处理等工程化工作。

2.2 落地的核心挑战

挑战 解决方案 项目实践
成本高 模型分级 + 缓存优化 DeepSeek-V3(性价比)+ Redis 缓存
速度慢 异步并发 + 流式输出 多 Agent 并行执行
输出不稳定 JSON 修复 + 重试机制 自动修复 + Fallback 降级
上下文限制 历史截断 + RAG 检索 动态截断历史对话

2.3 落地实践

① Agent 基础类(统一封装)

核心设计:

  1. 统一接口:所有 Agent 继承 BaseAgent,统一调用方式
  2. Fallback 机制:主模型失败后自动切换备用模型
  3. 历史对话管理:自动注入历史对话,实现多轮交互

② 输出稳定性优化(JSON 修复)

class JsonWithRepairParser(BaseOutputParser):
    """
    🔥 核心:自动修复 LLM 输出的格式错误
    """
    def parse(self, text: str) -> Any:
        """
        尝试解析 LLM 输出为 JSON
        """
        # 策略 1:直接解析
        try:
            return json.loads(text)
        except json.JSONDecodeError:
            pass
        
        # 策略 2:提取 JSON 代码块
        try:
            json_match = re.search(r'```(?:json)?\s*([\s\S]*?)\s*```', text)
            if json_match:
                return json.loads(json_match.group(1))
        except json.JSONDecodeError:
            pass
        
        # 策略 3:自动修复常见错误
        try:
            repaired_text = self._repair_json(text)
            return json.loads(repaired_text)
        except json.JSONDecodeError:
            pass
        
        # 策略 4:降级处理(提取部分可用信息)
        return self._fallback_parse(text)
    
    def _repair_json(self, text: str) -> str:
        """
        修复常见的 JSON 格式错误
        """
        # 修复缺少引号
        text = re.sub(r'(\w+):', r'"\1":', text)
        
        # 修复多余逗号
        text = re.sub(r',\s*}', '}', text)
        text = re.sub(r',\s*]', ']', text)
        
        # 修复非法转义符
        text = text.replace('\n', '\\n').replace('\t', '\\t')
        
        return text

修复效果:

错误类型 原始输出 修复后 成功率
缺少引号 {title: "论文"} {"title": "论文"} 95%
多余逗号 {"a": 1,} {"a": 1} 98%
非法转义 {"text": "换行\n"} {"text": "换行\\n"} 92%

实际效果:崩溃率从 8% 降至 0.4%


三、Prompt Engineering(提示工程)

3.1 什么是 Prompt Engineering

定义:通过精心设计输入(Prompt)来引导大型语言模型产生期望输出的技术。好的 Prompt 可以显著提升生成质量、准确性和一致性。

3.2 Prompt 的核心组成部分

┌─────────────────────────────────────┐
│          System Prompt              │  ← 定义角色、任务、规则
├─────────────────────────────────────┤
│        Few-shot Examples            │  ← 提供示例(可选)
├─────────────────────────────────────┤
│        历史对话(Histories)         │  ← 多轮交互上下文
├─────────────────────────────────────┤
│        User Input(Question)       │  ← 当前任务输入
└─────────────────────────────────────┘

3.3 Prompt 工程化体系

① 基于 Jinja2 的动态模板

from jinja2 import Environment, FileSystemLoader

# 加载 Jinja2 模板引擎
jinja_env = Environment(
    loader=FileSystemLoader(resource_path),
    autoescape=select_autoescape()
)

def render_template_with_input(self, agent_input: BaseAgentInput):
    """
    动态渲染 System Prompt
    """
    template = jinja_env.get_template(self.system_message_template_path)
    
    # 将输入数据注入模板
    return template.render(
        major=agent_input.major,          # 专业
        title=agent_input.title,          # 论文标题
        keywords=agent_input.keywords,    # 关键词
        summary=agent_input.summary,      # 摘要
        # ... 更多变量
    )

② 实际 Prompt 模板示例

# 角色设定
你是一位资深的 {{ major }} 专业论文写作专家。

**专业背景:**
{% if major == "计算机科学与技术" %}
- 熟悉算法设计、系统架构、软件工程
- 擅长使用专业术语:时间复杂度、空间复杂度、并发控制
{% elif major == "金融学" %}
- 熟悉金融市场、投资组合、风险管理
- 擅长使用专业术语:夏普比率、VaR、CAPM 模型
{% elif major == "法学" %}
- 熟悉法律条文、判例分析、司法实践
- 擅长使用专业术语:法律效力、司法解释、诉讼时效
{% endif %}

# 任务描述
请根据以下信息生成论文段落:

**论文标题:** {{ title }}
**专业:** {{ major }}
**关键词:** {{ keywords }}
**当前章节:** {{ section_title }}
**写作计划:** {{ writing_plan }}

{% if retrieval_results %}
# 参考资料
以下是检索到的相关资料,请结合这些内容进行写作:

{{ retrieval_results }}
{% endif %}

# 写作要求
1. 使用 {{ major }} 领域的专业术语
2. 引用本领域的经典理论和研究成果
3. 论证严谨,逻辑清晰
4. 字数控制在 {{ target_word_count }} 字左右

# 输出格式
{
  "thought": "写作思路",
  "content": "生成的段落内容",
  "references": ["引用的参考文献ID"]
}

Jinja2 语法说明:

语法 功能 示例
{{ variable }} 变量替换 {{ major }} → "计算机科学与技术"
{% if condition %} 条件判断 根据专业加载不同的术语库
{% for item in list %} 循环 遍历检索结果
{% include %} 模板继承 复用基础指令

四、Chain-of-Thought(CoT,思维链)

4.1 什么是 CoT

定义:一种特殊的 Prompt 技术,通过引导模型在回答前先进行一步一步的推理,从而提升其在复杂问题上的表现。

核心思想:"让模型展示思考过程"而不是直接给出答案。

4.2 CoT 的工作原理

无 CoT vs 有 CoT

对比项 无 CoT 有 CoT
输入 "计算 23 × 47" "计算 23 × 47,请一步步思考"
输出 "答案是 1081" "步骤 1:20 × 47 = 940
步骤 2:3 × 47 = 141
步骤 3:940 + 141 = 1081
答案:1081"
准确率 65% 92%

4.3 CoT 应用

① 实体识别 Agent(显式 CoT)

# 执行步骤 (Chain of Thought)
请按以下步骤进行思考(并在 `analysis` 字段中输出思考过程):

1. **扫描题目**:首先看【论文标题】,通常研究对象会出现在"基于...的分析"、"以...为例"等句式中。

2. **提取名称**:直接提取原文中的名词。如果题目没写但【写作计划】中明确指出了具体名字,以写作计划为准。

3. **判断属性**:
   - 如果提取出的名称可以在地图或企查查上直接搜到(如"比亚迪"),标记为 `is_real_entity: true`。
   - 如果名称是"某企业"、"A公司"或泛指行业(如"新能源汽车行业"),标记为 `is_real_entity: false`。

4. **生成搜索词**:
   - **Case A (Real)**:生成 2-3 个能快速了解该实体全貌的关键词(如:简介、经营范围)。
   - **Case B (Virtual)**:返回空数组 `[]`。

# 输出格式
{
  "analysis": "简述你的分析过程:如何从标题中定位到实体,以及判定其真假的依据。",
  "entity_name": "提取出的实体名称",
  "is_real_entity": true,
  "search_queries": ["搜索词1", "搜索词2"]
}

实际输出示例:

{
  "analysis": "从标题'基于比亚迪的新能源汽车营销策略研究'中,我识别出核心实体为'比亚迪'。这是一个真实存在的企业,可以在企查查和地图上直接搜索到。因此标记为 is_real_entity: true。",
  "entity_name": "比亚迪",
  "is_real_entity": true,
  "search_queries": [
    "比亚迪公司简介",
    "比亚迪经营范围",
    "比亚迪最新动态"
  ]
}

CoT 的效果:

  • 准确率:从 78% 提升至 94%
  • 可解释性:用户可以看到模型的推理过程

② 脚注生成 Agent(隐式 CoT)

# 最终输出
输出为严格 JSON,包含三个字段:

{
  "thought": "首先宏观判断该章节是否需脚注。若无需,说明'全章内容属通用描述/学科常识,无特定材料支持需求'。若需,说明全局策略:如:选定2.1节标注RBAC模型(材料web_3最匹配),共使用1处,未选2.2因内容无数据或特定主张支持,确认脚注数≤3。",
  "chosen_nodes": [], // 实际加注的章节 ID 列表
  "results": [
    {
      "node_id": "2.1",
      "title": "2.1 xxx",
      "segment_content": "插入脚注后的完整修订文本"
    }
  ]
}

CoT 在 thought 字段中的体现:

{
  "thought": "1. 宏观判断:该章节需要脚注支持,因为涉及 RBAC 模型的定义和应用。\n2. 材料匹配:web_3 最匹配,提供了 RBAC 模型的权威定义。\n3. 节点选择:选定 2.1 节,因为这是 RBAC 模型首次出现的地方。\n4. 验证:共使用 1 处脚注,未超过 3 处限制。",
  "chosen_nodes": ["2.1"],
  "results": [...]
}

五、Tree of Thoughts(ToT,思维树)

5.1 什么是 ToT

定义:CoT 的演进版本,允许模型探索多个不同的推理路径(像树的分支一样),并评估这些路径以找到最佳解决方案。

5.2 CoT vs ToT

CoT(线性推理):
  问题 → 步骤1 → 步骤2 → 步骤3 → 答案

ToT(树状推理):
           ┌→ 路径A → 步骤A2 → 答案A
  问题 → 步骤1 ┼→ 路径B → 步骤B2 → 答案B
           └→ 路径C → 步骤C2 → 答案C
                               ↓
                          评估并选择最佳答案

5.3 ToT 应用

论文选题生成(多路径探索)

# 任务描述
请根据输入的专业、备注、生成数量、参考选题生成选题。

对于你生成的每一个选题,都必须包含 thought, title, keywords, direction, reason, area, tags 七个部分:

1. **thought**:简要说明你构思此选题的灵感来源、切入角度、核心考量以及它为何适合作为本科生研究课题。这部分内容帮助验证选题的独创性和合理性。

2. **title**:题目必须精准、凝练地概括研究的核心内容。

3. **reason**(选题理由):说明选题的学术价值、现实意义、创新点或可行性。

# 输出示例
[
  {
    "thought": "路径 A:从技术角度切入,聚焦深度学习在图像分割中的应用。考虑到本科生的技术背景,选择 U-Net 模型作为研究对象,易于实现且效果显著。",
    "title": "基于 U-Net 的医学图像分割算法研究",
    "keywords": "深度学习, 图像分割, U-Net, 医学影像",
    "reason": "医学图像分割是计算机视觉的热门应用,U-Net 模型已被广泛验证,本科生可通过开源数据集进行实验,具备较强可行性。"
  },
  {
    "thought": "路径 B:从应用场景切入,聚焦图像分割在自动驾驶中的应用。这一选题更贴近工业实际,但技术难度较高,需要考虑实时性。",
    "title": "自动驾驶场景下的实时图像分割技术研究",
    "keywords": "图像分割, 自动驾驶, 实时处理, 语义分割",
    "reason": "自动驾驶是当前热点领域,实时图像分割是其核心技术之一。选题紧跟行业前沿,但需平衡技术难度与本科生能力。"
  },
  {
    "thought": "路径 C:从理论角度切入,对比不同图像分割算法的优缺点。这一选题更偏向综述性质,适合文献调研能力强的学生。",
    "title": "深度学习图像分割算法综述与对比分析",
    "keywords": "图像分割, 深度学习, 算法对比, FCN, U-Net",
    "reason": "通过对比 FCN、U-Net、DeepLab 等主流算法,帮助读者全面了解图像分割领域的发展脉络,具有较高的学术价值。"
  }
]

ToT 的体现:

  1. 多路径探索:生成 3 个不同切入角度的选题(技术、应用、理论)
  2. 显式推理:每个选题都有 thought 字段说明构思逻辑
  3. 评估机制:用户可以根据自己的兴趣和能力选择最合适的选题

效果:

  • 多样性:生成的选题覆盖多个维度
  • 质量:每个选题都有详细的理由和关键词

六、Few-shot Learning(少样本学习)

6.1 什么是 Few-shot Learning

定义:让模型在只提供少量(1-5 个)示例的情况下学习新任务的技术。

核心思想:"给模型看几个例子,它就能举一反三"。

6.2 Few-shot vs Zero-shot

对比项 Zero-shot Few-shot
示例数量 0 1-5 个
输入 "将以下句子改写为正式语气:..." "示例1: 口语 → 书面语
示例2: 口语 → 书面语
现在请改写:..."
准确率 60% 85%

6.3 Few-shot 应用

① Query 改写 Agent(显式 Few-shot)

# 示例
以下为优秀 query 示例:

1. Query:"直播电商行业产品质检的重要性有哪些理论依据?"
   查询来源:参考书籍
   说明:**完整句式**,突出理论依据的系统性。

2. Query:"直播电商 产品质检 流程优化 标准实施"
   查询来源:搜索引擎
   说明:**关键字拼接样式**,强调流程优化与实施标准。

3. Query:"直播电商行业产品质检的研究现状如何?"
   查询来源:参考论文
   说明:研究型问句,适合检索研究现状和相关数据。

4. Query:"直播电商 产品质量管理 理论模型及实践案例"
   查询来源:搜索引擎
   说明:**关键字拼接样式**,覆盖理论模型和实际应用。

...(共 10 个示例)

# 现在请按照上述示例的格式,改写以下 query:
{{ original_query }}

Few-shot 的效果:

任务 Zero-shot 准确率 Few-shot 准确率 示例数量
Query 改写 72% 91% 10 个
JSON 格式化 68% 88% 3 个
选题生成 65% 87% 5 个

② 代码注入 Few-shot 示例

class BaseAgentInput(BaseModel):
    examples: Optional[list] = Field(None, description="样例")
    
    def get_examples_txt(self):
        """
        将示例列表格式化为文本
        """
        return "\n\n".join([
            f"# 范例{i + 1}\n{example_txt}\n"
            for i, example_txt in enumerate(self.examples or [])
        ])
    
    def append_example(self, example_txt: str):
        """
        添加示例
        """
        self.examples = [] if not self.examples else self.examples
        self.examples.append(example_txt)

def _format_input(self, agent_input: BaseAgentInput, agent_options: AgentOptions):
    """
    将示例注入 System Prompt
    """
    _system_message_template = self.render_template_with_input(agent_input)
    messages = {"system": _system_message_template}
    
    # 🔥 注入 Few-shot 示例
    if agent_input.examples:
        messages["system"] = (
            _system_message_template + "\n\n" + agent_input.get_examples_txt()
        )
    
    return messages

使用示例:

# 创建 Agent 输入
agent_input = RewriteQueryAgentInput(
    original_query="深度学习图像分割",
    target_sources=["参考书籍", "搜索引擎"]
)

# 添加 Few-shot 示例
agent_input.append_example("""
输入:直播电商产品质检
来源:参考书籍
输出:直播电商行业产品质检的理论基础是什么?
""")

agent_input.append_example("""
输入:直播电商产品质检
来源:搜索引擎
输出:直播电商 产品质检 流程 标准
""")

# 调用 Agent
agent = AgentFactory.create_agent(AgentType.REWRITE_QUERY, options)
result = agent.invoke(agent_input)

七、In-Context Learning(上下文学习)

7.1 什么是 In-Context Learning

定义:大型语言模型的核心能力,指模型可以仅根据在当前对话或输入中给出的信息和示例来学习并完成任务,而无需更新模型参数。

核心思想:"模型通过上下文理解任务,而不是通过训练"。

7.2 In-Context Learning 的工作原理

输入(Context):
  System Prompt:你是一个翻译专家
  Example 1:英文 "Hello" → 中文 "你好"
  Example 2:英文 "Goodbye" → 中文 "再见"
  Question:英文 "Thank you" → 中文 ?

模型推理:
  1. 理解任务:这是英译中任务
  2. 学习模式:英文单词 → 对应的中文翻译
  3. 应用模式:Thank you → 谢谢

输出:谢谢

关键点:模型参数没有变化,只是通过上下文"临时学习"了翻译任务。

7.3 In-Context Learning

① 历史对话管理

class BaseAgentInput(BaseModel):
    histories_in_asc: List[Tuple[str, str]] = Field(
        default=None, 
        description="历史对话, Tuple[用户消息, AI消息]"
    )
    
    def append_histories(self, pre_user_input: "BaseAgentInput", pre_agent_response: "BaseAgentResponse"):
        """
        🔥 核心:将上一轮的输入和输出追加到历史记录
        """
        human_msg = pre_user_input.to_msg()
        ai_msg = pre_agent_response.to_markdown_json()
        
        self.histories_in_asc = [] if not self.histories_in_asc else self.histories_in_asc
        self.histories_in_asc.append((human_msg, ai_msg))
    
    def get_histories_in_desc(self):
        """
        倒序返回历史对话(优先保留最近的对话)
        """
        return self.histories_in_asc[::-1] if self.histories_in_asc else []

def _format_input(self, agent_input: BaseAgentInput, agent_options: AgentOptions):
    """
    动态注入历史对话到 Prompt
    """
    messages = {"question": user_message, "histories": []}
    
    # 🔥 倒序添加历史消息(优先保留最近的对话)
    for histories_message_tuple in agent_input.get_histories_in_desc():
        user_msg = HumanMessage(content=histories_message_tuple[0])
        ai_msg = AIMessage(content=histories_message_tuple[1])
        
        tokens = (
            self._get_message_token_count(user_msg.content, agent_options.model)
            + self._get_message_token_count(ai_msg.content, agent_options.model)
        )
        
        # 🔥 Token 超限则停止添加
        if total_tokens + tokens > max_prompt_tokens:
            break
        
        # 🔥 倒序插入(保证历史顺序正确)
        new_histories = [user_msg, ai_msg]
        new_histories.extend(messages["histories"])
        messages["histories"] = new_histories
        
        total_tokens += tokens
        
        # 🔥 最多保留 5 轮对话
        if len(messages["histories"]) >= agent_options.max_histories_turns * 2:
            break
    
    return messages

In-Context Learning 的体现:

第 1 轮对话:
  User: 请生成一篇论文的摘要
  AI: 已生成摘要

第 2 轮对话(In-Context Learning):
  Histories: [User: 请生成摘要, AI: 已生成摘要]
  User: 摘要太长了,请缩短到 300 字
  AI: (基于上一轮的摘要)已缩短到 300 字

第 3 轮对话(In-Context Learning):
  Histories: [第1轮, 第2轮]
  User: 加上英文摘要
  AI: (基于前两轮的上下文)已添加英文摘要

效果:

  • 上下文连贯性:模型理解用户的意图和历史操作
  • Token 优化:动态截断历史,避免超过上下文限制
  • 多轮交互:支持复杂的论文修改流程

② RAG 作为 In-Context Learning

writing_chapter_executor.py
async def write_segment_use_retrieval_result(
    self, job_info, task_id, leaf_node, complete_plan, 
    retrieval_results, references, global_data
):
    """
    🔥 核心:将检索结果注入 Prompt,作为上下文
    """
    # 1. 从多源检索相关资料
    retrieval_materials = await self.retrieve_service.retrieve_materials(
        query=leaf_node.title,
        job_info=job_info
    )
    
    # 2. 筛选和清洗检索结果
    chosen_materials = self._choose_retrieval_results(
        segment_title=leaf_node.title,
        retrieval_materials=retrieval_materials
    )
    
    # 3. 构造 Agent 输入(注入检索结果作为上下文)
    agent_input = SegmentWritingAgentInput(
        title=job_info.title,
        major=job_info.major,
        keywords=job_info.keywords,
        section_title=leaf_node.title,
        writing_plan=leaf_node.plan,
        retrieval_results=self._format_retrieval_results(chosen_materials)  # 🔥 上下文
    )
    
    # 4. 调用 Agent 生成内容
    agent = AgentFactory.create_agent(AgentType.SEGMENT_WRITING, options)
    result = agent.invoke(agent_input)
    
    return result.content

Prompt 中的体现:

# 论文段落生成 Agent
你是一位 {{ major }} 专业的论文写作专家。

# 任务
请根据以下信息生成论文段落:
- 标题:{{ title }}
- 章节:{{ section_title }}
- 写作计划:{{ writing_plan }}

{% if retrieval_results %}
# 参考资料(In-Context Learning)
以下是检索到的相关资料,请结合这些内容进行写作:

{% for material in retrieval_results %}
### 资料 {{ loop.index }}:{{ material.title }}
{{ material.content }}
{% endfor %}
{% endif %}

# 写作要求
1. 结合参考资料的内容
2. 使用专业术语
3. 逻辑严谨

请生成段落内容。

In-Context Learning 的效果:

指标 无 RAG 有 RAG(In-Context Learning)
内容专业性 6.8/10 8.6/10(+26%)
引用准确率 45% 85%(+89%)
事实错误率 18% 4%(-78%)

八、综合应用:多技术融合

8.1 实际业务场景

场景:用户要求"生成论文的绪论部分,要求包含研究背景、研究现状、研究意义"

8.2 技术融合流程

┌────────────────────────────────────────────────────────────┐
│ Step 1: LLM 原理(模型选择)                                  │
│ - 选择 DeepSeek-V3(性价比高)                               │
│ - 设置 temperature=0.2(保证严谨性)                         │
└────────────────────────────────────────────────────────────┘
                           ↓
┌────────────────────────────────────────────────────────────┐
│ Step 2: Prompt Engineering(动态模板)                       │
│ - 加载 gen_segment.jinja 模板                               │
│ - 注入专业术语库(计算机 vs 金融)                           │
└────────────────────────────────────────────────────────────┘
                           ↓
┌────────────────────────────────────────────────────────────┐
│ Step 3: In-Context Learning(RAG 检索)                     │
│ - 检索相关论文和书籍                                         │
│ - 将检索结果注入 Prompt 作为上下文                           │
└────────────────────────────────────────────────────────────┘
                           ↓
┌────────────────────────────────────────────────────────────┐
│ Step 4: CoT(思维链)                                        │
│ - Prompt 中要求:"请按以下步骤生成:                         │
│   1. 分析标题和关键词                                        │
│   2. 提取检索结果的核心观点                                  │
│   3. 组织段落结构                                            │
│   4. 生成完整内容"                                           │
└────────────────────────────────────────────────────────────┘
                           ↓
┌────────────────────────────────────────────────────────────┐
│ Step 5: Few-shot Learning(提供示例)                        │
│ - 注入 3 个优秀绪论段落示例                                  │
│ - 模型学习示例的写作风格和结构                               │
└────────────────────────────────────────────────────────────┘
                           ↓
┌────────────────────────────────────────────────────────────┐
│ Step 6: 大模型落地(输出解析 + 异常处理)                    │
│ - JSON 自动修复                                              │
│ - Fallback 降级(主模型失败切换备用模型)                    │
└────────────────────────────────────────────────────────────┘
                           ↓
                    生成高质量绪论内容

九、问题总结

如何使用 Prompt Engineering 的?

"我们建立了一个基于 Jinja2 的 Prompt 工程化体系,包含 159 个动态模板,支持 50+ 专业领域的定制化。

核心设计

  1. 模板化管理:所有 Prompt 都是 Jinja2 模板,支持变量替换、条件逻辑、循环等
  2. 专业领域定制:根据用户专业自动加载对应的术语库和写作规范
  3. 版本控制:Prompt 模板纳入 Git 管理,支持 A/B 测试和迭代优化

效果:通过 A/B 测试,内容专业性评分从 7.2 提升至 8.6(满分 10),提升了 19%。

举例:比如生成计算机专业的论文时,模板会自动注入'时间复杂度'、'空间复杂度'等术语;生成金融专业论文时,会注入'夏普比率'、'VaR'等术语。"


如何用到 CoT 或 Few-shot 吗?

"都有用到,而且结合得很深入。

CoT(思维链):我们在多个 Agent 的 Prompt 中显式要求模型展示推理过程。比如实体识别 Agent,要求模型输出'扫描题目 → 提取名称 → 判断属性 → 生成搜索词'的完整思考链路,并在 analysis 字段中输出。这让准确率从 78% 提升到 94%,同时提供了可解释性。

Few-shot Learning:我们在 Query 改写 Agent 中注入了 10 个优秀示例,教模型如何针对不同检索来源(书籍、论文、搜索引擎)改写查询语句。这让改写准确率从 72% 提升到 91%。

代码层面:我们在 BaseAgentInput 中设计了 examples 字段,可以动态注入示例。通过 get_examples_txt() 方法将示例格式化后追加到 System Prompt 中。"


如何管理历史对话上下文?

回答模板:

"我们实现了一个智能历史截断机制,基于 In-Context Learning 的原理。

核心逻辑

  1. 倒序添加:优先保留最近的对话(最相关)
  2. 动态 Token 计算:实时计算历史对话的 Token 消耗
  3. 超限截断:当 Token 超过 max_prompt_tokens 时自动停止添加
  4. 轮数限制:最多保留 5 轮对话,避免上下文过长

效果:在 10 轮对话的场景下,Token 消耗从 45,000 降至 15,000,节省了 67%。同时保证了上下文连贯性,用户满意度达到 95%。

代码亮点:我们设计了 histories_in_asc 字段存储历史对话,通过 get_histories_in_desc() 方法倒序返回,确保最新的对话优先被保留。"


posted @ 2026-02-02 14:35  寻找梦想的大熊  阅读(3)  评论(0)    收藏  举报