三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

LLM应用开发三维度:从提示工程到平台工程的工程化实践

LLM应用开发三维度:从提示工程到平台工程的工程化实践

1. 项目概述:当LLM开发从“炼丹”走向“工程”

最近和几个团队交流,发现一个挺有意思的现象:大家聊起大语言模型(LLM)应用开发,已经从半年前的“哪个模型效果最好”、“怎么调提示词更灵”,逐渐转向了“我们这套RAG流程怎么优化”、“Agent的稳定性怎么保证”、“线上服务怎么压测”。这个转变很有意思,它标志着一个领域从早期的技术探索和“玄学”调优,开始进入规模化、工程化的深水区。我自己从去年初开始密集投入LLM应用开发,从最初的单点提示词优化,到构建复杂的多智能体工作流,再到如今负责整个应用的生命周期管理,踩过的坑、交过的学费不少。今天想和你聊聊的,就是这个过程中的核心体会:LLM开发远不止是写提示词,它至少包含了三个相互交织又各有侧重的工程维度——提示工程、应用工程和平台工程

理解这三个维度,对于任何一个想在这个领域深耕的团队或个人都至关重要。它帮你跳出“唯提示词论”的局限,看清一个LLM应用从想法到稳定服务的全貌。你会明白,为什么一个在本地跑得飞快的Demo,一上线就各种幺蛾子;为什么别人的Agent能稳定处理复杂任务,你的却动不动就“宕机”。这背后,是不同工程维度上的认知差距和工具缺失。接下来,我们就逐一拆解这三个维度,看看它们各自关注什么、用什么工具、解决什么问题,以及在实际项目中如何协同工作。

2. 第一维度:提示工程——从“魔法咒语”到可复用的构建块

提示工程是大多数人接触LLM的第一站。它直观、反馈快,有点像在和模型“对话”或“下指令”。但早期的提示工程,往往停留在“试错”和“玄学”层面,缺乏系统性和可复用性。真正的提示工程,应该将其视为一种软件工程实践。

2.1 核心范式演进:从零样本到思维链与程序模拟

最初的提示很简单,就是零样本(Zero-Shot)或少量样本(Few-Shot)的直接问答。但很快大家发现,对于复杂任务,直接问效果很差。于是,思维链(Chain-of-Thought, CoT)出现了。它的核心是引导模型“一步步思考”,把推理过程展示出来。这不仅仅是让答案更准确,更重要的是让整个过程变得可调试。你可以看到模型在哪一步“想歪了”,从而有针对性地调整提示。

但CoT还是线性的、描述性的。更进一步的,是程序模拟式提示,比如ReAct(Reasoning + Acting)范式。它要求模型不仅推理,还要规划行动(如调用工具、搜索信息)。这时的提示词,更像是在给模型编写一个“剧本”或“工作流描述”。例如,一个客服Agent的提示词里,会明确包含:“首先,你需要理解用户的问题属于哪个类别(技术故障、账单查询、产品咨询)。如果是技术故障,请依次询问设备型号、故障现象、出现时间。然后根据知识库检索相关解决方案,若没有,则告知用户已升级至人工客服。” 这种提示结构化了模型的输出,使其行为更可控。

注意:思维链提示的成功,高度依赖于模型本身的推理能力。对于较小的模型(如7B参数级别),复杂的CoT提示可能反而会导致它“胡思乱想”,输出混乱。通常,70B参数以上的模型对复杂提示的遵循能力会强得多。在选择范式时,首先要评估你的模型能力。

2.2 系统化实践:模板、变量与版本管理

当提示词变得复杂且数量增多时,靠记事本和复制粘贴就完全不够用了。这时需要引入工程化方法:

  1. 模板化:将提示词抽象成模板,把可变部分抽离为变量。例如,一个总结报告的提示模板可能是:“请基于以下{文档类型},生成一份摘要,重点突出{重点领域},字数控制在{字数限制}以内。” 在实际调用时,动态注入变量值。这大大提升了复用性。
  2. 版本控制:提示词的每次修改都应该被记录。你可以用Git来管理提示词文件(.txt.json),就像管理代码一样。每次优化后提交,写明修改原因和测试结果(如准确率提升了多少)。这避免了“改了半天还不如上一版”的尴尬。
  3. 评估与测试:为重要的提示词建立测试集。这个测试集包含一系列输入和期望的输出(或输出标准)。每次修改提示词后,跑一遍测试集,量化评估效果变化(如使用BLEU、ROUGE分数,或更简单的分类准确率、关键信息抽取成功率)。这使优化过程从“感觉”变成了“数据驱动”。

