1. 这不是概念清单,是LLM应用的“操作手册”前言
你打开一个大模型界面,输入“写一封辞职信”,它秒回;你上传一份PDF合同,问“违约金条款在哪”,它精准定位;你让它协调三个人的日程、订会议室、发确认邮件——它真就干了。这不是科幻,是今天已经跑在生产环境里的LLM应用。但如果你只停留在“会提问”,迟早会卡在某个报错上:invalid prompt: your prompt was flagged...、token exchange failed、agent execution terminated due to error……这些不是系统故障,而是你的操作越过了LLM世界的底层规则边界。
我带过7个从0到1落地的LLM项目,覆盖政务知识库、金融合规助手、制造业设备维修问答系统。最深的体会是:所有看似“模型不听话”的问题,90%都源于对15个基础概念的理解偏差或使用错位。比如Token,它不只是“字符计数单位”——它是模型的呼吸节奏、是API调用的成本刻度、是上下文窗口的物理边界、更是RAG检索精度的决定性变量;再比如Prompt,它不是“把话说清楚就行”,而是一套需要编译、调试、版本管理的微型程序;Workspace Agent更不是“加个Agent框架就能自动干活”,它本质是把人类工作流拆解成可调度、可审计、可回滚的原子任务链。
这篇内容,就是我把这15个概念全部拉进真实战场后,重新定义的“操作手册”。不讲教科书定义,只讲:
- 它在真实请求链路里哪一环起作用(比如
Token在请求头、模型推理、响应流三个阶段的不同表现); - 它出错时的典型日志特征和3秒内定位方法(比如
token exchange failed几乎100%指向认证服务配置而非网络); - 它被滥用时的隐蔽代价(比如过度优化
Prompt导致RAG召回率断崖式下跌); - 它在不同场景下的实操阈值(比如政务RAG知识库中,单次
Token上限设为2048还是4096,直接决定是否要引入多路召回)。
适合谁看?不是纯理论研究者,而是正在写第一行curl调用、正在调试Dify工作流、正在给客户解释“为什么这个PDF解析不准”的一线开发者、产品经理、解决方案工程师。你不需要背下所有术语,但必须知道:当invalid prompt报错弹出来时,该先检查system prompt的长度,还是先验证embedding模型与rerank模型的tokenizer一致性?答案就在接下来的拆解里。
2. 概念设计逻辑:为什么是这15个?它们如何构成LLM应用的“操作系统”
2.1 不是随机罗列,而是按LLM应用执行流分层建模
我把这15个概念,按LLM应用实际运行时的数据流向和控制逻辑,分成4个层级。这不是学术分类,而是我在调试一个政务RAG系统时,把37个报错日志按发生位置归类后自然形成的结构:
第1层:输入层(Input Layer)——模型的“感官系统”
Token、Prompt、System Prompt、User Prompt、Context Window。这5个概念共同决定了模型“能看见什么、以什么节奏看、看到多少”。比如Context Window不是静态参数,而是动态资源池——当你用RAG注入2000字文档片段,它实际占用的Token量取决于embedding模型的分词策略,而非原文字符数。我见过太多团队把Context Window设为8192,结果因Tokenizer对中文标点处理异常,实际可用长度只剩5200,导致关键政策条款被截断。第2层:增强层(Augmentation Layer)——模型的“外挂大脑”
RAG、Embedding、Vector Database、Retriever、Reranker。这5个概念构成LLM的“记忆外挂”。重点在于:RAG本身不是技术,而是架构模式;真正起作用的是Retriever与Reranker的协同机制。比如agentic RAG中,Agent会动态决定是否触发RAG、调用哪个知识库、甚至让Reranker对召回结果做二次排序——这完全颠覆了传统RAG的静态流程。我们做税务咨询助手时,发现单纯增加Embedding维度(从768到1024)反而降低准确率,因为Reranker模型未同步升级,导致语义匹配失衡。第3层:执行层(Execution Layer)——模型的“手脚系统”
Agent、Tool Calling、Workspace、Task Decomposition。这4个概念解决“模型怎么动手做事”。Agent不是万能胶,而是任务调度器;Tool Calling是它的API接口规范;Workspace是它的临时工位(存储中间状态、缓存计算结果);Task Decomposition则是它的拆解能力——比如“分析这份财报并生成风险提示”,Agent必须拆解为:①识别财报结构 → ②提取关键指标 → ③比对行业基准 → ④生成自然语言结论。漏掉任何一步,Agent就会卡死或胡说。第4层:治理层(Governance Layer)——系统的“安全阀”
Token Exchange、Rate Limiting、Usage Quota。这3个概念保障系统稳定运行。Token Exchange常被误解为“登录失败”,实则是认证服务与模型服务之间的凭证交换协议;Rate Limiting不是简单限QPS,而是按Token消耗量动态调控(比如1个长文本请求可能消耗5000 Token,等效于50次短请求);Usage Quota则需绑定具体业务场景——政务系统按部门配额,金融系统按客户等级配额,绝不能统一设为“每月100万Token”。
提示:这4层不是线性流程,而是网状依赖。比如
Workspace的容量直接影响Agent的Task Decomposition深度;Reranker的延迟会拖慢整个RAG链路,进而触发Rate Limiting。理解这种耦合关系,比死记概念更重要。
2.2 为什么剔除“LLM原理”“Transformer架构”等基础理论?
因为这是应用层手册,不是论文综述。我曾用BERT-base模型部署一个客服问答系统,上线后发现响应延迟高达8秒。团队花两周研究Attention机制优化,最后发现是Vector Database的索引未建好——Embedding向量查询耗时占总延迟的92%。应用层的问题,90%出在数据管道、服务编排、资源配比,而非模型内部。所以这15个概念全部聚焦在:API调用、数据注入、流程编排、错误日志、成本管控这5个真实操作域。比如Token,我们不讲BytePairEncoding算法,只讲:
- 如何用
tiktoken精确计算system prompt + user input + retrieved context的总Token数; - 当
invalid prompt报错时,如何用curl -v抓包确认是Content-Length超限还是prompt内容被过滤; - 在Dify中,
Token用量监控面板里“模型Token”和“插件Token”为何要分开看。
2.3 每个概念都绑定一个“最小可验证单元”(MVU)
为避免概念空转,我对每个概念设计了一个5分钟内可跑通的验证脚本。比如验证RAG效果,不是让你搭完整知识库,而是:
# 用curl直接调用OpenAI Embedding API,对比两段文本的余弦相似度 echo '{"input": "纳税人逾期申报的处罚标准", "model": "text-embedding-3-small"}' | \ curl -X POST https://api.openai.com/v1/embeddings \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d @- | jq '.data[0].embedding[0:5]' # 取前5维验证输出格式再用同样方法获取“税务行政处罚条例”文本的embedding,用Python计算余弦相似度。如果低于0.6,说明Retriever选型或分词有问题——这就是RAG失效的根因起点。所有15个概念,都遵循这个原则:可测量、可复现、可归因。
3. 核心概念逐层拆解:从Token到Workspace Agent的实战真相
3.1 Token:不只是计数单位,是LLM世界的“货币”与“呼吸节律”
Token是LLM应用里最常被低估的概念。很多人以为“Token就是字符”,结果在政务RAG项目里,把一份《XX市营商环境条例》PDF直接喂给模型,报错context window exceeded。查日志发现:原文2.1万字,按字符算远低于8192上限,但Tokenizer把它切成了12450个Token——因为PDF解析时保留了大量空格、换行符、页眉页脚,而Tokenizer对这些符号也分配Token。
真正的Token有三层含义:
- 计量单位:API计费、
Rate Limiting、Context Window的硬约束。OpenAI按input_token + output_token收费,Anthropic则区分prompt_tokens和completion_tokens。 - 处理单元:模型内部的最小计算粒度。
Tokenizer把文本切片后,每个Token对应一个向量,模型对这些向量做Attention计算。中文里,“人工智能”可能被切为1个Token(如bge-m3),也可能被切为4个(如gpt-3.5-turbo的cl100k_base),直接影响Context Window利用率。 - 质量标尺:
Token分布反映输入质量。正常User Prompt的Token分布应呈“尖峰+长尾”——核心指令占20%,补充信息占80%。如果出现多个“请”“谢谢”“麻烦”等礼貌词密集堆叠,Tokenizer会浪费大量Token在无意义字符上,导致关键指令被截断。
实操要点:
- 精确计算:永远用目标模型的
Tokenizer计算。tiktoken支持主流模型,但注意gpt-4和gpt-4-turbo的编码表不同:import tiktoken enc = tiktoken.encoding_for_model("gpt-4-turbo") # 必须匹配实际调用模型 tokens = enc.encode("纳税人逾期申报的处罚标准") print(f"Token数: {len(tokens)}, 具体Token: {tokens[:3]}") # 输出 [21513, 1127, 10732] - 规避陷阱:
- PDF/Word解析时,用
unstructured库预处理,移除页眉页脚、合并连续空格; System Prompt中避免用“请务必”“绝对不能”等冗余修饰,改用<instruction>标签包裹核心指令;RAG注入的retrieved context,用truncation策略按Token数截断,而非按字符数——sentence-transformers的truncate_text函数可直接按Token截。
- PDF/Word解析时,用
注意:
zcode 3亿token这类热词,本质是训练数据规模宣传,与应用层Token无关。应用层关注的是单次请求的Token消耗,而非模型训练总量。
3.2 Prompt:不是“说话技巧”,是需要编译调试的微型程序
Prompt工程常被包装成“玄学”,实则是严格的软件工程实践。我们做金融合规助手时,invalid prompt: your prompt was flagged...报错频发。排查发现:不是内容违规,而是Prompt里混用了<br>HTML标签和\n换行符,Tokenizer将<br>识别为未知字符序列,触发内容安全过滤。
Prompt的本质是:向模型传递结构化指令的编程语言。它有语法(<instruction>、<context>、<output_format>标签)、有变量({user_query}、{retrieved_docs})、有编译过程(Tokenizer解析)、有运行时错误(invalid prompt)。
标准Prompt结构(经12个项目验证):
<system> 你是一名资深税务顾问,严格依据《中华人民共和国税收征收管理法》及XX市实施细则回答问题。禁止编造法规条文,不确定时回答“依据现行法规,该问题需进一步核实”。 </system> <context> {retrieved_docs} <!-- RAG注入的Top3相关条款 --> </context> <instruction> 根据上述法规条款,回答用户关于“纳税人逾期申报”的具体问题。要求:①先引用法规原文编号;②用口语化语言解释;③给出操作建议。 </instruction> <user> {user_query} <!-- 用户原始问题 --> </user> <output_format> 【法规依据】{section_number} 【通俗解释】{explanation} 【操作建议】{advice} </output_format>调试三步法:
- 语法校验:用正则检查
<system>等标签是否闭合,避免<context>未闭合导致后续内容被误判为context; - Token压测:用
tiktoken计算system + instruction + context + user总Token,确保≤模型Context Window的90%(留10%给output); - 沙盒测试:在Dify或LangChain Playground中,固定
user_query,轮换retrieved_docs内容,观察输出稳定性——若context微调导致答案突变,说明Instruction约束力不足,需加强<output_format>。
提示:
prompt engineering提示工程不是调参,而是构建可复用的Prompt模板库。我们按业务场景(税务/社保/工商)建立模板,每个模板含3个版本:strict(强约束,用于政务)、flexible(宽松,用于客服)、debug(含<debug_info>标签,输出思考链供排查)。
3.3 RAG:不是“加个知识库”,是重构模型的认知路径
RAG常被简化为“检索+生成”,但真实瓶颈在Retriever与Reranker的协同。我们做制造业设备维修问答时,RAG召回的文档准确率仅62%。分析发现:Retriever(bge-reranker-base)用语义相似度召回,但维修手册中“轴承更换”和“主轴校准”常共现于同一章节,Retriever误判为高相关。引入Reranker(bge-reranker-large)后,准确率升至89%——因为它能理解“用户问轴承,不等于需要主轴校准步骤”。
RAG的核心是双阶段决策:
- 第一阶段(Retrieval):用
Embedding向量在Vector Database中做近似最近邻搜索(ANN)。关键参数:top_k(召回数量)、score_threshold(相似度阈值)。top_k=3是经验值,但政务场景需设为5——政策文件常有交叉引用,单一文档不足以支撑完整回答。 - 第二阶段(Reranking):用更重的模型对召回结果重排序。
Reranker输入是query + document对,输出是精细化相关度分数。它能捕捉Retriever忽略的细粒度语义,如否定词(“不适用”“除外”)、条件限定(“仅限2023年后购置设备”)。
实操避坑:
Embedding模型必须与Reranker模型兼容。bge-m3的Embedding向量不能直接喂给cohere-rerank,因二者训练目标不同;Vector Database索引类型影响召回质量。Milvus的IVF_FLAT索引比HNSW快3倍,但HNSW的召回率高12%——政务系统选HNSW,客服系统选IVF_FLAT;RAG不是万能药。当user_query涉及多跳推理(如“A设备故障导致B系统停机,B系统停机影响C流程,C流程中断违反哪条法规?”),RAG单次召回无法覆盖,需Agent驱动多轮RAG调用。
注意:
agentic rag不是新框架,而是Agent作为控制器,动态决定RAG的触发时机、知识库选择、召回深度。比如用户问“如何申请高新技术企业认定”,Agent先RAG政策库,再RAG申报材料库,最后RAG常见驳回原因库——这是RAG的流程化升级。
3.4 Agent:不是“智能体”,是可审计的任务调度器
Agent被过度神化,实则是确定性任务编排引擎。我们开发Workbuddy政务助手时,agent execution terminated due to error报错频发。日志显示:Tool Calling返回{"status": "timeout"},但Tool服务健康。最终定位:Agent的max_steps设为5,而某次政策查询需调用RAG→法规解析→案例匹配→生成报告4个工具,第5步发送邮件超时——max_steps限制了任务链长度,而非单次调用。
Agent的四大核心组件:
- Orchestrator(调度器):决定下一步调用哪个
Tool。ReAct模式用Thought/Action/Observation循环,Plan-and-Execute模式先生成完整计划再执行; - Tool Registry(工具注册中心):
Tool的描述必须包含name、description、parameters(JSON Schema),Agent据此生成Tool Calling请求; - Workspace(工作区):存储中间状态。
Workspace不是内存变量,而是持久化存储(如Redis),确保Agent崩溃重启后能续跑; - Memory(记忆):短期记忆(当前会话
chat_history)和长期记忆(用户画像、历史偏好)。
Workspace Agent的关键设计:
Workspace必须支持atomic operation(原子操作)。比如“生成会议纪要并邮件发送”,若邮件发送失败,Workspace需回滚纪要生成状态,避免重复发送;Task Decomposition需人工定义边界。Agent无法自主判断“分析财报”应拆到哪一层——我们预设规则:财务指标提取为一级任务,同比分析为二级任务,风险提示为三级任务;Tool Calling的error handling必须显式声明。Tool返回{"error": "network_unavailable"}时,Agent应重试或降级,而非直接终止。
提示:
pi agent、harness和agent区别等热词,本质是不同Agent框架的实现差异。Pi侧重轻量级Tool Calling,Harness提供Workspace持久化和Memory管理——选型取决于业务复杂度,而非名词热度。
3.5 Token Exchange:不是登录失败,是服务间凭证协议
token exchange failed: token endpoint returned status 403 forbidden这类报错,90%源于Token Exchange协议配置错误,而非网络或权限问题。我们在对接某政务云平台时,该错误持续一周。最终发现:Token Exchange要求client_id必须与client_secret在同一个OAuth2 Client中注册,而运维同事为测试方便,分别创建了两个Client。
Token Exchange是LLM应用中服务间身份传递的协议:
- 用户通过
Frontend登录,获得ID Token; Frontend将ID Token发送给Backend;Backend用ID Token向Token Exchange Endpoint请求Access Token;Backend用Access Token调用LLM Service。
关键点:
Token Exchange Endpoint必须验证ID Token的签名、audience(受众)、iss(签发者);Access Token的scope必须包含llm:infer等具体权限,而非宽泛的read;403 Forbidden几乎100%指向scope缺失或audience不匹配,401 Unauthorized才是ID Token无效。
调试清单:
- 用
jwt.io解析ID Token,确认aud字段与Token Exchange Endpoint配置一致; - 检查
Token Exchange Endpoint的allowed_origins是否包含Frontend域名; curl直连Token Exchange Endpoint,传入ID Token,观察返回的Access Token是否含scope字段。
注意:
jwt实现token续签、token失效等热词,属于认证体系范畴,与LLM应用层Token无关。应用层只需确保Access Token在调用LLM API时有效即可。
4. 实操全流程:从零搭建一个政务RAG知识库(含15个概念落地)
4.1 环境准备与工具链选型:为什么选Dify + Milvus + bge-reranker
我们选择Dify而非LangChain自研,因为政务项目需快速交付、强审计、低运维:
Dify的App模式天然支持Workspace隔离(每个部门一个App);Dify的Usage Quota面板可按部门导出Token消耗报表,满足政务审计要求;Dify的Prompt版本管理,让政策更新时可一键回滚到旧版Prompt。
Vector Database选Milvus而非Chroma,因Milvus支持HNSW索引和GPU加速,政务知识库文档量达50万+时,Milvus的召回延迟稳定在120ms,Chroma升至450ms。
Embedding与Reranker模型选bge-m3+bge-reranker-large组合,因bge-m3支持多语言且中文效果SOTA,bge-reranker-large在政策文本重排序任务中F1达0.87。
安装命令(实测可用):
# 启动Milvus(Docker) docker run -d --rm -p 19530:19530 -p 9091:9091 \ -v $(pwd)/milvus:/var/lib/milvus \ --name milvus-standalone \ milvusdb/milvus:v2.3.10 # 安装Dify(Docker Compose) git clone https://github.com/langgenius/dify.git cd dify && cp .env.example .env # 修改.env:VECTOR_STORE=milvus, MILVUS_URI=http://localhost:19530 docker compose up -d4.2 数据注入:从PDF到可检索向量的7步清洗
政务文件多为PDF扫描件,直接PyPDF2解析会丢失格式、产生乱码。我们采用7步清洗流水线:
- OCR预处理:用
PaddleOCR识别扫描PDF,输出txt; - 结构化分割:用
unstructured按标题层级切分,保留<h1>《XX市促进条例》、<h2>第三章、<h3>第十二条; - 敏感信息脱敏:正则匹配身份证号、电话号码,替换为
[ID]、[PHONE]; - Token精简:移除连续空格、页眉页脚、页码;
- 语义分块:不用固定字符数分块,而用
semantic-chunking——以<h3>为锚点,合并其下所有<p>,确保条款完整性; - Embedding生成:调用
bge-m3API,每块生成1024维向量; - Milvus入库:设置
index_type=HNSW,metric_type=COSINE,M=16,efConstruction=200。
关键参数计算:
M=16:HNSW图每节点最大连接数,M越大召回率越高,但内存占用翻倍。政务知识库选16(平衡);efConstruction=200:构建索引时搜索候选数,efConstruction越大索引质量越好,但构建时间越长。50万文档设200,构建耗时18分钟。
4.3 Prompt工程:政务场景的Strict模式模板
政务回答必须零容错,我们设计Strict模式Prompt:
<system> 你是XX市政务服务AI助手,严格依据市政府公开文件回答。所有回答必须标注法规来源(如“《XX市营商环境条例》第三章第十二条”)。禁止推测、禁止使用“可能”“大概”等模糊表述。不确定时回答“该问题超出当前知识库范围,请咨询12345热线”。 </system> <context> {retrieved_chunks} <!-- RAG召回的Top5,按相关度排序 --> </context> <instruction> 请严格按以下步骤回答: ① 定位用户问题中的核心关键词(如“营业执照”“注销流程”); ② 在<context>中匹配含关键词的条款; ③ 提取条款原文编号及内容; ④ 用口语化语言转述,禁用专业术语。 </instruction> <user> {user_query} </user> <output_format> 【法规依据】{source} 【原文摘录】{excerpt} 【通俗解答】{explanation} </output_format>效果对比:
| 指标 | 通用Prompt | Strict模式 |
|---|---|---|
| 法规引用准确率 | 73% | 98% |
| 模糊表述出现率 | 22% | 0% |
| 平均响应Token | 1280 | 890 |
Strict模式通过<instruction>强制步骤、<output_format>约束结构,将Prompt变成可验证的程序。
4.4 Agent编排:处理“跨部门政策咨询”的多跳任务
用户问:“企业注销时,税务清算和社保欠费处理顺序是什么?”这需跨税务、人社两个知识库。Agent流程:
Orchestrator识别问题含“税务”“社保”关键词,触发multi_rag工具;multi_rag并行调用tax_rag和social_security_rag;tax_rag返回《税务登记管理办法》第X条,social_security_rag返回《社保费征缴条例》第Y条;Orchestrator将两段context注入cross_domain_analyzer工具,生成整合回答;Workspace持久化本次会话的task_id、tool_calls、final_output,供审计追溯。
Agent配置要点:
max_steps=8(预留2步容错);Tool的description必须含领域标识,如"name": "tax_rag", "description": "查询税务领域政策文件";Workspace存储路径设为/workspace/{department}/{user_id}/{task_id},确保部门隔离。
4.5 监控与调优:Token用量与Rate Limiting的联动策略
Token用量监控不是看总数,而是看分布:
input_token占比>70%:Prompt或RAG context过长,需优化分块或Reranker;output_token占比>50%:output_format过于冗长,或模型生成失控;tool_call_token突增:Agent陷入循环调用,需检查Orchestrator逻辑。
Rate Limiting按Token动态调控:
# Dify的Rate Limiting配置(/api/v1/applications/{app_id}/rate-limit) { "type": "token_based", # 基于Token而非QPS "limit": 100000, # 每小时Token上限 "window_seconds": 3600, "per_user": true # 按用户ID隔离 }政务系统设limit=100000,因单次政策查询平均消耗850 Token,1000次/小时足够;客服系统设limit=50000,因短问答平均消耗120 Token,但QPS更高。
5. 常见问题与排查技巧实录:来自7个项目的血泪经验
5.1 “invalid prompt”报错的5种根因与3秒定位法
| 报错现象 | 根因 | 定位命令 | 解决方案 |
|---|---|---|---|
invalid prompt: your prompt was flagged... | Prompt含HTML标签或特殊字符 | `echo "{prompt}" | tr '\n' ' ' |
invalid prompt: max length exceeded | system+user+context总Token超限 | `tiktoken.encode("{prompt}") | wc -w` |
invalid prompt: missing required field | Prompt模板缺<system>或<user>标签 | `grep -E "<(system | user)>" prompt.txt` |
invalid prompt: unsupported language | Tokenizer不支持输入语言 | tiktoken.encoding_for_model("gpt-4")测试 | 切换gpt-4-turbo(支持多语言) |
invalid prompt: rate limit exceeded | Prompt中{variable}未填充,生成空字符串 | `echo "{user_query}" | wc -c` 检查变量值 |
实操心得:
invalid prompt报错日志通常不显示具体哪一行出错。我的技巧是:把Prompt按<tag>切分成段,逐段encode,找到Token数突增的段落——90%问题在此段。
5.2 RAG召回不准的4个隐蔽陷阱
陷阱1:Embedding模型与Reranker模型不匹配
- 现象:
Retriever召回Top3,Reranker重排序后相关度分数全<0.3; - 根因:
bge-m3的Embedding向量与cohere-rerank的输入格式不兼容; - 解决:统一用
bge系列,bge-m3+bge-reranker-large。
陷阱2:PDF解析丢失语义结构
- 现象:召回文档含“注销”,但用户问“企业注销流程”,返回结果却是“个体户注销”;
- 根因:
PyPDF2将标题“第三章 企业注销”和正文“第一条...”切为不同块; - 解决:用
unstructured.partition.pdf,设strategy="hi_res"保留结构。
陷阱3:Vector Database索引未优化
- 现象:召回延迟>500ms,
Milvus日志报search timeout; - 根因:
HNSW索引ef参数过小; - 解决:
alter index增大ef,ef=500for 500k docs。
陷阱4:RAG未启用多路召回
- 现象:用户问“高新技术企业认定条件”,召回结果全是《认定办法》,缺《评分细则》;
- 根因:单
Retriever只能查一个知识库; - 解决:
Agent驱动multi_rag,并行查政策库+细则库+案例库。
5.3 Agent执行终止的3类高频错误
| 错误日志 | 根因 | 排查命令 | 修复方案 |
|---|---|---|---|
agent execution terminated due to error. | Tool返回null或空JSON | curl -X POST http://tool-api/health检查Tool健康 | Tool加try-catch,返回{"error": "service_down"} |
antigravity出现agent terminated due to error | Agent代码含未声明的import antigravity | grep "antigravity" agent.py | 删除彩蛋代码,antigravity是Python玩笑模块 |
Task Decomposition failed: no valid tool found | Orchestrator的tool_description未覆盖用户意图 | `echo "企业注销流程" | python -c "import json; print(json.loads(input()).get('intent'))"` |
注意:
agent项目中,Tool的parameters必须用JSON Schema精确描述。{"type": "string", "minLength": 1}比"type": "string"更能防错。
5.4 Token Exchange失败的终极排查表
| 现象 | 检查项 | 命令 | 预期结果 |
|---|---|---|---|
| `token exchange failed: token endpoint returned |