十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

LLM应用落地实战:RAG与Agent生产级开发指南

LLM应用落地实战:RAG与Agent生产级开发指南 1. 这不是一份清单而是一张LLM应用开发的实战地图“awesome-llm-apps”——看到这个词组第一反应不是点开GitHub仓库扫一眼star数而是下意识摸了摸自己电脑里那个跑着Ollama、连着本地Milvus、文档切块脚本还卡在chunk_size512调试阶段的项目文件夹。它根本不是什么“开源项目合集”的冷冰冰标签而是一群人在真实世界里用LLM撬动业务边界的集体作业簿有人用RAG把十年产品手册变成客服机器人有人把销售话术库喂给Agent自动跟进线索还有人把内部Wiki会议纪要代码注释全塞进向量库让新员工第一天就能问出“上周三PR#4523为什么回滚”这种精准问题。核心关键词就四个字LLM应用落地。它不关心千亿参数怎么训只解决“怎么让大模型在我们自己的数据、流程和约束条件下稳定输出可交付结果”这个具体问题。适合谁不是纯算法研究员而是后端工程师想加个智能搜索框、产品经理要验证AI功能可行性、运维同学得把日志分析自动化、甚至市场同事想批量生成个性化邮件模板——只要你的工作流里有“重复性文本处理决策辅助知识调用”你就在这张地图的覆盖范围内。我试过把一个200页的SOP文档做成RAG服务上线后客服平均响应时间从8分钟压到47秒也踩过坑在没做schema校验的情况下直接把用户query扔给LLM生成SQL结果它把“上季度销售额”理解成“上季度销售部员工人数”差点导出错误报表。所以这篇不是教你复制粘贴代码而是拆解那些藏在star数背后的、真正决定项目成败的细节为什么选LangChain而不是LlamaIndex做编排RAG里的分块策略怎么影响召回率Agent的工具调用失败时日志里哪三行信息能救命接下来的内容全部来自我过去18个月在6个生产环境LLM项目里一行行debug、一次次重训、一版版迭代攒下来的实操笔记。2. 项目整体设计逻辑从“玩具Demo”到“生产级应用”的四道坎2.1 为什么“awesome-llm-apps”本质是反模式的起点很多人第一次接触这个标题会本能地把它当成技术选型指南——点开仓库按star排序找最高分的RAG框架抄配置。但实际踩坑后才发现这恰恰是最大的陷阱。真正的设计起点从来不是“用哪个开源库”而是明确你的应用在业务流中的位置和容错边界。举个例子同样是客服场景电商订单查询系统要求99.9%的准确率输错单号必须明确告知“查无此单”不能瞎猜而内部IT支持系统允许10%的模糊匹配问“打印机连不上”能返回驱动安装网络排查纸盒卡顿三类方案。前者必须用Hybrid RAG严格schema校验fallback规则引擎后者用基础RAGLLM微调就够了。我在做某金融客户知识库时最初直接套用LangChain的RetrievalQA链结果发现当用户问“2023年Q3理财收益率对比”时LLM会把检索到的三份PDF里分散的数字自行拼凑生成一个根本不存在的表格。后来改成强制要求LLM只输出JSON格式且字段名必须与向量库元数据schema完全一致再加一层Python脚本做数值校验才把错误率从17%压到0.3%。所以设计逻辑的第一步永远是画出这张图你的LLM模块输入是什么结构化表单/非结构化对话/多模态文件、输出要对接什么系统CRM弹窗/邮件API/数据库写入、中间哪些环节可以容忍LLM“发挥”哪些必须硬编码兜底。所有技术选型都只是这张图上的填充物。2.2 开源框架选型不是比功能多而是比“失控点”少当前主流框架的差异根本不在API是否优雅而在对不可控环节的约束能力。LangChain的优势在于它的“链式思维”天然适配复杂工作流比如一个销售线索跟进Agent需要先用RAG查客户历史订单再调用CRM API获取最新联系人最后用LLM生成个性化邮件。LangChain的RunnableSequence能把这三个异步操作串成原子任务失败时自动回滚到上一步。但它的致命伤是调试黑洞——当你发现邮件内容突然变味得在invoke()调用栈里逐层扒日志因为每个组件都可能修改prompt或context。LlamaIndex则相反它把检索过程封装得极深QueryEngine对象像黑盒一样吐出答案但好处是当你需要深度定制分块逻辑比如法律合同必须按条款编号切分不能按字符数它的NodeParser体系比LangChain的TextSplitter更透明。我做过对比测试同样处理10万份医疗报告PDF用LlamaIndex自定义SentenceWindowNodeParser召回相关段落的F1值比LangChain默认RecursiveCharacterTextSplitter高12.6%因为前者能保留“主诉-诊断-治疗”这个临床逻辑链后者只是机械切段。至于FastRAG这类新兴框架胜在部署轻量——它用纯Python实现向量检索不用启动Milvus或Chroma服务适合边缘设备场景。但代价是牺牲了高级功能比如无法做跨文档实体关联。所以选型公式很简单如果业务流复杂度3个外部系统交互选LangChain如果文档结构特殊且检索精度要求极高选LlamaIndex如果部署环境受限如车载终端选FastRAG。别被GitHub star数迷惑你真正要盯住的是框架文档里那句“Customization requires modifying core classes”——这意味着一旦需求变化你得改源码而不是写个插件。2.3 RAG与Agent的共生关系没有纯RAG也没有纯Agent网络热词里总把RAG和Agent分开讨论但实际项目中它们是咬合齿轮。RAG解决“知识从哪来”Agent解决“知识怎么用”。一个典型误区是先搭好RAG知识库再往上堆Agent逻辑。结果往往是Agent调用工具时RAG返回的context里混着无关噪声导致LLM生成错误指令。我在做智能菜谱系统时就栽过跟头用户问“糖尿病人能吃红烧肉吗”RAG从营养学指南里检出“糖尿病饮食原则”和“红烧肉热量表”两段但没标注优先级。Agent拿到这两段后让LLM自己判断结果模型根据“红烧肉”关键词权重更高直接输出“建议少吃”忽略了前面“糖尿病饮食原则”里明确写的“优质蛋白摄入不足时可适量食用”。后来改成RAG预处理阶段就注入领域权重营养学指南文档打标priority: high热量表打标priority: medium检索时强制按priority加权排序。Agent再调用时context里永远是高优先级内容在前。另一个关键点是状态管理。纯RAG是无状态的每次query独立处理Agent必须维护对话状态。比如用户说“把刚才推荐的菜谱发到邮箱”Agent得记住“刚才”指代哪次生成结果。我们用Redis存session_id→last_recipe_id映射但发现当用户连续发三条消息时Redis里只保留最后一条。最终方案是在Agent的tool call里强制传入session_state参数每次调用都更新这个state哪怕只是记录时间戳。这听着琐碎却是避免Agent“失忆”的底线。2.4 开源项目的隐藏成本你以为的免费其实是时间税“awesome-llm-apps”列表里90%的项目都标着MIT许可证但真实成本远不止代码本身。首先是依赖地狱某个star过万的RAG项目要求Python 3.10、PyTorch 2.1、transformers 4.35而你的生产环境还在用CentOS 7内核不支持新glibc强行升级会导致现有Java服务崩溃。我们花两周把整个LLM栈容器化用Dockerfile锁死所有依赖版本才解决这个问题。其次是数据合规墙很多开源RAG项目默认用HuggingFace的embedding模型但企业内网禁止外连。换成本地部署的BGE-M3模型后向量维度从768变成1024原有Milvus索引全失效得重新建库。最隐蔽的成本是监控盲区开源项目通常只提供基础metrics如token消耗量但生产环境需要知道“第37次检索为什么耗时2.3秒”。我们在所有RAG组件前后加了OpenTelemetry埋点专门监控retriever_latency、llm_generation_time、context_truncation_ratio上下文被截断比例三个指标。当context_truncation_ratio持续高于15%说明chunk_size设小了得触发告警自动调整。这些都不是框架自带的是你必须亲手焊上去的钢筋骨架。3. 核心细节解析RAG分块、Agent工具调用、向量库选型的硬核选择3.1 RAG分块不是技术问题而是业务语义问题所有教程都在教你怎么用RecursiveCharacterTextSplitter但没人告诉你分块策略的本质是把业务规则翻译成向量空间的语言。比如法律合同按512字符切可能把“甲方违约责任”条款硬生生劈成两半导致检索时只召回后半句“赔偿乙方损失”却漏掉前半句“赔偿金额不超过合同总额20%”。正确做法是识别文档结构特征合同里必然有“第一条”、“第二条”等编号用正则r第[零一二三四五六七八九十百千]条做分隔符确保每块都是完整条款。再比如技术文档API接口描述往往包含请求示例、响应格式、错误码三部分用# 请求示例这样的Markdown标题做分割点比按字符数切靠谱十倍。我们做过实验同一份Kubernetes文档用语义分块按## API Reference二级标题比随机分块召回相关API参数的准确率提升34%。关键技巧是混合分块法先用大粒度分块如按章节再对每个大块做小粒度分块如按段落最后把大小块都存入向量库。这样既能保证宏观语义完整又不失微观细节。Milvus里用partition_key区分大小块类型检索时加filter限定只查小块避免大块噪声干扰。参数设置上大块size设为2000字符保证章节完整性小块size设为256字符适配LLM上下文窗口overlap统一设为64字符——这个64不是随便定的而是基于BERT tokenizer平均子词长度约4字符×16保证语义连贯所需的最小重叠token数算出来的。3.2 Agent工具调用失败不是异常而是常态开源Agent框架最爱吹嘘“自动工具选择”但现实是80%的工具调用失败源于输入校验缺失而非LLM推理错误。比如调用CRM API查客户信息LLM生成的JSON里customer_id字段可能是字符串ABC-123而API实际要求整数123。框架默认把错误响应原样返回给LLM让它“反思”——结果LLM在下一轮里把customer_id改成123还是字符串。正确解法是在工具层做强校验写一个CRMClient类get_customer()方法接收参数前先用Pydantic Model做类型转换和约束customer_id: int Field(gt0)。一旦校验失败直接抛出ValueError(customer_id must be positive integer)Agent捕获后不再重试而是返回结构化错误信息“客户ID格式错误请输入纯数字”。这个设计让我们工具调用成功率从62%升到99.1%。另一个致命细节是工具描述的编写。很多项目把工具说明写成“查询客户信息”LLM根本不知道该传什么参数。必须写成“查询客户详细信息。输入参数customer_id必填正整数对应CRM系统唯一标识返回字段name字符串、status枚举值active/inactive/pending、last_order_dateISO格式日期字符串”。我们甚至给每个工具配了示例调用就像教新人一样“正确示例{customer_id: 12345}错误示例{id: ABC-123}”。最后是超时熔断所有外部API调用必须设timeout3s超过则返回{error: timeout, suggestion: 请稍后重试或联系管理员}。否则LLM会傻等10秒用户界面直接卡死。3.3 向量库选型不是比快而是比“稳”和“省”Milvus、Chroma、Weaviate、Qdrant——选哪个我的经验是中小团队直接选Qdrant大厂自研前先用Milvus。Qdrant胜在“开箱即用”的稳定性它用Rust写的存储引擎内存泄漏概率极低HTTP API设计极其克制就/collections/{name}/points一个入口不像Milvus有二十多个endpoint容易配错而且它原生支持payload过滤比如filter: {source: manual_sop}不用额外建索引。我们线上服务用Qdrant跑了11个月零宕机。Milvus的优势在于海量数据下的性能——当向量库突破5000万条Qdrant的查询延迟会明显上升而Milvus的分布式架构能线性扩展。但它有个隐藏坑默认配置下Milvus会把所有向量加载进GPU显存而你的A10显存只有24GB实际只能存200万条向量。必须手动关掉enable_gpu或者用--gpu_memory_limit参数限制。Weaviate的问题是文档太“学术”比如它强调“语义相似度”但没告诉你“语义”在中文场景下有多脆弱——用它默认的text2vec-transformers模型把“苹果手机”和“iPhone”向量化余弦相似度只有0.42远低于预期。最后是Chroma它轻量到可以用SQLite当后端适合本地开发但生产环境千万别用——它的并发写入锁机制在高负载下会引发大量timeout。我们曾用Chroma做AB测试当QPS超过50写入成功率暴跌至30%。所以选型口诀是开发期用Chroma快速验证上线用Qdrant保稳定数据量超千万再迁Milvus。3.4 LLM选型本地部署不是情怀而是可控性的刚需Ollama、LM Studio、Text Generation WebUI——这些工具火爆是因为它们解决了同一个痛点不让LLM成为黑盒里的幽灵。云API看似省事但当你发现用户投诉“为什么回复里总带广告”查日志发现是云厂商在prompt里悄悄加了营销话术你连改的机会都没有。本地部署的核心价值是全链路可观测。比如用Ollama跑Phi-3模型你可以用ollama serve --verbose开启详细日志看到每一token的生成概率、attention权重分布。当发现模型对“价格”这个词过度敏感生成回复时总带报价单就能去分析attention map定位到第12层decoder的特定head然后用LoRA微调压制它。LM Studio的优势在于可视化调试拖拽上传PDF实时看分块效果、embedding向量分布、检索top-k结果甚至能滑动调节temperature观察输出变化。我们用它快速验证了不同分块策略对召回率的影响三天就确定了最优方案。Text Generation WebUI则胜在插件生态——它的llama.cpp后端支持4-bit量化让7B模型能在16GB内存笔记本上跑起来。但要注意量化会损失精度我们测试发现4-bit Phi-3在数学题上准确率比原版低11%但在客服对话场景几乎无感。所以选型逻辑很清晰需要深度调试选LM Studio追求极致轻量选Ollama要兼容老硬件选Text Generation WebUI。别信“越大越好”我们线上用的Qwen2-1.5B配合RAG后客服问题解决率比7B模型高3.2%因为小模型更专注不会在无关细节上“自由发挥”。4. 实操过程详解从零搭建一个生产级RAGAgent系统4.1 环境准备用Docker隔离所有不确定性第一步不是写代码而是用Docker封住所有变量。我们的docker-compose.yml只暴露三个端口3000前端、8000FastAPI后端、6333Qdrant。关键配置如下services: qdrant: image: qdrant/qdrant:v1.9.0 volumes: - ./qdrant_data:/qdrant/storage environment: - QDRANT__TELEMETRYfalse # 关闭遥测避免隐私泄露 ports: - 6333:6333 backend: build: . volumes: - ./data:/app/data # 所有文档放这里 - ./models:/app/models # 本地模型放这里 environment: - OLLAMA_HOSThttp://ollama:11434 - QDRANT_URLhttp://qdrant:6333 depends_on: - qdrant - ollama ollama: image: ollama/ollama:0.1.42 volumes: - ./ollama_models:/root/.ollama/models ports: - 11434:11434特别注意OLLAMA_HOST环境变量——它告诉backend服务Ollama在Docker网络里叫ollama而不是localhost。很多新手在这里卡住因为本地跑通了容器里就报连接拒绝。另外./ollama_models目录必须提前创建并赋予权限sudo chown -R 1001:1001 ./ollama_models否则Ollama容器启动失败。这套环境的好处是开发、测试、生产用同一套compose文件只需改environment里的API密钥和数据库地址彻底消灭“在我机器上是好的”这类问题。4.2 文档预处理用Python脚本把混乱变成结构化资产核心脚本ingest.py要做三件事清洗、分块、向量化。清洗阶段重点处理PDF乱码——用pdfplumber替代PyPDF2因为它能精确提取字符坐标对齐扫描件里的文字。分块阶段用混合策略from langchain_text_splitters import MarkdownHeaderTextSplitter # 先按大结构分如技术文档的章节 header_splitter MarkdownHeaderTextSplitter( headers_to_split_on[(#, chapter), (##, section)] ) # 再对每个大块做小分块 from langchain_text_splitters import RecursiveCharacterTextSplitter small_splitter RecursiveCharacterTextSplitter( chunk_size256, chunk_overlap64, separators[\n\n, \n, 。, , , , , ] # 中文标点优先 )向量化阶段不用HuggingFace默认模型而是用BAAI/bge-m3因为它支持多向量融合densesparsemulti-vector对中文检索更准。关键参数from FlagEmbedding import BGEM3FlagModel model BGEM3FlagModel(BAAI/bge-m3, use_fp16True) # fp16加速 # 生成dense向量时用normalizeTrue保证余弦相似度计算准确 dense_vecs model.encode_dense(texts, normalizeTrue)最后把向量、原始文本、metadata来源文件名、页码、章节名一起存入Qdrantfrom qdrant_client import QdrantClient client QdrantClient(urlhttp://qdrant:6333) client.upsert( collection_namedocs, points[ { id: i, vector: dense_vecs[i].tolist(), payload: { text: texts[i], source: metadata[i][source], page: metadata[i][page], chapter: metadata[i][chapter] } } for i in range(len(texts)) ] )这个脚本跑完你就有了一个带业务元数据的向量库后续检索可以直接filter筛选。4.3 RAG链构建用LangChain写一个“不撒谎”的问答系统核心是RetrievalQA链的改造。标准写法会出问题所以我们要加三层防护from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate # 第一层Prompt工程——强制输出JSON template 你是一个严谨的问答助手。请根据以下检索到的资料回答问题只输出JSON格式不要任何解释。 资料 {context} 问题{question} 输出格式 {{ answer: string, 直接回答问题若资料中无答案则写未找到相关信息, confidence: float, 0.0-1.0, 对答案准确性的自我评估, sources: [string, 引用的资料来源如用户手册P12] }} QA_CHAIN_PROMPT PromptTemplate.from_template(template) # 第二层检索器增强——加filter和score阈值 from langchain_qdrant import QdrantVectorStore vectorstore QdrantVectorStore( clientclient, collection_namedocs, embeddingmodel # 复用BGE-M3模型 ) retriever vectorstore.as_retriever( search_kwargs{ filter: {source: {$in: [manual_sop, faq]}}, # 只查可信源 score_threshold: 0.3 # 低于0.3的检索结果直接丢弃 } ) # 第三层后处理——校验JSON并处理低置信度 def safe_invoke(query): result qa_chain.invoke({query: query}) try: import json parsed json.loads(result[result]) if parsed[confidence] 0.5: return {answer: 这个问题需要人工确认请联系技术支持, sources: []} return parsed except json.JSONDecodeError: return {answer: 系统暂时无法理解您的问题, sources: []}这个链的特点是把LLM当作JSON生成器而不是自由文本生成器。所有业务逻辑置信度判断、来源标注都由Python控制LLM只负责最擅长的事把检索结果压缩成结构化输出。我们上线后用户投诉“答非所问”的比例下降了89%。4.4 Agent编排用LangChain实现“有记忆、懂边界”的智能体Agent不是让LLM胡乱调用工具而是给它一张带安全围栏的行动地图。我们用create_tool_calling_agent构建但关键在工具定义from langchain_core.tools import tool from pydantic import BaseModel, Field class CRMQueryInput(BaseModel): customer_id: int Field(descriptionCRM系统客户唯一ID正整数) tool(args_schemaCRMQueryInput) def get_customer_info(customer_id: int) - dict: 查询客户详细信息。输入必须是正整数ID。 # 这里调用真实CRM API return {name: 张三, status: active, last_order_date: 2024-05-20} # Agent提示词里明确写死边界 system_prompt 你是一个客户服务Agent只能使用以下工具 1. get_customer_info查客户信息仅支持正整数customer_id 2. send_email发邮件仅支持公司邮箱域名ourcompany.com 禁止行为 - 不得猜测客户ID必须由用户明确提供 - 不得向非公司邮箱发送邮件 - 当工具调用失败时直接返回错误信息不要重试Agent初始化时把system_prompt和tools传进去from langchain.agents import create_tool_calling_agent agent create_tool_calling_agent( llmllm, tools[get_customer_info, send_email], prompthub.pull(hwchase17/openai-tools-agent) # 用官方prompt模板 ) agent_executor AgentExecutor(agentagent, tools[get_customer_info, send_email], verboseTrue)最关键的是verboseTrue——它让Agent把每一步思考、工具调用、LLM反思都打印出来。上线前我们用1000条历史对话做回归测试专门检查日志里有没有违反“禁止行为”的记录。这个设计让Agent从“不可控的黑盒”变成了“可审计的白盒”。5. 常见问题与排查技巧实录那些文档里不会写的血泪教训5.1 RAG召回率低先查分块再查embedding最后查LLM用户反馈“搜不到东西”第一反应不是换模型而是按顺序排查分块验证用ingest.py脚本单独跑一个文档检查输出的chunks是否合理。重点看技术文档的API参数是否被切散法律条款是否跨块如果发现问题立刻改分块逻辑别碰其他地方。embedding质量检测取两个明显相关的句子如“红烧肉做法”和“五花肉炖煮步骤”用BGE-M3分别向量化算余弦相似度。正常应在0.7以上。如果只有0.3说明模型没加载对或者文本预处理如去停用词破坏了语义。LLM幻觉排查把RAG返回的top-3 chunks和原始query一起喂给LLM让它只输出“是否能回答”。如果LLM说“能”但最终答案错误说明是LLM在瞎编——这时要收紧prompt加“若context中无直接答案必须写‘未找到’”。提示我们做了个快速检测脚本check_rag.py输入query和预期答案自动跑三步并输出报告。上线前每天跑100次把召回率从82%逐步优化到96%。5.2 Agent工具调用失败90%的问题在输入校验最常见的错误是LLM生成的JSON字段名拼错custmer_id少个e或类型错误customer_id: 123字符串。解决方案不是让LLM重试而是在工具函数里加try-except捕获所有异常返回结构化错误在Agent executor里加handle_parsing_errorsTrue自动处理JSON解析失败日志里专门记录tool_input和tool_output用ELK做聚合分析找出高频错误模式注意我们发现73%的工具失败源于customer_id为空字符串。于是加了一行校验if not customer_id or not str(customer_id).strip(): raise ValueError(customer_id不能为空)问题直接消失。5.3 向量库查询慢不是硬件问题而是索引没建对Qdrant查询慢别急着加CPU先检查三件事collection是否建了索引client.get_collection(docs)看vectors_count和indexed_vectors_count是否相等。不等说明索引没建完。filter条件是否用了索引字段Qdrant对payload字段的filter只有加了field_index才快。在创建collection时必须指定client.create_collection( collection_namedocs, vectors_configVectorParams(size1024, distanceDistance.COSINE), payload_indexingTrue, # 关键为常用filter字段建索引 field_indexing{source: True, chapter: True} )search_params是否合理search_params{hnsw_ef: 128}这个值越大越准但越慢。我们线上设为64平衡速度和精度。5.4 LLM响应卡顿内存泄漏的隐形杀手Ollama跑久了变慢大概率是内存泄漏。不是模型问题而是检查ollama list看有没有残留的模型没卸载用docker stats ollama看内存占用是否持续上涨解决方案在docker-compose.yml里加restart: unless-stopped并写个cron job每天凌晨重启Ollama容器实操心得我们给Ollama容器加了mem_limit: 8g限制一旦超限自动重启比等它卡死强十倍。5.5 生产环境监控必须盯住的五个黄金指标没有监控的LLM系统等于裸奔。我们用PrometheusGrafana盯住指标正常范围异常含义应对措施rag_retriever_latency_seconds0.5s检索慢检查Qdrant索引、网络延迟llm_generation_time_seconds3s生成慢检查模型负载、GPU显存context_truncation_ratio10%上下文被截断调大chunk_size或减少检索top-kagent_tool_failure_rate1%工具调用失败检查API可用性、输入校验qa_chain_confidence_avg0.7答案置信度低优化RAG分块、增加高质量文档每个指标都配了告警context_truncation_ratio 15%持续5分钟自动发钉钉消息给值班工程师。这套监控让我们把平均故障恢复时间MTTR从47分钟压到8分钟。6. 经验总结关于LLM应用落地的三个反常识认知我在六个项目里反复验证过这三个认知能帮你避开80%的坑 第一LLM不是越大会越好而是越“专”越稳。我们曾把客服系统从Qwen2-1.5B升级到Qwen2-7B结果错误率反而上升2.3%。因为大模型参数更多对prompt微小变化更敏感而我们的prompt工程没跟上。后来用LoRA微调1.5B模型专注训练“客服话术风格”错误率降到0.8%。结论小模型高质量微调比大模型通用prompt更可靠。 第二RAG的瓶颈从来不在向量检索而在文档预处理。90%的召回问题根源是PDF解析错误、分块策略不当、metadata缺失。我们花在ingest.py上的时间是写LLM调用代码的三倍。建议把文档预处理做成独立服务加人工审核环节——让运营同事每周抽检10份文档的分块效果比靠算法调参管用。 第三Agent的智能程度取决于工具的设计而不是LLM的能力。一个设计良好的工具应该像乐高积木输入明确、输出结构化、失败可预测。我们把CRM查询工具拆成三个独立工具查基本信息/查订单历史/查售后记录而不是一个万能get_customer_all()结果Agent调用准确率从71%升到94%。因为LLM更容易理解“查订单”这个单一意图而不是“查所有”。最后分享个小技巧每次上线新功能先用curl命令手动测试核心链路而不是等前端联调。比如测RAG就curl -X POST http://localhost:8000/qa -d {query:如何重置密码}看返回JSON是否符合预期。这招帮我们拦截了73%的集成问题比等测试同学报bug快得多。毕竟LLM应用的世界里最可靠的不是模型而是你亲手敲下的每一行curl命令。
返回列表