我自己的习惯是,为每个核心功能建立一个提示词目录,里面包含:prompt_template.j2(Jinja2模板文件)、config.yaml(变量配置)、test_cases.json(测试用例)以及一个简单的evaluate.py脚本。这样,无论是自己迭代还是交给同事维护,都清晰很多。

2.3 高级技巧与常见陷阱

除了范式,一些实操技巧能显著提升效果:

  • 角色扮演(Role Playing):给模型一个明确的角色,如“你是一位经验丰富的Linux系统管理员”、“你是一位严谨的法律文书审核专家”。这能有效约束模型的回答风格和知识范围,使其输出更专业、更聚焦。
  • 输出格式化指令:明确要求模型以特定格式输出,如JSON、Markdown表格、带编号的列表。例如,“请以JSON格式输出,包含problemroot_causesolution三个键。” 这极大方便了后续的程序化处理。但要注意,对于JSON输出,最好在提示词中给出一个明确的示例(Schema),否则模型可能生成不合法的JSON。
  • 负面提示(Negative Prompting):告诉模型“不要做什么”。这在生成内容时尤其有用,比如“避免使用过于口语化的表达”、“不要包含任何主观臆测”。这能减少不希望的输出。

最常见的陷阱有两个:一是提示词过长过细,导致模型注意力分散,甚至忘记前面的指令。对于长上下文模型,这不是大问题,但对于短上下文模型,需要精炼提示。二是忽略模型的“幻觉”倾向。对于事实性问题,永远不要完全相信模型的单次输出,必须通过检索增强(RAG)或要求它提供引用来源来交叉验证。

3. 第二维度:应用工程——构建可靠、可扩展的LLM工作流

如果说提示工程是“砖块”,那么应用工程就是如何用这些砖块搭建起稳固的“房子”。它关注的是如何将LLM能力嵌入到一个完整的软件系统中,处理真实的、复杂的业务逻辑。这里,LangChain、LlamaIndex这类框架成为了标配,但它们也只是工具,核心在于架构设计。

3.1 核心模式:链(Chain)、代理(Agent)与检索增强(RAG)

这是应用工程的三种核心构建模式,复杂度依次递增。

  1. 链(Chain):最简单的模式,将LLM调用与其他操作(如API调用、数据计算)按固定顺序连接起来。比如“用户输入 -> 意图分类 -> 查询改写 -> 向量检索 -> LLM生成答案”就是一个链。它的优点是逻辑清晰、可控性强,适合流程固定的任务。缺点是灵活性差,无法处理需要动态规划路径的复杂问题。
  2. 代理(Agent):更高级的模式。Agent被赋予一个目标,并可以自主选择调用哪些工具(如计算器、搜索引擎、数据库)来逐步达成目标。它核心包含三个部分:规划(Planning)工具使用(Tool Use)记忆(Memory)。Agent的强大在于其自主性,能处理开放域任务。但挑战也在于此:如何保证其决策的可靠性、如何防止其陷入死循环或执行危险操作。在实际项目中,我建议先从ReAct模式的Agent入手,它要求模型将“思考”和“行动”以文本形式交替输出,便于人类理解和调试。
  3. 检索增强生成(RAG):这几乎是当前企业级LLM应用的基石。它解决的是模型知识陈旧、专业领域知识不足以及“幻觉”问题。RAG系统将用户查询与私有知识库(通常是向量数据库)进行匹配,检索出相关文档片段,并将其作为上下文喂给LLM,让LLM基于此生成答案。一个完整的RAG流水线包括:文档加载、文本分割、向量化(嵌入)、存储、检索、重排序、上下文构造、最终生成等多个环节,每个环节都有大量优化点。

3.2 架构设计考量:状态、流式与容错

