AIHero
    07 / 07AI 工程师路线图 · 阅读约 19 分钟

    改进 LLM 驱动应用的 17 项技术

    一份改进 LLM 驱动应用的技术目录。

    Matt Pocock
    Matt Pocock
    本页目录

    当你已经明确成功标准、选好模型并编写了一些基础评测后,就该开始改进系统了。

    改进系统归根结底只有两件事:

    • 改进反馈循环(评测)
    • 提升系统本身的表现

    我们已经讨论过如何改进评测。本文将概览提升系统表现的主要方法。

    不过在此之前,先谈谈改进系统时应具备的思维方式。

    先尝试最简单的方法

    前文已经说明,改进 AI 系统是一个实验过程。你需要不断尝试、观察什么有效,再继续迭代。

    改进系统的技术从简单低成本,一直到复杂昂贵。调整提示词?成本很低。从头训练模型?昂贵得惊人。

    我把它称为“复杂度地狱阶梯”:

    关键是从阶梯最上方开始,只有穷尽所有简单选项后,才继续向下走。简单技术往往只需少量投入,就能带来巨大提升。

    值得尝试的技术

    下面的列表从最简单的技术排到最复杂的技术。请从顶部开始逐步向下。每项技术都附有延伸资料,供你了解更多细节。

    1. 写好第一个提示词

    问题:你总得从某处开始。

    解决方案:以下是改进提示词的一些基本建议:

    • 表达要清晰、直接、具体。
    • 把 LLM 当作一位能力出众、但刚刚入职的员工。
    • 记住,LLM 并不了解你的规范、风格和指导原则。

    参考资料

    • Anthropic 的提示建议是理解如何编写优秀提示词的实用指南。
    • Anthropic 的提示词库很适合用来探索符合自身场景的优秀提示词。
    • OpenAI 关于编写清晰指令的文档。

    2. 基于角色的提示

    问题:无论输入是什么,你都希望 LLM 始终以某种方式表现。

    解决方案:使用基于角色的提示,让 LLM 采用特定身份。

    用途可以非常多样,例如调整说话语气:

    You are a friendly support engineer. Answer in short, plain sentences.

    甚至可以调整口音:

    You are a concise British copy editor. Keep the answer dry and understated.

    也可以预先引导 LLM 围绕特定主题展开:

    You are an AI engineering coach. Explain tradeoffs in terms of evals, latency, and cost.

    这是一项极其常见、实现成本很低的技术,通常通过系统提示词完成。

    参考资料

    • 我介绍 Vercel AI SDK 系统提示词的视频
    • Anthropic 关于基于角色提示的文档
    • OpenAI 关于让模型采用特定身份的文档

    3. XML 标签

    在输入中使用 XML 标签

    问题:你希望在一个提示词中向 LLM 传入多段信息。

    解决方案:使用 XML 标签。

    XML 标签可以为提示词的不同部分提供清晰分隔。

    Anthropic 文档中的一个例子是财务报告:

    <documents>
    <document index="1">
    <source>2025 annual report</source>
    <document_content>Revenue increased 18% year over year...</document_content>
    </document>
    <document index="2">
    <source>Q1 investor update</source>
    <document_content>Gross margin improved after infrastructure costs fell...</document_content>
    </document>
    </documents>
    Using only the documents above, summarize the main business risks.

    在输出中使用 XML 标签

    问题:你希望 LLM 在一次响应中返回多种不同输出。

    解决方案:要求 LLM 按照 XML 标签分别返回不同输出。

    你还可以要求 LLM 根据提示词中的 XML 标签返回不同输出,从而更精确地控制响应结构。

    例如,你可能希望 LLM 审查一篇文章,并分别提供 <summary><critique><recommended_changes>

    Review this article and respond using this exact structure:
    <summary>One paragraph summary</summary>
    <critique>What is unclear or unsupported</critique>
    <recommended_changes>Concrete edits to make next</recommended_changes>

    这项技术由 Anthropic 推广开来,不过大多数模型也都支持。

    参考资料

    • Anthropic 关于在提示词中使用 XML 标签的文档
    • OpenAI 文档也提到了使用 XML 标签作为分隔符

    4. 约束 LLM 的响应格式

    问题:你希望严格约束 LLM 返回的文本,例如要求它只回复 JSON 或一个单词。

    解决方案:使用结构化输出,或给出明确的格式指令。

    旧版 Claude 支持通过“预填充”助手消息来引导响应格式。从 Claude 4.6 开始,预填充会返回 400 错误。现代替代方案更好:

    结构化输出(推荐):如今,大多数 LLM 提供商都支持结构化输出模式,可以保证响应符合指定 JSON 结构。在 Vercel AI SDK 中,可以使用 generateObjectstreamObject

    const result = await generateObject({
    model,
    schema: z.object({
    sentiment: z.enum(['positive', 'neutral', 'negative']),
    summary: z.string(),
    }),
    prompt: 'Classify this customer feedback...',
    })

    系统提示词指令:对于较简单的约束,可以直接在系统提示词中告诉模型需要什么格式:

    Reply with exactly one of these labels: bug, feature-request, billing, or other.
    Do not include any explanation.

    这两种方法都比预填充可靠。结构化输出可以获得类型安全、经过验证的响应;需要具有特定形态、但仍较灵活的文本输出时,系统提示词指令更合适。

    参考资料:

    • Anthropic:结构化输出
    • Vercel AI SDK:generateObject

    5. 结构化输出

    问题:你希望 LLM 返回结构化数据,而不是普通文本。

    解决方案:使用结构化输出。

    结构化输出可以让 LLM 以 JSON 等结构化格式返回数据。大多数 LLM 提供商都支持使用 JSON Schema 描述期望的输出。

    Vercel AI SDK 尤其适合处理这类需求。

    参考资料

    • Anthropic 关于 JSON 模式的文档

    6. 推理

    问题:LLM 在编码或数学题等复杂多步骤推理任务中表现不够好。

    解决方案:使用思维链(CoT)提示,引导 LLM 逐步推理问题。

    思维链提示鼓励 LLM 把问题逐步拆解,从而生成更准确、更细致的输出。它对需要复杂推理、分析或问题求解的任务尤其有效。

    思维链提示主要有三种方式,复杂度由低到高:

    1. 基础 CoT:只需在提示词中加入“逐步思考”。方法简单,但没有说明应该怎样思考。
    2. 引导式 CoT:明确列出 LLM 在思考过程中应遵循的具体步骤。
    3. 结构化 CoT:使用 <thinking><answer> 等 XML 标签,把推理过程与最终答案分开。

    思维链提示以速度换取质量。LLM 必须处理并输出推理步骤,因此响应时间会变长。这对实时应用影响最大:聊天机器人需要快速响应,而代码审查器可以花更长时间完成细致分析。

    参考资料

    • Anthropic 关于思维链提示的文档
    • OpenAI 关于让模型在得出结论前留出思考时间的建议

    7. 多样本提示

    问题:LLM 需要理解某种特定模式或格式,但单个示例不足以让它掌握。

    解决方案:提供多个示例,帮助 LLM 理解模式。

    多样本提示可以取得类似微调的效果,却不必承担训练新模型的成本和复杂度。做法是向模型展示你希望它完成的任务示例。

    方法很直接:提供几组输入和输出示例,模型就能学会其中模式,无需准备训练数据或计算资源。

    下面是编写产品描述的实际示例:

    Write product descriptions in this style.
    Input: Noise-canceling headphones
    Output: Sink into your work with soft over-ear cushions and active noise cancellation that quiets the room around you. Great for deep focus, travel, and calls that need fewer distractions.
    Input: Standing desk
    Output: Move from sitting to standing in seconds with a sturdy desk that keeps your monitor, keyboard, and coffee exactly where you need them. Built for long workdays without locking you into one posture.
    Input: Running shoes
    Output: Light foam, breathable mesh, and a grippy sole make these shoes feel quick without beating up your feet. Perfect for daily miles, recovery runs, and the walk home after.
    Input: Coffee maker
    Output:

    看过这些示例后,模型会学会使用感官语言、突出产品收益来编写描述。随后输入“咖啡机”,它就会生成风格相似的文案。

    多样本提示与零样本提示相对;零样本提示只描述需要什么,不提供任何示例。

    参考资料

    • Anthropic 关于多样本提示的文档
    • OpenAI 关于提供示例的文档

    8. 温度参数

    问题:LLM 输出要么过于确定、显得无聊,要么过于随机、不够可靠。

    解决方案:调整温度参数,控制输出的随机程度。

    可以向 LLM 传入温度参数,用来控制输出更随机还是更确定。

    可以把温度看作创造力旋钮。编写代码或需要精确事实时,建议设置为 0.0-0.3,让模型坚持最可能的输出;普通聊天或创意写作可使用 0.4-0.7,在稳定与变化之间取得平衡;头脑风暴或需要新鲜想法时,则可提高到 0.8-1.2.

    温度越高,输出越有趣,但也可能产生更多幻觉。我的一般建议是从保守设置开始,只有需要更多变化时才逐步调高。

    无论如何,这都是一项尝试成本较低的技术。

    参考资料

    • OpenAI API 参考文档解释了温度如何影响 Token 采样

    9. 工具调用

    问题:LLM 只能生成文本,无法直接与外部系统交互,也无法在现实环境中执行操作。

    解决方案:为 LLM 提供可调用的特定函数或工具,把能力扩展到文本生成之外。

    工具调用连接了 LLM 内部能力与外部世界。借助它,LLM 可以发起 API 请求、访问数据库或操作文件。LLM 描述自己想做什么,系统再使用指定参数执行相应工具。

    当 LLM 需要与外部服务交互、执行系统操作,或访问训练数据中不存在的信息时,这种模式尤其有用。它是构建更强大 AI 应用的基础模块。

    可以在我的教程中学习如何使用 Vercel AI SDK 实现这种模式。

    参考资料

    • Anthropic 关于工具调用的文档
    • OpenAI 关于函数调用的文档

    10. LLM 调用链

    问题:单次 LLM 调用不足以完成复杂任务。

    解决方案:把任务拆成多次相互衔接的 LLM 调用。

    当同一输入需要经过多种专业处理时,试图用一个提示词完成全部工作,通常会得到较差结果。每项操作可能需要不同专长和关注重点。

    这正是 LLM 调用链的用途。不要让一个提示词包办一切,而是把任务拆成多个专业步骤。每个提示词只专注一个方面,其输出再成为链中下一个提示词的输入。

    以代码分析和修复生成为例。第一个提示词充当代码分析器,识别并分类代码问题,为每个问题补充上下文,形成结构化分析。

    第二个提示词利用这份分析生成有针对性的修复,并建立在第一次调用的洞见上。关注点分离后,每个提示词都能针对自身任务优化,比在一个提示词中同时完成两项操作效果更好。

    这种模式还可用于许多其他场景:

    • 先分析文档结构,再生成摘要
    • 先识别辩论要点,再组织平衡的回应
    • 先从研究中提取事实,再编写面向普通读者的解释
    • 先识别代码缺陷,再为每个缺陷生成修复

    参考资料

    • Anthropic 关于提示链的文档
    • 更新:OpenAI 已移除关于使用内部独白的指南

    11. RAG

    问题:LLM 无法访问所需信息,因此开始编造事实。

    解决方案:通过检索增强生成,让它访问真实数据。

    RAG 是一项强大技术,可以让 LLM 的响应建立在真实数据上并减少幻觉。每个 LLM 的训练数据都有截止日期,无法知道此后发生的事件和信息。RAG 让模型不再只依赖训练时学到的内容,而能按需检索最新信息。

    向 LLM 提供数据主要有两种方式。网页搜索可以访问最新信息和公共知识;公司数据库与文档则能提供私有、领域专属的信息。当你需要回答公司内部流程问题,或确保 LLM 响应保持最新时,后者尤其有用。

    构建 LLM 应用时,不应首先选择 RAG。它会显著增加系统复杂度:你需要管理数据源、处理检索,并确保上下文窗口不超出限制。

    参考资料

    • OpenAI 关于 RAG 和语义搜索的文章,官方文档中也有相关章节。

    12. 分块

    问题:需要检索的信息太大,无法装进上下文窗口。

    解决方案:把信息拆成更小、更易管理的块。

    分块是 RAG 系统的基础技术,它把大型文档拆成更小、更易处理的片段。目标是让每个块既具有完整语义,又足够小,能够放进模型上下文窗口。

    分块之所以复杂,是因为内容有许多拆分方式。主要方法包括:

    • 基于 Token:按 Token 数量拆分,确保不超出模型限制
    • 基于字符:按字符数拆分,适合处理原始文本
    • 基于句子:保留自然语言边界
    • 基于段落:保留更大的语义单元
    • 语义边界:使用嵌入寻找自然断点
    • 文档结构:尊重标题、章节等文档格式

    完成分块后,需要为每个查询找出最相关的块。主要方法如下:

    • BM25:传统搜索算法,查找精确词语匹配,非常适合技术术语和错误代码
    • 嵌入:把文本转换为向量,查找语义相似的块
    • 混合搜索:结合 BM25 与嵌入,获得更好结果
    • LLM 重排序:使用另一个 LLM 仔细阅读各块,并按相关性排序

    每种方法都有优势:BM25 擅长精确匹配,嵌入则善于捕捉语义。许多系统会组合多种方法,以获得最佳结果。

    参考资料

    • Pinecone 的分块策略指南
    • Anthropic 关于上下文检索的研究
    • 评估分块策略的研究论文

    13. 智能体循环

    问题:LLM 调用链对复杂任务过于僵硬。它要求预先定义步骤和停止点,不适合步骤数量不可预测的开放式问题。

    解决方案:把控制权交给自主智能体,让它根据环境反馈进行规划、执行和调整。

    LLM 调用链使用预定义步骤和停止点,因此难以处理不可预测的任务。智能体循环把更多控制权交给 LLM,让它根据任务进展自行决定何时停止。智能体通过现实环境反馈学会停止时机。

    这样的系统更强大,因为它能适应不可预测的路径。它不再机械遵循预定义步骤,而是根据每次交互学习和调整,因此适合解决方案无法提前确定的复杂问题。

    自主性也有代价:每一步都要作出决策,因此延迟更高。LLM 必须评估当前状态并选择最佳路径。智能体循环比 LLM 调用链更慢,却更能处理复杂任务。

    这种模式适用于:

    • 跨多个文件的复杂代码修改
    • 需要多个信息来源的研究任务
    • 路径不可预测的客户支持场景
    • 需要多步处理的数据分析

    参考资料

    • Anthropic 关于构建高效智能体的文章

    14. 并行执行 LLM 调用

    问题:LLM 系统逐项处理任务,产生不必要的等待,整体耗时过长。

    解决方案:并行运行多次 LLM 调用,同时处理相互独立的任务,大幅缩短总处理时间。

    让系统变快只有两种方式:减少工作量,或同时完成更多工作。需要独立处理多个任务时,并行运行 LLM 调用可以显著提升性能。

    任务相互独立、不依赖彼此结果时,可以并行:

    • 分析多份文档
    • 生成多个不同内容版本
    • 同时处理多个用户查询

    任务必须按顺序发生时,不能并行:

    • 每一步都依赖上一步输出
    • 严格顺序对最终结果至关重要

    性能收益非常明显。顺序处理 10 份文档可能需要 10 秒,并行处理则可能只需 2–3 秒。应始终寻找并行机会;即使系统看似完全顺序执行,其中也可能存在可并发处理的独立部分。

    参考资料

    • Anthropic 关于构建高效智能体的文章提到了并行 LLM 调用
    • OpenAI 文档包含并行 LLM 调用的章节

    15. 评估器—优化器

    问题:即使多次尝试,LLM 响应仍达不到所需质量标准。

    解决方案:建立自动循环,由一个 LLM 生成响应,另一个负责评估并提供改进反馈。

    评估器—优化器工作流让两个 LLM 协同形成自我改进系统。第一个 LLM 生成响应,第二个按照具体标准进行评估,再把结果反馈到生成过程,形成持续改进循环。

    当评估标准清晰、迭代优化能带来可衡量价值时,这种模式尤其有效。如果人类反馈已被证明可以改善 LLM 响应,并且另一个 LLM 能提供质量相近的反馈,就说明它很适合。

    它很适合文学翻译等场景,评估 LLM 可以发现翻译模型最初遗漏的细微含义。对于需要多轮搜索和分析的复杂检索任务也很强大,评估器可以判断是否还需继续搜索。

    参考资料

    • Anthropic 关于构建高效智能体的文章介绍了评估器—优化器模式

    16. LLM 路由器

    问题:不同类型的查询需要不同处理策略。

    解决方案:使用 LLM 把查询路由到最合适的处理器。

    LLM 路由器充当智能调度器,分析每个查询,再发送给正确的专用处理器。

    路由器首先分析查询的类型和复杂度。客户服务系统可以把查询分为以下类别:

    根据分类结果,路由器把查询连接到合适的处理器;每个处理器都有专属指令和能力。

    这种路由方式有几项关键优势:它确保每个查询都由最合适的专用系统处理,从而提高准确率;也让每个专用 LLM 聚焦自身领域,类似于 LLM 调用链把复杂任务拆成专业步骤。

    它还解决了 LLM 的一个根本限制:大多数模型只能处理有限数量的工具,通常不超过 30 个。把查询路由给专用处理器后,系统实际上可以支持无限数量的工具,因为每个处理器只需访问与自己相关的子集。

    不过,增加 LLM 路由器也会多出一个顺序步骤并提高延迟,因为每个查询都必须先经过分析,才能路由到相应处理器。

    参考资料

    • Anthropic 关于构建高效智能体的文章提到了 LLM 路由器
    • 更新:OpenAI 已移除关于意图分类的文档

    17. 微调

    问题:LLM 输出必须满足某些特定质量要求,而简单技术无法做到。

    解决方案:使用自己的数据微调基础模型,提高它在特定场景中的表现。

    微调可以让现有模型适应具体需求。你可以从规模较小但质量很高的示例数据集开始,准确展示期望输出,例如匹配品牌语气、处理专业术语或保持格式一致。针对特定任务微调后,小模型往往能超过更大、更昂贵的模型。

    从成本和复杂度看,微调位于预训练与提示工程之间。它比从头训练模型便宜一个数量级,但每次微调仍会产生额外成本;还可能过拟合特定模型版本,使未来迁移到更新、更好的模型变得困难。

    考虑微调的最佳时机,是系统已经能够工作并采用了更简单的技术之后。此时你已经验证使用场景、收集真实数据,并识别出模型需要改进的具体部分。微调会成为进一步提升系统表现的优化步骤。

    参考资料

    • OpenAI 文档中有关于微调的章节。
    • Anthropic 的微调指南提供了详细要求和最佳实践。

    18. 下一件大事

    AI 工程发展速度惊人。每周都有新模型、新技术和新工具,声称会彻底改变 AI 系统的构建方式。你不可能追上所有变化,也没有必要。

    每项 AI 新进展都必须证明自己值得进入系统。问问自己:“它让事情更简单还是更复杂?它是否解决了真实问题?”最有价值的进展会降低成本、提升性能,或让系统更易维护。

    AI 的下一件大事会不断出现又退潮,但简单始终是可靠指南。使用自己的评测实验新技术,依据具体场景和成功标准进行验证。重点关注那些能以更低复杂度构建更有效系统的进展。