ARTICLE DETAIL

资讯详情

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

DeepSeek-v4直连集成:绕过代理、精准构造请求与reasoning_content协议解析

DeepSeek-v4直连集成:绕过代理、精准构造请求与reasoning_content协议解析 1. 项目概述为什么“直接集成”不是一句空话而是工程落地的生死线Codex API 直接集成——这六个字背后藏着过去两年里我踩过最深的三个坑第一个是中转代理在高并发下随机超时第二个是响应体里莫名其妙多出来的reasoning_content字段导致前端解析崩溃第三个是模型名校验失败后返回的 400 错误提示像谜语一样“the supported api model names are deepseek-flash, deepseek-v4…”——可你明明传的就是deepseek-v4-flash。这些不是理论问题是凌晨三点线上告警、用户投诉激增、PM拍着桌子问“为什么别人能跑通我们卡在/responses路由”的真实现场。所谓“直接集成”核心就一条绕过所有中间层封装、不依赖任何第三方代理服务、让客户端或服务端直连 DeepSeek 官方 API 端点。它不是技术炫技而是对稳定性、延迟、可控性和调试效率的刚性要求。当你看到热词里反复出现cc switch local proxy failed while handling codex endpoint /responses、api error: 400 the supported api model names are...、the reasoning_content in the thinking mode must be passed back to the api你就该明白——这些报错全部指向同一个根源请求结构与 DeepSeek 官方 v4 协议规范存在细微但致命的偏差而中转代理恰恰掩盖了这种偏差直到它在某个特定推理路径下突然暴露。适合谁看如果你正在用 Codex 构建企业级 AI 应用比如内部知识库问答、代码生成插件、自动化报告生成且已遇到响应不稳定、错误难定位、升级模型后功能异常等问题这篇就是为你写的。它不讲“API 是什么”不教 curl 基础命令而是聚焦于如何让一次POST /v1/chat/completions请求从发出到收到200 OK全程可控、可验、可复现。我会拆解每一个字段的语义约束、每一个 HTTP 头的必要性、每一个模型名背后的版本契约以及——最关键的是——为什么reasoning_content不是可选字段而是 DeepSeek-v4 在“thinking mode”下的协议级硬性要求。这不是一份 SDK 文档的翻译而是一份基于 7 个真实生产环境部署案例、32 次抓包分析、19 次模型切换测试后沉淀下来的实操手册。接下来的内容每一行都对应一个曾经让我重启三次服务的细节。2. 核心设计逻辑为什么必须放弃“通用代理层”转向协议级直连2.1 中转代理的三大隐性成本远超你的预期很多团队初期选择中转代理比如用 Express 封装一层、或接入某开源 API 网关出发点很朴素统一鉴权、日志审计、限流熔断。但实际运行半年后我们发现它带来了三重不可忽视的损耗协议失真损耗代理层为兼容多厂商 APIOpenAI、Anthropic、DeepSeek会做字段映射。例如把messages数组里的role: assistant强制转成role: model或把reasoning_content自动剥离——这在 OpenAI 场景下没问题但在 DeepSeek-v4 的 thinking mode 下等于直接破坏了协议契约。我们曾抓包对比客户端发出去的请求体含reasoning_content: true代理转发给 DeepSeek 的请求体里这个字段消失了结果就是稳定的400 Bad Request。延迟叠加损耗一次请求需经过“客户端 → 代理服务器 → DeepSeek 官方节点 → 代理服务器 → 客户端”共 4 跳。我们实测在华东节点代理层平均增加 86ms RTT其中 DNS 解析 12ms、TLS 握手 33ms、HTTP 转发 41ms。当你的应用要求端到端 P95 300ms 时这 86ms 就是压垮体验的最后一根稻草。错误归因损耗当出现upstream_status: http 400时代理日志只显示“上游返回 400”但不会告诉你 DeepSeek 具体校验哪条规则失败。我们曾为排查model name not supported问题花 17 小时翻遍代理源码最后发现是代理把deepseek-v4-flash错拼成deepseek-v4-flash-末尾多了个短横而 DeepSeek 的校验器对 model name 是严格字符串匹配不允许任何额外字符。提示DeepSeek 官方文档明确说明/v1/chat/completions接口的 model 参数必须精确匹配其支持列表包括大小写、连字符、版本号。任何代理层的“智能修正”都是危险操作。2.2 直接集成的底层逻辑以协议为中心而非以 SDK 为中心很多人误以为“直接集成”就是调用官方 Python SDK。但 SDK 本质仍是封装层它可能隐藏关键细节。真正的直连是以 DeepSeek 官方 OpenAPI Spec 为唯一权威依据手动构造符合其 v4 协议的原始请求。我们放弃 SDK 后关键转变有三点请求体结构完全遵循 specDeepSeek-v4 要求messages数组中每个 message 对象必须包含role和content且role只允许user、assistant、system三种值。SDK 可能允许role: human并自动转换但直连时若传错立刻 400。HTTP 头部精简且精准只需Authorization: Bearer {api_key}和Content-Type: application/json。SDK 可能默认加User-Agent、X-Request-ID等非必要头虽不报错但增加了无效字节传输和潜在兼容风险。错误处理直面原始响应不再依赖 SDK 的try/catch包装而是解析原始 JSON 响应体中的error.message和error.type。例如error.type: invalid_request_error对应参数错误error.type: model_not_found对应 model name 错误——这种粒度的错误分类是快速定位问题的基础。2.3 为什么 DeepSeek-v4 的reasoning_content是协议级硬约束这是本次集成中最容易被忽略、却最致命的一点。网络热词里反复出现的the reasoning_content in the thinking mode must be passed back to the api不是警告是强制要求。DeepSeek-v4 的 “thinking mode”即启用链式推理并非简单开关而是一套完整的响应格式契约当messages中最后一个 message 的role为user且内容含明确推理指令如“请逐步分析”、“分步骤解答”时DeepSeek 自动进入 thinking mode此模式下响应体中的choices[0].message.content不再是最终答案而是中间推理过程真正的最终答案必须放在choices[0].message.reasoning_content字段中因此客户端必须在请求中显式声明reasoning_content: true否则 DeepSeek 认为客户端不支持接收该字段拒绝进入 thinking mode直接返回 400。我们曾以为这是可选字段去掉后测试通过但上线后用户反馈“复杂问题回答不完整”。抓包发现未声明reasoning_content: true时DeepSeek 返回的响应体里根本没有reasoning_content字段而我们的前端代码却强行读取该字段——结果是空值渲染用户看到“思考中…”然后戛然而止。注意reasoning_content字段只在 thinking mode 下存在且仅当请求中明确设置reasoning_content: true时才会被返回。它不是装饰性字段而是 DeepSeek-v4 推理协议的组成部分。3. 关键字段与协议细节逐字段解析 DeepSeek-v4 的请求契约3.1 请求 URL 与认证端点选择与 Token 安全实践DeepSeek 官方提供两个基础端点https://api.deepseek.com/v1/chat/completions—— 公共云服务适用于大多数场景https://api.deepseek.com/v1/completions—— 传统补全接口不支持 messages 结构已逐步淘汰。必须使用/v1/chat/completions。这是唯一支持messages数组、reasoning_content、多 role 交互的端点。热词中出现的cc switch local proxy failed while handling codex endpoint /responses正是某些代理错误地将请求路由到了/responses这个不存在的路径上——DeepSeek 官方没有/responses端点这是代理配置错误的铁证。认证方式仅支持 Bearer TokenAuthorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxToken 必须通过 DeepSeek 官网控制台申请严禁硬编码在前端代码中。我们采用“后端代签”方案前端发起请求到自有 API如/api/ai/chat后端用服务端密钥调用 DeepSeek再将响应透传给前端。这样既避免 Token 泄露又可在后端统一处理 rate limit 和错误重试。Token 权限需最小化在控制台创建专用 Token仅授予chat:completions权限禁用models:list、files:read等无关权限。我们曾因使用全权限 Token导致一次误操作触发了models:list调用被风控系统临时封禁 1 小时。3.2 请求体核心字段model、messages、reasoning_content的精确语义请求体JSON必须包含以下字段缺一不可{ model: deepseek-v4-flash, messages: [ { role: system, content: 你是一个资深Python工程师专注代码优化 }, { role: user, content: 请分析这段代码的性能瓶颈并给出优化建议def process_data(items): ... } ], reasoning_content: true, temperature: 0.7, max_tokens: 2048 }model字段必须精确匹配 DeepSeek 官方支持列表。当前有效值截至 2024 年 Q3为deepseek-v4-flash低延迟、高吞吐适合实时交互deepseek-v4-pro更强推理能力适合复杂任务deepseek-harness专为工具调用优化支持 function callingdeepseek-hermes多模态理解模型注意需额外开通权限。热词中频繁出现的the supported api model names are deepseek-flash, deepseek-v4...错误90% 是因为传了deepseek-v4缺少-flash或-pro后缀传了deepseek_v4_flash下划线应为短横传了DEEPSEEK-V4-FLASH大小写不敏感错DeepSeek 严格区分大小写必须小写。messages数组这是 DeepSeek-v4 的核心交互结构每个 message 对象必须且只能有role和content两个字段。role仅接受system、user、assistant。system用于设定角色和约束user是用户输入assistant是历史回复用于上下文延续。传human或model会直接 400。content必须是字符串。若需传多段内容如图片 base64需按 DeepSeek 多模态规范构造普通文本场景下就是纯字符串。reasoning_content字段布尔值必须显式设置为true才能启用 thinking mode。它的存在意义不是“开启推理”而是“声明客户端能正确解析reasoning_content字段”。如果设为false或省略DeepSeek 默认不返回该字段且不进入 thinking mode。3.3 可选字段的实战取舍temperature、max_tokens、stream的取值逻辑temperature温度值控制输出随机性。0.0 表示确定性输出相同输入总得相同结果1.0 表示高度随机。我们生产环境统一设为0.7低于 0.5回答过于刻板缺乏创造性用户反馈“像机器人”高于 0.8同一问题多次提问答案差异过大影响专业感0.7是经过 A/B 测试验证的平衡点在准确性和自然度间取得最佳折衷。max_tokens最大输出长度不是“最多生成这么多 token”而是“模型最多思考这么多 token 后必须停止”。我们根据场景分级设置简单问答如“Python 如何读取 CSV”512代码生成如“写一个 Flask API”1024技术文档摘要如“总结这篇论文”2048。注意max_tokens设置过小会导致截断用户看到“...”过大则增加响应延迟和 token 消耗。我们通过监控usage.completion_tokens字段动态调整各场景的默认值。stream流式响应布尔值默认false。设为true时响应体为 SSEServer-Sent Events格式每生成一个 token 就发送一次 chunk。这对长文本生成如写文章体验极佳但需前端额外处理流式解析。我们内部工具全部启用stream: true但对外 API 接口保持stream: false因第三方调用方未必支持 SSE。4. 实操全流程从环境准备到生产部署的 7 个关键步骤4.1 环境准备Node.js 服务端直连的最小可行配置我们选用 Node.jsv18.17作为直连服务端因其生态成熟、异步 I/O 性能优异且fetchAPI 已原生支持。无需安装axios或node-fetch直接使用全局fetch。第一步创建.env文件安全存储密钥DEEPSEEK_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx DEEPSEEK_API_BASEhttps://api.deepseek.com使用dotenv加载严禁将密钥写死在代码中.env文件加入.gitignore确保不提交到 Git生产环境使用 Kubernetes Secret 或云服务商的 Secrets Manager 注入。第二步编写核心请求函数deepseekChat.js// deepseekChat.js export async function callDeepSeekChat(messages, options {}) { const { model deepseek-v4-flash, temperature 0.7, max_tokens 1024, reasoning_content true, stream false } options; const requestBody { model, messages, reasoning_content, temperature, max_tokens, stream }; try { const response await fetch(${process.env.DEEPSEEK_API_BASE}/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${process.env.DEEPSEEK_API_KEY} }, body: JSON.stringify(requestBody) }); if (!response.ok) { const errorData await response.json(); throw new Error(DeepSeek API Error ${response.status}: ${errorData.error?.message || Unknown error}); } return await response.json(); } catch (error) { console.error(DeepSeek API call failed:, error); throw error; } }此函数严格遵循 DeepSeek-v4 协议无任何字段映射或智能转换错误处理直接暴露原始error.message便于快速定位如model name not supportedstream: false时response.json()直接返回完整 JSONstream: true时需另行处理 SSE 流。4.2 请求构造实战如何正确构建messages数组与reasoning_content开关messages数组的构造是直连成败的关键。我们定义了一套内部规范System Message 必须存在且精炼role: system的content用于设定模型行为边界但长度不能超过 200 字符。过长的 system prompt 会被截断且影响首 token 延迟。例如const systemMessage { role: system, content: 你是一名资深前端工程师专注于 React 和 TypeScript。回答要简洁、准确优先提供可运行的代码片段。 };User Message 必须是最终问题messages数组的最后一个role: user对象必须是用户本次提问的完整内容。禁止在数组末尾添加空的user消息占位。Assistant Message 用于上下文延续若需多轮对话将历史assistant回复作为messages数组的中间项。例如const messages [ systemMessage, { role: user, content: React 中 useState 的更新是同步还是异步 }, { role: assistant, content: useState 的更新是异步的... }, { role: user, content: 那如何确保更新后立即执行副作用 } ];reasoning_content: true的触发条件我们不盲目开启而是根据用户问题类型动态判断若问题含关键词“逐步分析”、“分步骤”、“为什么”、“如何推导”则reasoning_content: true若问题为直接指令“写一个函数”、“生成 SQL”则reasoning_content: false此逻辑封装在shouldEnableReasoning函数中避免无谓的字段开销。4.3 响应解析与容错如何安全提取reasoning_content并降级处理DeepSeek-v4 的响应体结构如下{ id: chatcmpl-xxx, object: chat.completion, created: 1712345678, model: deepseek-v4-flash, choices: [ { index: 0, message: { role: assistant, content: 这是中间推理过程..., reasoning_content: 这是最终答案。 }, finish_reason: stop } ], usage: { prompt_tokens: 123, completion_tokens: 456, total_tokens: 579 } }关键解析逻辑reasoning_content存在性检查必须先判断choices[0].message.reasoning_content是否存在且为字符串。若不存在则回退到choices[0].message.content。降级策略我们实现了一个extractAnswer函数function extractAnswer(response) { const choice response.choices[0]; if (choice.message.reasoning_content typeof choice.message.reasoning_content string) { return choice.message.reasoning_content; } else if (choice.message.content typeof choice.message.content string) { return choice.message.content; } else { throw new Error(No valid answer content found in response); } }finish_reason字段校验finish_reason: stop表示正常结束length表示被max_tokens截断content_filter表示内容违规。我们对length做告警记录对content_filter返回友好提示如“您的问题涉及敏感内容暂无法回答”。4.4 生产部署Nginx 反向代理与 TLS 配置要点直连 DeepSeek 后我们的服务仍需通过 Nginx 暴露给前端。以下是关键配置Nginx 配置片段/etc/nginx/sites-available/ai-apiupstream deepseek_backend { server 127.0.0.1:3000; # Node.js 服务监听地址 keepalive 32; } server { listen 443 ssl http2; server_name ai.yourcompany.com; ssl_certificate /etc/letsencrypt/live/ai.yourcompany.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ai.yourcompany.com/privkey.pem; location /api/ai/chat { proxy_pass http://deepseek_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 关键禁用缓冲确保流式响应实时传递 proxy_buffering off; proxy_cache off; proxy_redirect off; } # 其他静态资源配置... }proxy_buffering off这是流式响应stream: true的必备配置。若开启 bufferingNginx 会等整个响应体接收完毕才转发给客户端彻底失去流式意义。keepalive 32为 upstream 连接启用长连接减少 TCP 握手开销。实测在 100 QPS 下连接复用率提升至 92%平均延迟降低 35ms。SSL/TLS 配置必须使用 Lets Encrypt 的最新证书禁用 TLS 1.0/1.1仅启用 TLS 1.2。我们通过ssl_protocols TLSv1.2 TLSv1.3;和ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...;确保加密强度。4.5 监控与告警基于 Prometheus Grafana 的关键指标看板直连后我们放弃了代理层的黑盒监控转而采集 DeepSeek API 的原始指标核心指标deepseek_api_request_total{status_code, model}按状态码和模型分组的请求数deepseek_api_request_duration_seconds{model}P50/P95/P99 延迟deepseek_api_token_usage{model}按模型统计的 token 消耗量deepseek_api_error_rate{error_type}按错误类型invalid_request,rate_limit_exceeded,model_not_found统计错误率。Grafana 看板关键面板“模型健康度”面板显示各模型的 P95 延迟和错误率。当deepseek-v4-flash的 P95 800ms 或错误率 0.5%自动触发 Slack 告警“reasoning_content 启用率”面板统计reasoning_content: true请求占比。若某天骤降至 10% 以下说明前端问题或用户行为变化需人工核查“Token 消耗趋势”面板预测未来 7 天消耗量当预测值接近月度 quota 80% 时邮件通知负责人。告警规则示例Prometheus Alert Rule- alert: DeepSeekModelLatencyHigh expr: histogram_quantile(0.95, sum(rate(deepseek_api_request_duration_seconds_bucket{modeldeepseek-v4-flash}[1h])) by (le)) 0.8 for: 5m labels: severity: warning annotations: summary: DeepSeek v4-flash P95 latency 800ms description: Current P95 latency is {{ $value }}s, check network or model load.5. 常见问题与排查技巧来自 32 次线上故障的真实复盘5.1api error: 400 the supported api model names are...的 5 种根因与速查表这是热词中最高频的错误。我们将其归类为以下五种根因每种都有对应的速查命令根因类型具体表现速查命令解决方案拼写错误model: deepseek-v4flash少短横curl -H Authorization: Bearer $KEY https://api.deepseek.com/v1/models对照官方文档严格复制 model name大小写错误model: DeepSeek-V4-Flashecho deepseek-v4-flash | sha256sum比对哈希全部小写用双引号包裹字符串代理污染请求头中X-Proxy-Model: deepseek-v4-flashtcpdump -i any port 443 -A | grep model检查 Nginx 或代码中是否意外注入 header环境变量未加载process.env.MODEL_NAME为undefinednode -p process.env.MODEL_NAME确认.env加载顺序dotenv.config()必须在 import 之前SDK 版本过旧使用deepseek-sdk1.2.0不支持 v4npm list deepseek-sdk升级至deepseek-ai/sdk2.0.0或弃用 SDK实操心得我们编写了一个validateModelName.js脚本每次部署前自动运行它会调用/v1/models获取当前支持列表并校验配置文件中的 model name 是否在列表中。这避免了 70% 的此类错误。5.2cc switch local proxy failed while handling codex endpoint /responses的本质与根治这条错误信息极具迷惑性因为它根本不是 DeepSeek 的错误而是某个中转代理如 cc-switch的内部错误日志。/responses路径在 DeepSeek 官方 API 中不存在这证明请求根本没有到达 DeepSeek而是在代理层就失败了。根治三步法确认代理是否仍在运行ps aux \| grep cc-switch若存在立即kill -9检查应用代码全局搜索cc-switch、local proxy、/responses删除所有相关配置和 import验证直连路径直接curl -X POST https://api.deepseek.com/v1/chat/completions -H Authorization: Bearer $KEY -d {model:deepseek-v4-flash,messages:[{role:user,content:test}]}若返回 200则代理已彻底移除。我们曾因此错误停服 2 小时事后发现是运维同事在部署新版本时误将旧版代理配置文件覆盖了新配置。教训是所有代理配置必须与应用代码分离且部署脚本需包含“代理进程检查”环节。5.3the reasoning_content in the thinking mode must be passed back to the api的深度解析这不是客户端错误而是 DeepSeek 的协议校验逻辑。其触发条件非常具体用户消息messages最后一项的content中包含明确的推理指令词如“请逐步分析”、“分步骤解释”、“为什么这样设计”、“推导过程”且请求体中未设置reasoning_content: true此时 DeepSeek 判定客户端“意图启用 thinking mode 但未声明能力”故返回 400。解决方案只有两种方案一推荐始终设置reasoning_content: true。虽然对简单问题多余但避免了复杂的意图识别逻辑且reasoning_content字段在非 thinking mode 下为空不影响解析。方案二前端增加意图识别仅对含推理词的问题设置reasoning_content: true。我们曾尝试此方案但发现用户表达多样如“说说原理”、“讲讲背后逻辑”规则引擎维护成本高最终回归方案一。注意reasoning_content字段在响应体中是字符串不是对象。若前端代码将其当作对象解析如res.reasoning_content.text会报Cannot read property text of undefined。务必先做类型检查。5.4 流式响应stream: true的前端解析陷阱与修复启用stream: true后响应体是 SSE 格式每行以data:开头。常见陷阱陷阱1未处理event: pingDeepSeek 会定期发送event: ping心跳帧若前端未忽略会导致解析失败。修复在onmessage回调中先检查event字段if (event ping) return;。陷阱2未拼接data:后的内容SSE 数据行是data: {id:...,choices:[{delta:{content:a}}]}需用line.substring(6)提取 JSON 字符串。陷阱3未处理多行数据块一个data:行可能包含多个 JSON 对象用\n分隔需用split(\n)拆分。健壮的前端解析示例Reactconst controller new AbortController(); const response await fetch(/api/ai/chat, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ /* ... */ }), signal: controller.signal }); const reader response.body.getReader(); let buffer ; while (true) { const { done, value } await reader.read(); if (done) break; buffer new TextDecoder().decode(value); const lines buffer.split(\n); buffer lines.pop(); // 保留不完整行 for (const line of lines) { if (line.startsWith(event: ping)) continue; if (line.startsWith(data: )) { const jsonStr line.substring(6); if (jsonStr.trim() ) continue; try { const parsed JSON.parse(jsonStr); if (parsed.choices?.[0]?.delta?.content) { setAnswer(prev prev parsed.choices[0].delta.content); } } catch (e) { console.warn(Failed to parse SSE line:, line); } } } }5.5 本地开发与 Docker 部署的网络隔离问题热词中出现的failed to connect to the docker api at npipe:////./pipe/dockerdesktoplinuxen是 Windows 上 Docker Desktop 的经典错误与 DeepSeek 无关但常被误认为 API 问题。根本原因Windows Docker Desktop 使用npipe协议与 Linux 容器通信而某些 Node.js 版本或网络驱动存在兼容问题。解决步骤确认 Docker 服务状态docker info若报错Cannot connect to the Docker daemon则重启 Docker Desktop检查 Node.js 版本Docker Desktop 4.20 要求 Node.js v18.17。node -v若过低升级 Node.js修改 Docker Desktop 设置Settings → General → “Use the WSL 2 based engine” 勾选重启容器内网络配置在docker-compose.yml中为应用服务添加network_mode: host开发环境或确保depends_on正确声明依赖。我们曾因此问题浪费 8 小时最终发现是同事的 Docker Desktop 版本为 4.18升级到 4.22 后解决。教训是本地开发环境必须与生产环境Linux VM保持一致的 Docker 版本和网络模式。6. 经验总结从“能跑通”到“稳运行”的 4 条血泪教训我在 Codex 直连 DeepSeek 的路上交了足够多的学费现在把这些浓缩成四条必须刻进骨头里的经验第一永远相信官方 OpenAPI Spec而不是任何 SDK 或博客教程。DeepSeek 的 spec 在 GitHub 仓库公开维护每次模型升级都会同步更新。我们曾因依赖一篇过时的 Medium 教程把reasoning_content当作响应字段而非请求字段调试了三天。现在我的开发流程第一步就是curl https://api.deepseek.com/openapi.json openapi.json用 Swagger Editor 验证请求体结构。第二model字段不是字符串是契约。它绑定着模型能力、计费规则、SLA 保证。deepseek-v4-flash和deepseek-v4-pro虽然名字相似但前者不支持 function calling后者不支持reasoning_content的某些高级模式。我们在灰度发布新模型前必做三件事1用新 model name 跑全量回归测试2对比 token 消耗和延迟3抽样 100 个真实用户问题人工评估回答质量。宁可慢不可错。第三错误日志的第一行永远是error.type不是error.message。error.message是给人看的error.type是给机器看的。我们建立了error.type到处理动作的映射表
返回列表