当应用从Demo走向生产,以下几个工程问题必须考虑:

  • 状态管理(State Management):对话应用是有状态的。你需要管理整个会话的历史(对话记忆),可能还包括用户个人信息、会话目标等。简单的做法是把整个对话历史都塞进上下文,但这会消耗大量Token,且可能让模型迷失在冗长历史中。更优的做法是采用摘要式记忆向量记忆。摘要式记忆定期让模型总结之前的对话要点;向量记忆则将历史对话片段向量化存储,在需要时动态检索最相关的部分注入上下文。LangChain等框架提供了多种记忆后端,但如何设计记忆的更新和触发策略,需要根据业务逻辑仔细设计。
  • 流式输出(Streaming):为了用户体验,不能让用户对着一个空白页面干等好几秒。流式输出是必须的。这要求后端能够处理SSE(Server-Sent Events)或WebSocket,并将LLM生成的Token逐个推送到前端。技术上不复杂,但要注意与整个应用的非阻塞架构结合。
  • 容错与降级(Fallback & Degradation):LLM服务可能不稳定(API超时、限流),模型也可能输出无法解析的内容。你的应用必须有降级策略。例如,当主要LLM API调用失败时,自动切换到备用API或更小、更快的本地模型;当Agent多次尝试失败后,自动转入人工客服通道或返回一个预设的保守答案。重试机制(带指数退避)和断路器模式(Circuit Breaker)在这里非常有用。
  • 可观测性(Observability):线上应用出了错,你得知道为什么。你需要记录和监控关键指标:每个LLM调用的耗时、Token消耗、输入输出(脱敏后)、工具调用记录、最终输出质量(可通过简单规则或轻量模型打分)。这能帮你快速定位问题是出在提示词、检索环节,还是模型本身。

3.3 工具生态与集成

应用工程离不开工具。除了LangChain这类高层框架,你还需要和一系列基础设施打交道:

  • 向量数据库:Chroma(轻量、易用)、Pinecone(全托管、性能好)、Weaviate(功能丰富、自带向量化模块)、Qdrant(性能强劲、Rust编写)等都是热门选择。选型时考虑部署复杂度、性能、过滤查询能力以及是否支持多模态。
  • LLM网关与编排:如果你使用多个模型(如GPT-4处理复杂任务,Claude处理长文本,本地模型处理简单查询),需要一个统一的网关来管理路由、密钥、限流和计费。像OpenAI的库虽然方便,但在生产环境,建议使用Litellm这样的代理,它提供了统一的接口调用数十种模型,并内置了故障转移、重试、缓存等功能。
  • 评估框架:如何自动化评估你的RAG系统或Agent的好坏?RagasTruEraPhoenix等框架提供了评估检索相关性、答案忠实度、信息完整性等指标的工具。将它们集成到你的CI/CD流水线中,可以在每次更新提示词或检索策略后自动运行评估,防止效果回退。

4. 第三维度:平台工程——为规模化应用提供底座

当你的团队有多个LLM应用在开发,或者单个应用需要服务海量用户时,提示工程和应用工程层面的技巧就不够了。你需要一个统一的平台来管理模型、资源、部署和监控。这就是平台工程的范畴,它的目标是让应用开发者能更专注于业务逻辑,而不是底层基础设施。

4.1 模型服务化与推理优化

直接调用云API简单,但成本高、数据出境可能有合规风险、定制化能力弱。因此,许多团队选择私有化部署开源模型。这就带来了模型服务化的问题:

  1. 推理服务器:你需要一个高性能的服务器来加载和运行模型。vLLM是目前公认的高性能推理服务器,它通过PagedAttention等技术极大地优化了内存使用和吞吐量,特别适合高并发场景。TGI(Text Generation Inference)是Hugging Face推出的推理服务器,与Transformers生态结合紧密,功能丰富。Llama.cpp则通过量化技术,让你能在消费级GPU甚至CPU上运行大模型,适合边缘部署或成本敏感场景。选型时,需要权衡性能、功能支持(如是否支持流式、工具调用)和部署复杂度。
  2. 模型量化与优化:原始模型动辄几十GB,对显存要求极高。量化是将模型权重从高精度(如FP16)转换为低精度(如INT4、INT8)的过程,能大幅减少内存占用和提升推理速度,但会带来轻微的质量损失。GGUF是Llama.cpp社区推动的量化格式标准,有从Q2到Q8多种精度可选。通常,Q4或Q5的量化能在质量和效率间取得很好平衡。在部署前,必须用你的业务数据对量化模型进行充分测试。
  3. 批处理与持续批处理:为了提升GPU利用率,需要将多个用户的请求批量处理。持续批处理(Continuous Batching)是一种先进技术,它允许不同请求的生成过程在批次中交错进行,而不是等一个请求完全结束再处理下一个,这能显著提升吞吐量。vLLM就内置了持续批处理能力。

