ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

后端工程师必看:从API到Token,大模型应用开发实战指南

后端工程师必看:从API到Token,大模型应用开发实战指南 大模型这波浪潮最纠结的其实不是算法工程师反而是我们这些后端开发者。算法团队的同事天天在研究训练和微调而业务部门已经开始拿着ChatGPT的截图来提需求了这个功能能不能接到我们的系统里你说不会那不行需求已经排期了。于是很多人开始临阵磨枪翻大模型文档调API结果发现自己写了几年代码面对大模型的返回值却有一种无从下手的感觉。这篇文章就是写给这类后端开发者的。我会从你熟悉的Web开发、API设计、数据库交互的视角出发带你重新理解大模型应用开发这件事。它不是什么玄学也不是只有算法工程师才能干的事。恰恰相反后端工程师在工程化、稳定性、性能优化上的积累在LLM应用落地阶段反而是最稀缺的能力。核心问题只有一个你得把思维方式从读写数据库切换到和模型对话。1. 后端开发者做LLM应用开发优势比想象中大1.1 你以为要转行其实是在复用旧技能很多后端同学一听到大模型三个字第一反应是这需要数学基础吧需要懂Transformer吧说实话如果目标是做应用开发而不是去训练模型或者发明新的模型架构那你需要啃的理论非常有限。真正核心的工程能力——API设计、数据建模、缓存策略、异步处理、服务治理——这些你在后端领域已经练了无数遍的技能在LLM应用里依然是底座。我自己团队里就有个很有意思的案例。去年做AI客服系统算法同事负责模型选型和prompt调优但真正让系统稳定跑上线的是一个干了五年订单系统的后端同学。他把原来处理消息队列的那套思路搬了过来请求先入队模型调用做并发控制失败自动重试超时熔断降级最后接上监控告警。整个系统上线后模型本身没怎么出问题反而是他这套工程兜底让故障率降了80%。所以你应该转变心态你不是要从零开始你是要把已有的工程能力迁移到一个新场景里。1.2 后端经验里哪些能直接迁移我做了一个对照后端工程师日常接触的技术栈几乎都能在LLM应用开发里找到对应的位置API设计经验你懂RESTful规范、懂接口版本管理这在封装模型调用层时非常有用。无论是设计一个统一的模型网关还是给业务方提供内部SDK你比只会写prompt的人更清楚接口稳定意味着什么。数据库与数据建模能力LLM应用里有大量的知识库构建、向量化、缓存设计这些本质上还是在和数据打交道。你会MySQL、会Redis再上手向量数据库就很快。性能优化思维大模型的推理延迟是毫秒级到秒级比普通API慢得多。你在后端练就的缓存、异步、并发控制本领在这里能发挥巨大价值。同样的对话应用有人响应要5秒有人优化到800毫秒区别就在工程能力上。异常处理与稳定性意识写业务代码时你习惯了对各种异常做兜底这种工程洁癖在LLM时代极其稀缺。模型返回格式漂移、超时无响应、token耗尽这些都需要你写防御性代码。说白了一项技术能不能落地算法是上限工程是下限。而后端工程师就是决定下限的人。2. 从API调用到Token消费LLM应用的架构思维转变2.1 LLM不是一个普通HTTP接口刚开始做大模型应用的时候很多后端同事会习惯性地把模型API想象成一个普通的POST接口传参数进去等结果返回。这个直觉对了一半但忽略了一个关键差异——普通接口的输出是确定性的而大模型API的输出是非确定性的。你传一个JSON过去正常接口返回的结构、类型、字段都是固定的。但是调大模型同样的问题它每次返回的内容都可能不一样甚至返回的格式都可能变。这就要求你的代码不能像写传统的API调用那样直接解析返回值的固定字段而是要有一层容错与解析兜底。举个例子你想让模型返回一个包含订单号和售后原因的JSON直接在prompt里写请返回JSON格式大概率是能拿到JSON的但偶尔它会多给你一些解释性文字或者把JSON放在Markdown代码块里。如果你用json.loads()直接解析程序就崩了。这种场景传统的接口调用里永远不会出现但在LLM应用里是常态。2.2 从读数据库到和模型对话的思维切换后端开发的日常是把业务逻辑变成SQL查询或API调用数据是结构化的逻辑是确定的。但LLM应用里核心任务是对话——你要把用户的问题、系统的上下文、业务规则拼成一个合理的提示词Prompt然后交给模型去理解和生成。这种思维切换我体感最强的是从过滤到引导的转变。传统后端程序员处理输入第一反应是校验、过滤、拒绝非法请求。但大模型应用不一样你需要做的是引导模型理解你的意图给出合理的输出。校验依然在但重心从拦变成了导。具体来说你要会写这几类内容System Prompt系统提示词相当于给模型设定身份和行为准则类似于给一个外包员工发工作要求。比如你是一个售后客服回答必须简洁不确定的内容不要编造。Few-shot 示例少样本示例给模型举几个输入输出的例子帮助它理解你期望的格式和风格。这比单纯用自然语言描述要求有效得多。结构化输出约束让模型以JSON或XML格式返回配合schema校验保证下游系统能稳定解析。这几样东西本质上是新的接口契约。只不过传统接口的契约靠代码强约束模型场景的契约靠提示词加代码双保险。2.3 TokenLLM应用里的钱和时间后端工程师需要建立一个新的成本意识Token词元。Token是模型处理和生成的文本最小单位你发给模型的每一个字模型返回的每一个字都折算成Token然后从你的账户里扣钱。这里有个很反直觉的点你发出去的提示词越长消耗的Token越多响应越慢费用也越高。传统接口调用请求体大一点只是占用带宽影响不大。但在LLM场景请求体直接决定你花多少钱、等多久。我见过不少人刚上手的时候习惯把整本操作手册塞进提示词里让模型去回答结果一次请求烧掉几千Token响应时间飙到十几秒。正确做法是只塞和当前问题相关的上下文比如从数据库里查出用户当前的订单信息只把这一小段数据拼进提示词。这就涉及检索和裁剪了也是后面RAG章节会细说的内容。3. 提示工程后端开发者必须补上的第一课3.1 提示词就是新的API参数需要版本管理后端都有接口文档参数写在Swagger里调用方照着传。在LLM应用里提示词就是你对模型的接口参数而且这个参数非常不稳定经常需要调。我建议把提示词当代码一样管理进Git写版本发版时记录prompt的改动和效果变化。很多团队前期不重视这个prompt直接在代码里硬编码改一版就覆盖一版出了线上问题根本说不清楚是模型升级了还是prompt被改了。我后来习惯把所有prompt模板放在独立的配置文件里用模板引擎比如Jinja2渲染变量线上动态加载。这样prompt和业务代码解耦调试的时候可以直接在测试环境改配置不用重新发布服务。3.2 System Prompt和Few-shot的正确使用方式System Prompt是你给模型设定规则的入口。一个合格的System Prompt至少要包含四件事角色定位、任务目标、约束条件、输出格式。不要嫌模板化模型真的吃这一套。我之前做过一个合同审查助手最开始System Prompt就一句话你是一个合同审查专家。结果模型经常自由发挥回答没有结构甚至编造条款。后来改成你是一个合同审查专家。 你的任务是审查用户提供的合同文本找出其中的风险条款。 约束条件 1. 只基于提供的合同内容作答禁止编造条款。 2. 如果合同中没有相关信息明确说明未提及。 3. 输出格式为JSON包含risk_items数组每项包含clause和reason两个字段。效果立刻改善返回内容稳定多了。这就是把需求说明书写清楚的力量。Few-shot示例更是如此。你希望模型输出某种格式直接在prompt里给两个例子比你说一百遍请按照这个格式输出都管用。这就像你培训新员工光讲流程不行给两个样例一看就懂。3.3 提示词调优的工程化方法不要靠感觉瞎调prompt要建立评测机制。后端同学熟悉单元测试在LLM应用里也要写评测用例。你可以准备一组固定的测试问题每次改完prompt后跑一遍看回答质量有没有下降。质量判断可以靠人工评分也可以让另一个模型打分甚至用一些自动化指标比如JSON解析成功率、关键词命中率。我个人的血泪教训不要在生产环境直接改prompt调参一定要先在离线数据集上验证。因为你无法预料某个改动对存量用户的影响可能你以为改进去一个优化结果把别人正在用的场景搞坏了。4. RAG实战把数据库里的业务数据加工成大模型能读懂的内容4.1 为什么需要RAG模型不知道你的业务数据大模型的知识截止到训练数据那一刻它不知道你数据库里有哪些订单、哪些用户、哪些库存。那怎么让它回答业务相关的问题呢有两种思路一种是把业务数据喂进去微调模型成本高而且模型更新一次数据就得重新微调一次非常笨重另一种就是我们这节要讲的RAGRetrieval-Augmented Generation检索增强生成把数据先查出来再塞进prompt给模型。我打过个比方RAG就是给模型配了一个随叫随到的资料库。用户问问题的时候先根据问题去资料库里检索相关片段拼进prompt然后让模型基于这些资料来回答。模型不擅长记你的业务数据但它擅长从你给的资料里提取和归纳答案。4.2 从关系数据库到向量数据库数据加工链路做RAG的第一步是把你现有的数据变成模型能读懂的形式。这里最核心的操作叫做Embedding嵌入就是把一段文本转换成一个高维向量让语义相近的文本在向量空间里距离更近。以搜索词里那个问题如何把关系数据库里的数据加工成大模型读懂的数据为例完整的加工链路是这样的导出数据从MySQL、PostgreSQL里把需要开放的业务数据导出来比如商品信息、FAQ、售后规则每一条作为一行原始文本。清洗与切分如果文本太长需要按段落或语义块切分。比如一篇商品介绍可能有几个维度切成基本信息使用说明退换政策几段。切分粒度直接影响检索效果太粗检索不精准太碎上下文割裂。Embedding向量化用Embedding模型比如BGE、M3E、OpenAI的text-embedding-3-small把每段文本转成向量存到向量数据库如Milvus、Qdrant、pgvector里。构建检索接口用户提问时同样把问题嵌入成向量在向量库里做相似度检索取Top-K相关片段。拼装Prompt把检索到的片段和用户问题一起交给大模型。这条链路里后端开发者的数据库知识非常有优势。你可以直接写SQL把数据查出来清洗用定时任务做增量同步保证向量库里的数据和业务库实时或准实时一致。4.3 向量检索不是银弹需要结合业务规则向量检索擅长语义相似度匹配但它不理解业务逻辑。比如用户问我的订单为什么还没发货向量检索能匹配到关于发货时效的说明但如果你希望未发货原因能精确关联到他当前订单的状态那还得靠传统SQL先把这个订单的物流信息查出来拼进上下文。实际项目里最好的实践是混合检索先用SQL把用户相关的动态数据查出来再用向量检索匹配通用知识文档一起拼进prompt。前者保证精确性后者提供语义泛化能力。另外向量检索还需要一个重排Rerank的环节。向量召回Top-20候选片段后如果全塞给模型token消耗太大。所以要用一个重排模型对候选片段做精细排序取Top-3到Top-5拼进prompt。这就像数据库里先粗筛再精排层级化减少噪声。4.4 一个最小可用的RAG流程示例我贴一个简化版的流程伪代码方便你直观理解数据是怎么流起来的# 伪代码RAG查询流程 def answer_question(user_question, user_id): # 1. 精确查询从业务库取用户个性化数据 order_info query_order(user_id, user_question) # 2. 向量检索从知识库取相关文档片段 question_vector embed(user_question) doc_chunks vector_db.search(question_vector, top_k5) # 3. 重排精排取Top-3 ranked_chunks rerank(user_question, doc_chunks)[:3] # 4. 拼装Prompt context build_context(order_info, ranked_chunks) prompt render_template(system_prompt, contextcontext, questionuser_question) # 5. 调模型并解析返回 response call_llm(prompt) return parse_response(response)这个流程里每一步都是后端工程师熟悉的活儿查库、调API、拼数据、做防御性解析。你只多学了一个新的中间件——向量数据库和Embedding模型。5. 模型选型与部署调用API还是本地部署5.1 API派最快上手的路径对大部后端团队来说第一版应用直接调用云端大模型API是最务实的做法。通义千问、GPT系列、Claude、文心一言等都有提供API注册后拿到Key就能用几分钟可以跑通第一个Demo。API派的优势在于你不需要关心GPU、显存、模型权重这些基础设施按量付费前期待验证阶段成本可控。而且主流API都有完整的SDK错误码、限流策略、流式输出都封装好了很适合我们这些没有算法背景的后端工程师。但API派有几个隐患数据隐私你的业务数据会经过云端模型很多公司数据安全部门不会批准。网络延迟与依赖你的服务质量完全取决于模型提供方的稳定性它一旦限流或故障你只能干瞪眼。成本不可控高并发下Token消耗会飞速上升账单容易失控。5.2 本地部署派隐私和成本之间的博弈本地部署大模型是最近特别热的话题。常用工具包括Ollama、vLLM以及各种开源模型如千问系列、Llama系列等。后端团队做的比较多的是用Ollama在开发机上先把模型跑起来做功能验证再用vLLM做高并发生产的部署。但本地部署不是免费的午餐。你需要一台带GPU的服务器显存大小直接决定你能跑什么量级的模型。一个7B参数的模型做FP16推理大概需要14GB~16GB显存算上KV Cache实际需要20GB以上。如果是70B模型单卡根本跑不动多卡部署还需要考虑张量并行复杂度直接上一个台阶。我的建议是团队里如果没有懂GPU运维的人前期先用API验证应用逻辑等业务逻辑跑通了、数据量起来了再评估本地部署的性价比。不要一上来就买卡。5.3 FP16、BF16到底怎么选精度与显存的权衡搜索词里有个很专业的问题LLM大模型之精度问题FP16、FP32、BF16详解与实践我在这多说几句这属于部署阶段一定会遇到的坑。大模型在训练和推理时权重和激活值的存储精度决定了显存占用和计算效率。FP32是32位浮点精度最高但显存占用大。FP16是16位半精度显存减半但表达范围有限可能出现数值溢出。BF16是另一种16位格式保留了FP32的动态范围牺牲了小数精度在深度学习场景下反而比FP16更稳定。实际部署推理时绝大多数场景用FP16或BF16就够了。模型效果损失微乎其微但显存和速度的提升非常明显。如果你还想进一步压缩可以用INT8量化但精度损失开始变得明显一般对推理速度有硬指标时才考虑。给一个直接的建议刚开始用Ollama或vLLM的默认精度通常是FP16或BF16就好不用自己折腾精度转换。如果你卡的显存不够跑整个模型优先考虑更小的模型版本而不是硬着头皮做激进量化。6. 生产环境落地后端工程师真正要面临的问题6.1 高并发与延迟流式输出的必要性大模型响应时间长一个复杂问题的生成可能要3~6秒。如果等模型全部生成完再返回给前端用户体验极差。解决方案是流式输出Streaming模型每生成一个Token就立刻推给前端用户看到的效果就是打字机式的逐字输出整体体感会好很多。后端的流式推送需要用到SSEServer-Sent Events或WebSocket。如果你只是做问答类应用SSE足够如果你要做Agent类应用模型在后台多次调用工具再输出建议用WebSocket因为前后端还需要双向通信。我建议从第一天就把流式输出纳入架构设计不要等后期再改。因为流式输出会改变你的API设计、网关层配置和日志记录方式后期改造特别痛苦。6.2 Token消耗账单监控与成本优化我对所有接大模型的团队只有一个建议从第一天就做Token计费监控。统计每个用户、每个请求、每个功能模块消耗的Token数量按天聚合出报表。具体做法很简单在模型调用网关层做一个拦截器记录每次请求的输入Token数、输出Token数和延迟异步写入日志系统定时聚合到监控面板。当用户反馈某个功能太贵了的时候你可以直接查报表定位是哪个环节的Prompt太长或者模型返回太长针对性优化。优化手段一般有三个方向缩短Prompt把不相关的上下文从提示词里拿掉只保留必要字段。限制输出长度在API参数里设置max_tokens对不需要长回答的场景比如分类、打分、抽取把上限压到200以内。模型降级简单任务用便宜的小模型复杂任务才用大模型。做一个路由层根据问题的难度动态选择模型。6.3 稳定性保障超时、重试、熔断、降级大模型API的稳定性远不如传统数据库。它可能超时、限流、返回格式错误甚至直接挂掉。所以你的服务必须做好兜底超时设置调用模型API的HTTP客户端要设超时时间不能无限等待。一般生成类任务给60秒但前端可以在10秒内先返回部分内容。重试策略对限流429和网络错误5xx做指数退避重试。注意一定是指数退避不要固定间隔重试否则会加剧对端压力。熔断降级如果模型服务连续失败触发熔断直接返回预设的兜底话术而不是把错误抛给用户。缓存层对高频重复问题做语义缓存同一个问题在一定时间内的答案直接复用既省成本又降延迟。这些能力后端工程师做起来轻车熟路。你会把Hystrix或者Sentinel那套思路搬过来只不过被保护的对象从数据库变成了模型API。有这些工程兜底即使模型服务端出了问题你的用户也几乎无感。6.4 模型输出安全不是敏感词过滤就完事了最后聊一下模型输出的合法合规问题。传统后端做内容审核一般就是敏感词列表加正则。但大模型的输出是动态生成的一条看似正常的回答里可能隐含着诱导性、歧视性或者违反平台规范的内容。所以如果你做的是面向C端的应用建议接入专门的内容审核服务或者至少用一层输出过滤器来做拦截。另外要特别注意模型幻觉问题。模型经常一本正经地编造不存在的知识这时一定要在System Prompt里注明只基于提供的资料回答不清楚就说不清楚同时你还要有事实核验的环节尤其涉及订单、物流、售后等真实数据时让模型先检索数据再作答而不是自己编。7. 给后端开发者的学习路线建议7.1 四周入门路线你可以按下面的路线用四周时间把LLM应用开发这条路趟一遍第一周跑通API调用。注册一个主流大模型API用Python或Node.js调通一个最简单的ChatCompletion理解请求参数、返回结构、Token计费。再花一天时间学会用LangChain或LlamaIndex这样的框架封装一次调用了解它的核心抽象。第二周吃透Prompt工程。自己写一个角色扮演或内容生成的prompt模板分别用System Prompt、Few-shot、结构化输出的方式对比效果。建立你自己的测试集用三条以上固定问题去检验每次改动。第三周做一个RAG小项目。把公司或自己的某个知识库比如FAQ文档做Embedding存入向量数据库写一个本地问答服务。让它能回答基于知识库内容的提问并处理知识库查不到的情况。第四周深入生产化。为你的RAG服务加上流式输出、缓存、监控、成本统计。再考虑一个更实际的场景比如AI客服助手或智能工单分类把整个工程链路串起来。7.2 工具与资源清单我把自己用下来比较顺手的工具整理了一下你可以按需选用模型API通义千问、GPT系列、Claude、Kimi等按业务场景选择国内业务优先考虑国内模型的合规和延迟。本地部署Ollama个人开发和轻量场景、vLLM高并发生产场景、llama.cpp嵌入式或CPU推理。向量数据库pgvector如果你已经用PostgreSQL入门最快、Milvus大规模生产场景、Qdrant易用性较好。编排框架LangChain生态最全但学习曲线稍陡、LlamaIndex更擅长RAG、Spring AIJava后端团队可以考虑熟悉Spring生态。Prompt管理LangSmith或自研一套模板配置中心。评测工具自建离线测试集或者用G-Eval等方法做自动化评测。我的个人建议是RAG这块先用LangChain快速搭起来跑通流程等以后规模大了再慢慢用自己写的模块替换别一上来就陷入框架细节里。7.3 心态与职业建议后端工程师学大模型应用我个人最大的感受是不要被算法恐惧吓倒也不要被机会主义带偏。你不需要成为一个能训练模型的算法工程师但你要成为一个能把这套技术稳定落地的工程专家。这波AI浪潮里真正缺的从来不是能调包的人而是能把模型接进复杂业务系统、搞定高并发、控制成本、守住合规底线的人。我自己这几年在团队里带新人的经验是能写一手好SQL、懂索引优化和数据建模的后端工程师转LLM应用开发的速度比你想象得快得多。因为LLM应用的本质依然是数据流和状态管理只不过数据的形态从结构化的表格变成了非结构化的文本和向量交互的方式从CRUD变成了对话。最后分享一个我一直在用的习惯每次接到新的AI需求先别急着写代码先用文字描述一遍用户发起请求→系统检索数据→模型生成回答→返回给用户的完整链条标注出哪些环节是精确计算、哪些环节是概率生成。精确计算的部分用传统代码保证质量概率生成的部分用提示词和工程兜底控制风险。把这两类逻辑分清楚LLM应用开发的思路就会清晰很多。如果你已经有一定的后端基础建议就按上面四周的路线动手。代码写起来坑踩起来比看十篇文章都管用。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进