ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI应用架构设计实战:从模型接入到Agent编排的落地指南

AI应用架构设计实战:从模型接入到Agent编排的落地指南 AI应用架构设计这件事很多人一上来就想着画一张大而全的图结果画完发现根本落不了地。我自己从最早做单体后端到后来接大模型API做聊天机器人再到这两年折腾Agent、MCP、多模型路由踩过的坑比画过的图多得多。这篇内容想聊的不是教科书上的分层架构而是把AI应用架构设计这件事拆开揉碎讲清楚一个能跑起来、能扛住流量、能持续迭代的AI应用到底由哪些部分组成每个部分为什么这么设计以及在实际操作中哪些地方最容易翻车。不管你是刚接触AI应用开发的程序员还是想从传统后端转型做AI方向的运维或全栈这篇内容都能给你一条相对清晰的路径。关键词覆盖AI应用、架构设计、Agent、LLM、MCP、RAG、并发、安全。1. 先搞清楚AI应用和传统应用到底差在哪1.1 传统CRUD思维在AI场景下的失效点做惯了传统Web应用的人第一反应往往是把LLM当成一个接口来调用前端发请求后端拼prompt调一次模型API拿到结果返回。这个思路在Demo阶段没问题但一旦上线就会暴露三个致命问题。第一个问题是响应时间不可控。传统接口的P99延迟基本在几十到几百毫秒而一次LLM调用动辄2到10秒如果涉及多轮推理或者Agent工具调用30秒以上都很正常。这意味着你原来的超时配置、连接池大小、前端loading策略全部要重新设计。第二个问题是成本模型完全不同。传统应用扩容主要考虑CPU和内存AI应用的核心成本是token。一次请求消耗多少token取决于输入长度、输出长度、是否带历史上下文、是否走了RAG检索。我见过一个团队做客服机器人上线第一周账单就超了预算三倍原因只是他们把完整对话历史每次都塞进prompt里。第三个问题是输出不确定性。传统接口返回的数据结构是确定的而LLM返回的是自然语言可能多一个字、少一个字段、格式跑偏。你不能用传统的强类型校验去卡它必须设计一套容错和重试机制。提示如果你正在把一个传统项目改造成AI应用先别急着写代码把上面三个问题对应的超时策略、成本预算、输出校验方案想清楚能省掉后面大量的返工。1.2 AI应用架构的核心分层逻辑一个能落地的AI应用我习惯把它分成五层来看从下往上依次是模型接入层、能力编排层、业务逻辑层、交互层、可观测层。这个分层不是照搬教科书而是根据实际排错和迭代的需要来的。模型接入层负责屏蔽不同模型提供商的差异统一接口、统一错误码、统一计费统计。能力编排层是AI应用区别于传统应用的关键它处理的是prompt模板管理、上下文组装、工具调用、RAG检索这些AI特有的逻辑。业务逻辑层就是你的领域代码比如订单处理、工单流转。交互层处理流式输出、多轮对话状态、前端渲染。可观测层贯穿所有层负责日志、追踪、成本监控、效果评估。这么分的好处是当你想换模型、想加一个新工具、想调整检索策略时改动范围是可控的。我见过太多项目把prompt硬编码在业务代码里结果想换个模型要改几十个文件这就是分层没做好的代价。1.3 一个最小可用的AI应用骨架在展开讲每一层之前先给一个最小骨架让你有个整体印象。假设你要做一个智能工单助手用户输入问题系统检索知识库调用LLM生成回答必要时调用工具创建工单。# 伪代码展示核心流程 class AIApplication: def __init__(self): self.model_router ModelRouter() # 模型接入层 self.context_builder ContextBuilder() # 能力编排层 self.tool_registry ToolRegistry() # 能力编排层 self.retriever Retriever() # 能力编排层 self.business TicketService() # 业务逻辑层 self.tracer Tracer() # 可观测层 async def handle(self, user_input, session): with self.tracer.span(handle_request): context await self.context_builder.build(user_input, session) docs await self.retriever.search(user_input) context self.context_builder.inject_docs(context, docs) response await self.model_router.chat(context, toolsself.tool_registry.list()) if response.tool_calls: result await self.tool_registry.execute(response.tool_calls) context self.context_builder.inject_tool_result(context, result) response await self.model_router.chat(context) return response这个骨架看起来简单但每一行背后都有大量设计决策。接下来几章会逐个拆解。2. 模型接入层别把鸡蛋放在一个篮子里2.1 为什么必须做模型抽象刚开始做AI应用的人往往直接调用某一家模型的SDK代码里到处是client.chat.completions.create。这在早期没问题但很快会遇到几个现实问题某家模型涨价了想换、某家模型在某个任务上效果不好想换、某家模型高峰期限流了想降级。如果代码里到处是具体SDK的调用每次换模型都是一场灾难。模型抽象层的核心是定义一个统一的内部接口把不同提供商的差异封装在适配器里。这个接口至少要包含chat对话、embedding向量化、stream_chat流式对话三个方法。每个适配器负责把内部统一的请求格式转换成对应提供商的格式再把返回结果转回统一格式。class ModelAdapter(ABC): abstractmethod async def chat(self, messages, toolsNone, **kwargs) - ChatResponse: pass abstractmethod async def stream_chat(self, messages, **kwargs) - AsyncIterator[str]: pass abstractmethod async def embedding(self, texts) - List[List[float]]: pass class OpenAIAdapter(ModelAdapter): async def chat(self, messages, toolsNone, **kwargs): # 转换messages格式处理tools的schema差异 # 调用SDK捕获异常转成统一错误码 ... class AnthropicAdapter(ModelAdapter): # 类似但处理Anthropic特有的system参数位置 ...2.2 多模型路由的策略设计有了抽象层之后就可以做路由了。路由策略我一般分三种按任务路由、按成本路由、按可用性路由。按任务路由是指不同任务用不同模型。比如意图识别用便宜的小模型复杂推理用强模型向量化用专门的embedding模型。这个策略能显著降低成本因为大部分请求其实不需要最强模型。按成本路由是指设置预算阈值当某个模型的token消耗接近预算时自动切换到更便宜的模型。这个策略适合成本敏感的场景但要小心切换导致的体验不一致。按可用性路由是指主模型失败或超时时自动降级到备用模型。这个策略是保命用的必须有。我建议至少配置两个不同提供商的模型作为互备因为同一家提供商的不同模型往往同时出问题。路由策略适用场景实现复杂度注意事项按任务路由任务类型明确的场景中需要维护任务到模型的映射表按成本路由成本敏感、量大高需要实时统计token消耗按可用性路由所有生产场景低备用模型效果可能差一些2.3 超时、重试与降级的实操细节模型调用的超时设置是个技术活。设太短正常请求被误杀设太长用户等不及。我的经验是首token超时和整体超时分开设置。首token超时一般设5到10秒因为模型开始输出第一个token的时间相对固定整体超时根据任务复杂度设30到120秒。重试要区分错误类型。网络抖动、限流这类错误可以重试但要注意指数退避别一失败就立刻重试那样只会加剧限流。而像输入超长内容被拒这类错误重试也没用直接返回错误更合适。降级策略要提前设计好。当主模型不可用时是切换到备用模型还是返回一个兜底话术还是走缓存这取决于业务。客服场景可能返回兜底话术更安全而内部工具场景切换到备用模型更合适。注意重试次数不要超过3次且每次重试都要记录日志。我见过一个项目因为重试逻辑写错导致一次用户请求触发了上百次模型调用账单直接爆炸。3. 能力编排层Agent和MCP到底解决了什么问题3.1 从固定prompt到动态编排的演进最早的AI应用就是固定prompt用户输入拼一段模板发给模型。这种方式在单一任务上够用但一旦任务变复杂就不行了。比如用户问帮我查一下上周的订单并生成报表这需要先理解意图、再调用查询工具、再调用报表生成工具、最后组织语言回复。固定prompt做不到这种动态流程。这就是Agent要解决的问题。Agent的本质是让模型自己决定下一步做什么。你给它一组工具和一段目标描述它通过多轮推理决定调用哪个工具、传什么参数、拿到结果后下一步做什么。这个循环叫ReActReasoning Acting是目前Agent的主流范式。但Agent有个问题工具的定义和调用协议不统一。每个框架都有自己的工具定义方式导致工具无法跨框架复用。这就是MCPModel Context Protocol要解决的问题。3.2 MCP协议的核心机制拆解MCP可以理解成AI应用的工具接口标准。它定义了一套协议让工具提供方和工具使用方解耦。工具提供方实现一个MCP Server暴露工具列表和调用接口AI应用作为MCP Client通过标准协议发现和调用工具。MCP的核心概念有三个Resources资源、Tools工具、Prompts提示模板。Resources是只读的数据比如文件内容、数据库记录Tools是可执行的操作比如发送邮件、创建工单Prompts是预定义的提示模板方便复用。// MCP Server暴露的工具描述示例 { name: query_orders, description: 根据时间范围和状态查询订单, inputSchema: { type: object, properties: { start_date: {type: string, format: date}, end_date: {type: string, format: date}, status: {type: string, enum: [pending, shipped, completed]} }, required: [start_date, end_date] } }MCP的价值在于你写一次工具所有支持MCP的AI应用都能用。这就像USB接口统一了外设连接一样MCP统一了AI工具连接。目前主流的AI开发框架和工具都在往MCP靠拢包括一些代码编辑器、设计工具都在提供MCP Server。3.3 Agent架构中的记忆与状态管理Agent要能多轮对话就必须有记忆。记忆分短期和长期短期记忆是当前会话的上下文长期记忆是跨会话的知识。短期记忆的管理核心是上下文窗口的裁剪策略。模型的上下文窗口有限你不能把所有历史都塞进去。常见的策略有滑动窗口只保留最近N轮、摘要压缩把早期对话总结成一段话、重要性筛选保留关键信息丢弃寒暄。我一般用滑动窗口加摘要的组合最近5轮保留原文更早的做摘要。长期记忆一般用向量数据库实现。把重要信息向量化存起来需要时检索。但这里有个坑不是所有信息都值得存。我见过一个项目把所有对话都存进向量库结果检索出来的都是无关的寒暄反而干扰了模型判断。正确的做法是只存结构化的、有复用价值的信息比如用户偏好、历史决策、关键事实。class MemoryManager: def __init__(self, vector_store, max_recent_turns5): self.vector_store vector_store self.max_recent_turns max_recent_turns def build_context(self, session): recent session.history[-self.max_recent_turns:] summary session.summary # 早期对话的摘要 relevant self.vector_store.search(session.current_query, top_k3) return { summary: summary, recent: recent, relevant_memories: relevant }3.4 工具调用的安全边界Agent能调用工具就意味着它能产生实际影响。如果工具是发送邮件删除数据执行命令那风险就很大。我见过一个Agent因为理解错了用户意图把测试环境的删除命令执行到了生产环境。安全边界的设计有几个原则。第一危险操作必须二次确认。Agent可以建议执行某个操作但实际执行前要用户确认。第二工具权限要分级。只读工具可以直接调用写操作工具需要额外校验。第三参数要严格校验。不能因为模型说删除id为1的记录就直接删要校验这个id是否在用户权限范围内。提示Agent的工具调用日志一定要完整记录包括调用了什么工具、传了什么参数、返回了什么结果。出问题时这是唯一的排查依据。4. RAG检索增强让模型用上你的私有知识4.1 RAG的基本流程与常见误区RAGRetrieval-Augmented Generation的核心思路是用户提问时先从知识库检索相关文档把文档内容作为上下文一起发给模型让模型基于这些文档回答。这样模型就能回答它训练数据里没有的、你私有的知识。基本流程是文档切分、向量化、存储、检索、重排、注入prompt。看起来简单但每一步都有坑。最大的误区是以为切分越细越好。很多人把文档切成一句话一段结果检索出来的片段缺乏上下文模型看不懂。正确的做法是根据文档结构切分比如按段落、按章节保持语义完整性。一般建议每段200到500字太短信息不足太长检索精度下降。第二个误区是只用向量检索。向量检索擅长语义相似但对精确匹配比如产品型号、错误码效果不好。实际生产中一般是向量检索加关键词检索的混合方案两路结果合并后重排。4.2 文档切分与向量化的实操参数切分策略要根据文档类型来定。技术文档按标题层级切合同按条款切聊天记录按对话轮次切。切分时要注意重叠相邻片段之间保留10%到20%的重叠避免关键信息被切断。向量化模型的选择要考虑语言和领域。通用场景用主流的多语言embedding模型就行专业领域比如医疗、法律可能需要微调或者用领域专用模型。向量维度一般768或1024维度越高精度越好但存储和检索成本也越高。from langchain.text_splitter import RecursiveCharacterTextSplitter splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap80, # 约16%重叠 separators[\n\n, \n, 。, , , , ] ) chunks splitter.split_text(document)4.3 检索结果的重排与过滤检索出来的Top-K结果不一定都相关。直接全部塞给模型不仅浪费token还可能引入噪声导致模型答偏。所以需要一个重排步骤。重排有两种做法一种是用专门的重排模型rerank model它对query和doc的相关性打分比向量相似度更准另一种是用LLM做相关性判断让模型给每个片段打分。前者快且便宜后者准但贵。我一般用重排模型做初筛把Top-20缩到Top-5效果和成本比较平衡。过滤也很重要。要过滤掉低分片段、重复片段、以及明显不相关的片段。可以设一个相似度阈值低于阈值的直接丢弃。如果过滤后没有足够的相关文档宁可告诉用户没有找到相关信息也不要硬答。环节常见问题解决方案切分片段太碎语义不完整按结构切分保留重叠向量化领域术语检索不准领域微调或混合检索检索召回率高但精度低加关键词检索混合召回重排相关文档排后面引入重排模型注入token超限控制片段数量做摘要4.4 RAG效果评估的实用方法RAG做完了怎么知道好不好不能靠感觉。我一般用三个指标召回率、精确率、答案质量。召回率看的是该找到的文档有没有找到可以人工标注一批query和对应文档看检索结果里有没有。精确率看的是找到的文档有多少是相关的同样需要标注。答案质量则要人工评估或者用LLM as judge的方式让另一个模型给回答打分。实际迭代中我会维护一个测试集每次调整切分策略、embedding模型、重排参数后都跑一遍测试集看指标变化。没有测试集的RAG优化就是盲人摸象。5. 并发与性能AI Agent怎么扛住真实流量5.1 AI应用的性能瓶颈到底在哪传统应用的瓶颈通常在数据库IO或CPU而AI应用的瓶颈在模型调用的等待时间。一次LLM调用几秒钟这期间你的服务线程如果被阻塞并发能力就上不去。所以AI应用的第一条性能原则是全链路异步。从HTTP入口到模型调用到工具执行全部用异步IO。Python用asyncioJava用响应式或者虚拟线程Node.js天然异步。同步阻塞的代码在AI场景下是性能杀手。第二个瓶颈是上下文长度。上下文越长模型处理越慢成本越高。所以要在保证效果的前提下尽量压缩上下文。手段包括历史摘要、检索片段精选、prompt精简。第三个瓶颈是工具调用的串行等待。如果Agent需要调用多个工具串行调用会让延迟累加。能并行的工具调用要并行比如同时查订单和查物流没必要等一个完成再查另一个。5.2 流式输出与首屏体验优化用户等10秒才看到第一个字体验很差。流式输出能让用户1到2秒就看到模型开始回答感知延迟大幅降低。流式输出的实现要点后端用SSE或WebSocket把模型的token流式转发给前端前端逐字渲染。要注意处理流中断的情况比如模型调用失败、网络断开前端要有兜底提示。async def stream_response(query): async for chunk in model.stream_chat(build_messages(query)): yield fdata: {json.dumps({text: chunk})}\n\n yield data: [DONE]\n\n流式输出还有个细节工具调用阶段不适合流式。因为工具调用需要模型输出完整的结构化参数才能执行这期间用户看到的是正在思考可以用一个loading状态代替。5.3 缓存策略哪些能缓存哪些不能AI应用的缓存要分层看。embedding结果可以缓存同样的文本向量化结果是一样的缓存能省下大量计算。检索结果可以短时间缓存知识库不常变的话相同query的检索结果可以缓存几分钟。模型回答要谨慎缓存因为同样的输入在不同上下文下可能有不同回答而且用户可能期望每次回答有变化。我一般对高频的、确定性的查询做缓存比如产品价格是多少这类FAQ。对个性化的、需要推理的查询不做缓存。缓存key要包含足够的上下文信息避免不同用户拿到相同的缓存结果。注意缓存要考虑失效策略。知识库更新后相关缓存要及时清除否则用户会拿到过时的答案。5.4 限流、排队与优先级设计AI应用的成本和资源有限必须做限流。限流维度包括用户级每个用户每分钟多少次、全局级整个系统每秒多少次、模型级每个模型每分钟多少token。限流之后是排队。当请求超过处理能力时不能直接拒绝而是排队等待。排队要有优先级付费用户优先、实时交互优先于批量任务。排队时间过长要主动告知用户别让用户干等。class RateLimiter: def __init__(self, redis_client): self.redis redis_client async def acquire(self, user_id, cost1): key frate:{user_id}:{int(time.time() // 60)} current await self.redis.incrby(key, cost) if current cost: await self.redis.expire(key, 60) if current USER_LIMIT_PER_MINUTE: raise RateLimitExceeded()6. 可观测性与成本控制上线后才见真章6.1 日志、追踪与链路分析AI应用的日志比传统应用复杂因为一次请求涉及多次模型调用、多次工具调用、多次检索。没有链路追踪出问题根本不知道是哪一步错了。我一般用OpenTelemetry做追踪每个请求一个trace每次模型调用、工具调用、检索都是一个span。span里记录输入输出、耗时、token消耗、错误信息。这样出问题时能快速定位是哪一步慢、哪一步错。日志要记录关键信息但注意脱敏。用户输入、模型输出可能包含敏感信息记录时要脱敏。但调试时又需要原始信息所以一般做分级生产环境记脱敏后的调试环境记原始的。6.2 token成本监控与预算告警成本控制的核心是实时监控token消耗。每次模型调用后记录消耗的input token和output token按模型单价换算成金额累加到用户、团队、全局三个维度。预算告警要分级达到50%预警达到80%警告达到100%阻断。阻断时可以降级到便宜模型或者直接拒绝新请求。这个策略要根据业务定不能一刀切。监控维度指标告警阈值处理动作用户级日token消耗预算80%通知用户团队级日token消耗预算90%通知管理员全局日token消耗预算100%降级或阻断单次请求token数超过1万记录并分析6.3 效果评估与持续迭代AI应用上线不是终点而是起点。模型会更新、用户需求会变化、知识库会过时所以需要持续评估和迭代。评估分自动和人工。自动评估用LLM as judge让模型给回答打分适合大批量快速评估。人工评估抽样检查适合发现自动评估发现不了的问题。两者结合。迭代要有数据支撑。收集用户反馈点赞点踩、分析bad case、定期跑测试集。每次调整prompt、换模型、改检索策略后都要对比指标变化。没有数据支撑的优化都是拍脑袋。7. 安全与合规AI应用不能踩的红线7.1 输入输出的内容安全AI应用的内容安全包括输入和输出两端。输入端要防止prompt注入用户可能通过特殊输入让模型忽略系统指令。输出端要防止模型生成不当内容。prompt注入的防御手段包括输入过滤检测可疑模式、指令隔离把用户输入和系统指令明确分隔、输出校验检查输出是否符合预期格式。但要注意没有100%的防御所以关键操作还是要有人工确认或权限校验。输出安全一般用内容审核模型或者规则过滤。对敏感词、敏感话题做检测命中就拦截或改写。这个环节不能省尤其是面向公众的应用。7.2 数据隐私与权限隔离AI应用往往要访问用户数据所以权限隔离很重要。核心原则是用户只能通过AI访问自己有权访问的数据。实现上检索时要带上用户权限过滤只检索用户有权查看的文档。工具调用时要校验用户权限不能因为模型说查所有订单就真的查所有订单。多租户场景下租户之间的数据要严格隔离向量库、缓存、日志都要按租户分区。提示数据隐私是红线宁可功能少一点也不能让用户A通过AI看到用户B的数据。这个在架构设计阶段就要考虑后期补很难。7.3 Agent行为的审计与回滚Agent能执行操作就要能审计和回滚。审计是指记录Agent的每一步决策和操作出问题时能追溯。回滚是指操作可以撤销比如误删的数据能恢复。审计日志要包含时间、用户、Agent决策链、调用的工具、参数、结果。这个日志要独立存储不能被Agent自己修改。回滚能力取决于操作类型。数据库操作可以用事务或软删除实现回滚外部API调用可能无法回滚所以这类操作要格外谨慎最好加二次确认。8. 从零搭建AI应用的实操路线8.1 技术选型的决策框架技术选型没有标准答案要看团队和场景。我一般从四个维度考虑团队熟悉度、生态成熟度、性能需求、成本预算。如果团队是Python背景LangChain或LlamaIndex上手快但要注意这些框架抽象层多出问题不好排查。如果追求可控性可以自己写编排逻辑用官方SDK直接调模型。如果团队是Java背景Spring AI是个选择但生态还不如Python丰富。向量数据库的选择也类似。小规模用pgvector就够了不用引入新组件。大规模或者需要高级检索功能再考虑Milvus、Qdrant这些专用向量库。维度选项A选项B建议编排框架LangChain自研早期用框架稳定后逐步自研向量库pgvectorMilvus百万级以下用pgvector模型接入官方SDK统一网关多模型场景用网关部署单体微服务早期单体按需拆分8.2 分阶段落地的优先级AI应用不要一上来就做全。我建议分三个阶段第一阶段做最小闭环一个模型、一个prompt、一个简单的前端。目标是跑通流程验证需求。第二阶段做能力增强加RAG、加工具调用、加多轮对话。目标是提升效果覆盖更多场景。第三阶段做工程化加监控、加限流、加缓存、加安全。目标是支撑真实流量保证稳定性。每个阶段都要有明确的验收标准不要为了做而做。很多项目死在第二阶段就是因为贪多嚼不烂RAG还没调好就急着上Agent。8.3 团队协作与迭代节奏AI应用的迭代节奏和传统应用不同。传统应用改代码就行AI应用还要调prompt、换模型、更新知识库。所以需要一套协作机制。prompt要版本管理每次修改都记录变更和效果。知识库更新要有流程不能随便改。模型切换要评估不能拍脑袋换。这些都需要工具和规范支撑。我见过做得好的团队会有专门的prompt工程师、评估工程师和开发、产品紧密配合。也见过做得差的prompt散落在各个开发手里没人知道线上用的是哪个版本。后者迟早出问题。9. 几个真实踩坑案例的复盘9.1 上下文爆炸导致的成本失控有个项目做智能客服上线两周账单超预算五倍。排查发现他们把完整对话历史每次都塞进prompt而且没有长度限制。一个用户聊了50轮第50轮的prompt包含了前49轮的全部内容token消耗是第1轮的几十倍。修复方案是加滑动窗口和摘要。最近5轮保留原文更早的做摘要。改完后token消耗降了70%效果基本没影响。这个坑的教训是上下文管理要从第一天就做不能等出问题再补。9.2 工具调用权限失控另一个项目做运维助手Agent能执行服务器命令。测试时一切正常上线后有一次Agent把测试环境的清理命令执行到了生产环境删了一批日志。根因是工具没有环境隔离Agent拿到命令就直接执行。修复方案是加环境校验和二次确认危险命令必须人工确认。这个坑的教训是Agent的能力越大安全边界越要严。9.3 检索噪声导致的答非所问还有个项目做知识库问答用户反馈经常答非所问。排查发现检索出来的文档很多是不相关的但都被塞进了prompt模型被噪声带偏了。修复方案是加相似度阈值过滤和重排模型。低于阈值的片段直接丢弃剩下的用重排模型精选Top-3。改完后准确率明显提升。这个坑的教训是检索不是越多越好精准比数量重要。10. 一些个人经验和建议做AI应用架构这两年我最大的体会是别被新概念带跑回到问题本身。Agent、MCP、RAG这些都是工具用不用取决于你的场景需不需要。一个简单的FAQ机器人可能固定prompt加关键词检索就够了没必要上Agent。第二个体会是可观测性要前置。很多人把监控当成上线后的事结果出问题两眼一抹黑。我的做法是开发阶段就把追踪和日志加上这样调试也方便。第三个体会是成本意识要贯穿始终。AI应用的成本是持续的不像传统应用一次性投入。每次设计决策都要考虑成本影响能省则省。最后分享一个实用技巧建一个bad case库。每次发现效果不好的案例就记录下来分析原因归类。时间长了你会发现大部分问题集中在少数几类针对性优化这几类效果提升最明显。这个库也是评估迭代效果的最好素材。AI应用架构设计没有银弹每个场景都有自己的最优解。但底层逻辑是相通的理解模型的能力边界设计好编排和容错控制好成本和风险持续迭代优化。把这些做好你的AI应用就能从Demo走向生产。
返回列表