4.2 部署、运维与成本管控

平台工程要确保服务稳定、可控、成本透明。

  • 部署与扩缩容:使用Kubernetes来部署你的推理服务器和应用程序是行业标准做法。通过HPA(水平Pod自动扩缩容)根据请求量自动调整实例数量。你需要仔细配置资源请求和限制(CPU、内存、GPU),特别是GPU的共享策略(如MIG, Multi-Instance GPU)。
  • 监控与告警:除了应用层的可观测性,平台层更需要监控硬件和基础服务。监控GPU利用率、显存使用、请求延迟(P50, P99)、吞吐量(Tokens per second)。设置告警规则,当服务错误率升高或延迟异常时及时通知。Prometheus + Grafana是经典的监控组合。
  • 成本分析与优化:LLM推理成本是大头。你需要能清晰地追踪每个应用、每个用户甚至每个会话的Token消耗和GPU耗时。这有助于进行成本分摊和优化决策。例如,发现某些查询模式总是触发长上下文消耗,就可以优化提示词或检索策略来缩短上下文。对于内部应用,可以设置Token预算或速率限制。

4.3 内部平台与开发者体验

最终,一个成熟的LLM平台会向内部开发者提供一套自助服务:

  • 模型仓库:像Docker Hub一样,管理不同版本、不同量度的模型文件,方便部署时拉取。
  • 实验管理:开发者可以方便地提交不同的提示词、检索配置、模型参数进行A/B测试,并查看对比指标。
  • 流水线服务:提供标准的RAG流水线、Agent框架作为可配置的服务,开发者只需关注业务逻辑和提示词。
  • 安全与合规:集成内容过滤(防止生成有害内容)、数据脱敏、审计日志等功能,满足企业合规要求。

平台工程的构建是一个长期过程,通常从最痛的“模型部署难”和“成本不可控”开始,逐步迭代。它的价值在于,当业务团队想尝试一个新想法时,不再需要花两周时间折腾环境,而是能在平台上几分钟内拉起一个测试服务。

5. 三维度对比与协同实战

理解了三个维度各自的内涵,我们再来横向对比,并看它们如何在一个具体项目中协同工作。

5.1 维度对比一览

维度核心关注点典型工具/技术产出物主要挑战
提示工程与模型的高效、可靠交互思维链(CoT)、ReAct、角色扮演、结构化输出可复用、可测试的提示词模板与策略提示词的效果不稳定、难以量化评估、长上下文管理
应用工程构建完整、可靠的应用逻辑与用户体验LangChain/LlamaIndex、向量数据库、Agent框架、流式传输可部署的应用程序或服务(如FastAPI后端)状态管理、复杂工作流编排、Agent的可靠性、系统集成
平台工程提供稳定、高效、可扩展的模型服务与基础设施vLLM/TGI推理服务器、Kubernetes、模型量化、监控告警模型服务平台、资源调度系统、成本监控仪表盘高并发下的性能与稳定性、GPU资源管理、多模型生命周期管理、成本控制

简单来说,提示工程是“说什么”,应用工程是“怎么用”,平台工程是“在哪跑、怎么管”。一个新手开发者可能只关注提示工程;一个全栈开发者需要精通应用工程;而一个基础设施团队或大型项目负责人,必须面对平台工程的挑战。

5.2 实战案例:构建一个智能客服知识库问答系统

假设我们要为一个软件产品构建一个智能客服助手,它需要回答用户关于产品功能、故障排查等问题。

  1. 提示工程层的工作

    • 设计核心提示模板:首先,设计回答问题的核心提示词。这很可能是一个RAG风格的提示:“你是一位专业的{产品名}客服专家。请严格根据以下提供的参考信息来回答问题。如果信息不足以回答问题,请明确告知用户‘根据现有资料无法确认,建议您……’,切勿编造信息。参考信息:{context}。用户问题:{question}”。
    • 优化检索结果处理:检索到的文档片段(context)可能杂乱、重复。需要设计一个“上下文压缩”或“重排序”的提示词,让模型先对检索结果进行筛选和去重,提炼出最相关的部分,再用于最终答案生成。这能节省Token并提升答案质量。
    • 设计分类与路由提示:在RAG之前,可能还需要一个分类Agent,判断用户问题是“知识库问答”、“工单创建”还是“转人工”。这需要另一个精心设计的提示词。
  2. 应用工程层的工作

    • 构建RAG流水线:使用LangChain定义整个流程:用户输入 -> 查询改写(提升检索效果)-> 向量检索 -> 重排序/压缩 -> 调用LLM生成答案。
    • 集成记忆与多轮对话:需要维护会话历史。可以采用“缓冲窗口记忆”,只保留最近N轮对话,并结合向量存储长期记忆,当用户追问历史细节时进行检索。
    • 实现流式输出与前端交互:后端使用FastAPI实现流式响应,前端用JavaScript逐步渲染生成的答案,提升体验。
    • 添加降级策略:当主要LLM服务(如GPT-4)超时或返回错误时,自动降级到备用模型(如本地部署的Qwen2.5-7B),并记录日志。
  3. 平台工程层的工作

    • 部署推理服务:由于涉及大量内部知识,决定私有化部署一个开源模型(如Qwen2.5-72B)。使用vLLM部署该模型的GPTQ量化版本(INT4),以节省显存。
    • 构建知识库更新流水线:当产品文档更新时,自动触发一个CI/CD流水线:爬取最新文档 -> 分割文本 -> 生成向量 -> 更新到Pinecone向量数据库。这个过程完全自动化。
    • 配置监控与告警:在Kubernetes中部署应用和vLLM服务,配置Prometheus监控各项指标。当API的P99延迟超过3秒,或GPU利用率持续低于20%(可能预示有资源浪费),触发告警。
    • 成本仪表盘:开发一个内部仪表盘,展示每个客服坐席、每类问题的平均Token消耗和成本,为运营优化提供数据支持。

在这个案例中,三个维度紧密协作:平台工程提供了稳定高效的72B模型服务;应用工程利用该服务构建了可靠、体验良好的RAG对话流程;而提示工程则确保了在这个流程中,模型能基于知识库做出准确、可控的回答。任何一层的短板,都会直接影响最终的用户体验和业务效果。

6. 演进路径与团队协作建议

对于个人开发者或团队,如何在这三个维度上发展?

  • 个人开发者:建议从提示工程应用工程入手。先熟练掌握一种框架(如LangChain),能独立构建一个功能完整的RAG应用或简单Agent。同时深入理解提示词设计的各种技巧和评估方法。平台工程可以先使用云服务(如OpenAI API、Pinecone)来绕过,但需要了解其基本概念和成本结构。
  • 创业或中小型团队:在个人能力的基础上,需要开始关注平台工程的萌芽。当应用数量增多或用户量上来后,模型API成本、响应速度、私有化部署需求会浮现。这时,可以逐步引入vLLM来部署关键模型,使用简单的脚本进行监控和成本统计。重点是为未来的规模化预留架构空间。
  • 大型企业或技术平台团队:必须系统性地建设平台工程能力。成立专门的MLOps或LLM基础设施团队,负责模型的生命周期管理、推理平台建设、资源调度和成本优化。同时,为业务开发团队提供易用的SDK、平台门户和最佳实践,让他们能专注于提示工程和应用工程,快速迭代业务逻辑。

在团队协作中,清晰的边界和接口定义很重要。平台团队提供稳定、标准的模型服务和数据服务API;应用开发团队消费这些API,构建最终产品,并负责其业务逻辑和提示词优化;而算法或NLP团队可能更专注于前沿的提示策略研究和模型微调。三者通过清晰的契约(如API文档、SLA、评估标准)协同工作。

最后我想说,LLM开发这片海域,已经从最初发现新大陆的兴奋,进入了需要扎实造船、精确导航的远航阶段。提示词是你的帆和舵,应用架构是你的船体,而平台则是你赖以生存的港口和补给线。忽略任何一个维度,都可能让你在风浪中搁浅。希望这份从“提示词”到“脚手架”的维度对比,能帮你画出一张更清晰的海图,在构建真正有价值、可持续的LLM应用的道路上,走得更稳、更远。在实际操作中,我最深的体会是:尽早建立数据反馈闭环。无论是提示词的效果、RAG的检索质量,还是Agent的任务成功率,都要想办法收集真实用户交互数据,并设计自动化评估流程。这个闭环,是驱动整个系统持续优化的唯一引擎。

← 返回列表