基于OpenAI API的知识问答助手开发实践与调优指南
1. 项目整体设计与思路拆解说句实话这两年接触AI相关的技术开发绕不开OpenAI生态。身边不少同行在问到底怎么把一个基于OpenAI API的智能助手真正落到自己的业务里而不是仅仅停留在网页对话框里玩一玩。这篇文章我就结合这段时间做“某知识问答助手”项目的实际经验把从模型选型、API调用到场景落地的完整过程拆开讲一讲。项目标题“openai”看似宽泛但落到具体开发上核心其实就是三件事模型能力怎么选、提示词怎么写、上下文怎么管理。想清楚这三件事基于OpenAI API的应用骨架基本就搭起来了。无论你是做客服机器人、文档摘要工具还是企业内部的知识库问答系统这三件事都是避不开的地基。我这次做的是某跨平台系统的知识问答助手基本需求是用户用自然语言提问系统从企业内部的文档库里检索相关内容再调用OpenAI的对话接口生成回答。检索部分用了向量数据库做语义匹配生成部分就是用GPT模型来组织语言。整个链路看起来很常规但其实每一步都有不少取舍。1.1 为什么选OpenAI API而不是自建模型很多团队在立项时会先纠结一个问题要不要自己部署一个开源模型我个人的看法是如果你的团队没有算法工程师编制也没有GPU服务器维护经验那就不要一上来就考虑自建。自建模型有非常现实的成本问题。以单卡训练一个像样的对话模型为例动辄几十万到上百万的硬件投入还只是训练阶段。推理阶段的GPU占用量也不低并发量稍微上来一点又要加机器。更关键的是术业有专攻让一支应用开发团队去维护模型训练链路精力上根本顾不过来。调用OpenAI API是一种务实的方案。把模型训练和部署这些脏活累活外包出去应用侧只需要关心一件事怎么把提示词写好。这有点像做软件开发你不需要自己维护物理服务器直接用云服务商的虚拟机就行。成本可控、上线速度快、迭代方便这几条对大多数中小企业来说远比“模型自主可控”这个理由更有吸引力。当然如果业务数据极度敏感或者需要对模型做深度的领域定制那确实要重新评估。但至少对起步阶段来说API先行绝对是最优解。1.2 模型版本选型的几个考量维度OpenAI的模型版本更新频率很高从早期的GPT-3.5到如今的GPT-4系列各有各的使用场景。选模型我之前吃过亏最开始图便宜直接用了旧版模型结果回答质量差得离谱客户问一个稍微拐弯的问题就答非所问。后来调整策略是这么划分的简单事实型任务、需要高并发的场景用轻量级模型比如GPT-3.5系列响应快、成本低批量处理不心疼。复杂推理、多轮对话、需要理解长文本的场景用旗舰模型比如GPT-4系列质量高上下文理解能力强但单次成本更高。需要低成本、快速且结构化的输出优先考虑调高性能的轻量模型实在达不到效果再升级到旗舰模型。选型时还有一个重要维度上下文窗口长度。如果你的业务场景涉及长文档摘要可用的上下文长度直接决定了你能一次性塞多少内容进去。别等代码写完了才发现窗口太小那就比较被动了。2. 核心细节解析与实操要点项目立起来之后真正的核心工作才开始。很多人在这一步容易掉进一个误区以为把OpenAI API的官方示例复制过来改个场景就能用。实际跑两天就会发现回答质量不稳定、格式千奇百怪、多轮对话总是丢失历史信息。这些问题的根源往往不在API本身而在你对接口参数的把握和提示词的设计。2.1 模型参数调优的那些隐藏逻辑OpenAI的接口参数里用的最频繁的是temperature、max_tokens、top_p这几个。看似简单实际调参时非常有讲究。temperature控制的是随机性取值范围0到2。设置为0代表每次都倾向于输出概率最高的结果回答确定性最强适合做客服、知识问答这类需要严谨答案的场景。设置为0.7到1.0回答会更有创造性适合写文案、创意脑暴。我之前做过一个翻译工具最初用默认的0.7结果同一句话翻译两次结果不一样后来直接降到0.1效果就稳定多了。top_p是另一种采样方式又叫核采样它和temperature理论上不应该同时调。官方的建议是先固定其中一个再调另一个。实际开发中我基本把top_p固定为1只用temperature来做控制方便调试。max_tokens要特别留意这个参数决定的是“生成的最多token数”不是“消耗的总token数”。很多人在这个参数上踩过坑设置为几百之后长回答被硬生生截断话都没说完就停了。正确的做法是给足够的余量把max_tokens的上限放开到能满足最大预期输出长度的值再配合提示词里的“限制你的回答在100字以内”来做约束让模型自己学会精简。注意token并不等于汉字数。一个汉字大约对应1到2个token英文单词平均约1.3个token。如果不清楚自己请求消耗了多少量可以去官方页面单次调用时看返回的usage字段那是唯一准确的度量。另外还有个参数组frequency_penalty和presence_penalty像是“思路调节器”。前者控制模型对重复内容的惩罚程度后者控制模型是否倾向于讨论新话题。做知识问答时这两个参数我设置为0因为不需要模型发散做创意文案时presence_penalty可以适当调高。2.2 提示词模板设计的三个层级提示词工程是目前为止影响输出质量最大的单一因素比调参数的影响还要大得多。我的经验是提示词要分成三个层级来设计而不是简单地在请求时填一句话。第一层系统提示词System Message。它定义的是“角色设定”。比如让模型扮演一个严谨的技术顾问“你是一位资深的软件架构师请用准确的语言回答技术问题。如果不确定答案请明确告诉我你不知道”。这一层的设定会贯穿整个对话过程对风格和基调起到决定性作用。第二层业务提示词User Message。它是用户输入和业务信息的拼装处。处理知识库问答时我给用户的提问加了固定模板请基于以下参考资料回答用户问题。 参考资料 {知识检索结果} 用户问题 {用户输入} 要求 1. 回答内容只能基于参考资料不要编造。 2. 如果参考资料无法回答问题请明确告知“当前资料库中没有相关信息”。 3. 回答控制在200字以内。第三层输出约束Few-shot示例。如果对输出格式有严格要求比如要求返回JSON就必须在提示词里给出示例让模型照着格式输出。这比在提示词里写一万句“请严格按照JSON格式输出”都管用。示例一两组就够CMDB就是要给模型一个可参照的锚点。2.3 函数调用让模型真正“做事”OpenAI的Function Calling机制是我认为整个平台里最有价值的能力之一。它让模型不再局限于“说话”而是能够调用外部工具、查询数据库、执行动作。举个具体的例子。我的知识问答助手需要对接内部系统查询项目进度如果仅靠模型自身它只能从训练数据里猜测错误率高而且永远拿不到实时数据。接入Function Calling之后流程变成了这样用户提问“帮我查一下当前正在进行的项目有哪些”模型识别到需要调用“查询项目列表”这个函数返回一个结构化的函数调用请求。程序解析这个请求去内部系统查API拿到实时数据。程序把数据拼接成文本再次发给模型让模型组织语言回答用户。这套机制本质上是把大语言模型变成大脑软件系统变成手臂。模型负责理解、规划和判断系统负责执行和返回结果。实测下来这种模式下回答的错误率大幅下降用户也明显感觉“这个助手是真的懂业务”。2.4 上下文管理多轮对话不丢记忆的秘密没有上下文管理多轮对话就是噩梦。用户第一轮说“我想了解公司报销流程”第二轮问“需要哪些材料”如果接口请求里不带第一轮的对话内容模型根本不知道“需要哪些材料”指的是什么。我的处理方式是把对话历史按时间顺序拼装成一个消息数组作为请求的一部分发送。第1条消息是系统提示词后面依次是用户和助手的交替消息。这个方案简单且有效但有个绕不开的问题历史太长之后token消耗剧增成本压不住。后来我引入了滑动窗口机制。只保留最近6到8轮对话作为上下文更早的内容如果有关键信息就用摘要的方式提前压缩。具体做法是把超过窗口的早期对话另作一次摘要请求将摘要文本作为系统提示词的一部分拼接进去。这样既能延续早期信息又能控制成本两全其美。单轮回答为主的业务可以不传历史上下文节省token。多轮对话密集的业务建议用滑动窗口保持最近几轮再加上历史摘要压缩。3. 实操过程与核心环节实现说完了原理和设计这一节直接把整个实操链路放出来。我尽量还原项目初期的完整过程从环境准备一直到代码落地每一步都可以直接参考。3.1 环境准备与依赖安装项目使用Python开发主要依赖是openai库。安装方式很简单pip install openai版本上我没选择最新的大版本而是用了相对成熟的兼容版本进入项目时实测过没有大问题。随后还需要环境变量配置export OPENAI_API_KEY你的密钥注意密钥千万不要直接硬编码在代码里。团队协作时密钥文件要么用环境变量隔离要么用配置中心管理。我就见过有同事把密钥提交到仓库结果被扫描工具告警最后只能紧急撤销密钥重新生成教训很深刻。随后是诊断环境是否正常的环节。跑一个最简单的对话请求确认API连通性和基础计费正常。from openai import OpenAI client OpenAI() response client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: 你是一个实用的助手。}, {role: user, content: 请用一句话自我介绍。} ], temperature0.3, max_tokens200 ) print(response.choices[0].message.content)跑通这个基础调用之后整个开发链路就打通了。后面所有能力都是在这个底子上叠加。3.2 知识问答助手的完整实现接下来是知识问答助手核心代码。我的设计里集成了向量检索和函数调用两个机制。向量检索负责从文档库里找相关信息函数调用负责对接内部系统。先封装一个检索函数def search_documents(query: str) - str: # 实际的向量检索逻辑这里简化为固定返回 return 报销流程员工填写报销单提交给部门经理审批财务部复核后打款。再定义一个工具清单让模型知道系统里有哪些函数可用tools [ { type: function, function: { name: search_documents, description: 在内部知识库中检索与问题相关的文档内容, parameters: { type: object, properties: { query: { type: string, description: 用户的问题或检索关键词 } }, required: [query] } } } ]主对话循环的逻辑是先调用模型判断它是否需要调用工具。如果需要执行工具后把结果再回传给模型。def chat_with_tool(user_input: str, history: list) - str: messages [{role: system, content: 你是某公司的内部知识助手。}] messages.extend(history) messages.append({role: user, content: user_input}) response client.chat.completions.create( modelgpt-4o, messagesmessages, toolstools, tool_choiceauto, temperature0.2 ) message response.choices[0].message if message.tool_calls: tool_result None for tool_call in message.tool_calls: if tool_call.function.name search_documents: import json args json.loads(tool_call.function.arguments) tool_result search_documents(args[query]) messages.append(message) messages.append({ role: tool, content: tool_result, tool_call_id: message.tool_calls[0].id }) final_response client.chat.completions.create( modelgpt-4o, messagesmessages, temperature0.2 ) return final_response.choices[0].message.content return message.content这套逻辑跑起来之后用户提问时会先触发检索工具获取关联资料再由模型组织语言回答。整个问答过程不再是模型拍脑袋编而是有依据的生成准确性提升非常明显。3.3 结合真实业务场景的部署形态代码写完之后落到实际部署上还会遇到新问题。这个助手的服务形态我选择的是标准的HTTP API方式后端框架用的FastAPI部署在公司的内网服务器上对外暴露一个简单的POST接口。前端则在企业微信工作台里嵌了一个H5页面用户点开后直接对话。实际部署中有个很关键的细节调用OpenAI接口的服务器必须在网络可达的位置。有些公司内网是完全隔离的API请求根本出不去这时候就需要在中间加一层代理转发服务由公网服务器代为转发请求。另外并发控制也属于部署时就要考虑的事。OpenAI接口有速率限制rate limit单位时间内的请求次数不能超过配额标准。我在服务层用了一个简单的线程池加队列来削峰保证瞬间的并发请求不会直接把配额打爆。如果并发量再大些就需要引入消息队列来异步处理了。项目当前规模下队列方案足够稳。4. 常见问题与排查技巧实录整个项目实施过程中遇到最多的问题集中在接口报错、输出质量不稳和成本失控这三个方向。每一类我都踩过坑记录下来给大家做个速查参考。4.1 高频报错的快速定位把高频报错和排查思路整理成了一个速查表报错信息可能原因解决办法Connection error网络不通API域名无法访问检查服务器出网策略必要时配置代理转发AuthenticationErrorAPI密钥无效或权限不足检查密钥是否正确确认账单是否存在欠费RateLimitError触发了速率限制降低并发增加重试退避逻辑ContextLengthExceeded请求内容超过模型上下文窗口上限精简消息历史引入摘要压缩机制InsufficientQuota账户余额不足或额度耗尽到后台确认余额及时充值APIError服务端临时故障指数退避重试重试次数建议不超过3次有一个排查技巧我一直在用所有异常都要记录完整请求参数和响应快照。问题上报之后不需要反复猜测直接对比出错的请求和成功的请求差异点一分钟就能定位根因。排查经验多了之后很多报错看一眼就知道是哪里的问题。4.2 回答质量不稳的调优路径回答质量不稳是最让人头痛的问题因为它没有明确的报错信息只能靠观察。以我的经验质量调优要按顺序排查第一步查提示词。绝大多数质量问题的根源都在提示词描述不清。不要试图让模型“意会”直接用明示的语言说清楚角色、任务、限制条件、输出格式。第二步查参数。如果在做科研类任务temperature设置太高回答就会发散。建议从0开始调逐步增加找到质量下降的临界点再往回退一点。第三步查上下文。如果模型的表现前后不一致很可能是因为上下文塞入太多无关信息干扰了判断。精简上下文只保留直接相关的段落往往能有立竿见影的改善。第四步查数据。如果知识库问答时模型总是答非所问那大概率是检索环节出了问题查不到正确的内容巧妇难为无米之炊。解决办法是优化文档切分策略和召回逻辑。4.3 成本控制的四种有效手段成本失控是API项目里最真实的风险我见过有团队一个月跑出六位数账单的非常吓人。控制成本我从四个方向入手缓存语义相近的问题用户反复问同类问题时vLLM直接把之前生成的回答返回。用语义向量做相似度比较召回高相似度的问题直接用缓存结果省下的token非常可观。合理利用轻量模型不是所有请求都要用旗舰模型。简单问题、复核任务、摘要任务全部分流给轻量模型处理只有复杂的多跳推理问题才升级到旗舰模型。压缩上下文长度聊天历史是token消耗的大头滑动窗口加摘要机制配合使用长期对话可节省处理成本超过一半。设置用量告警在后台配上消耗告警阈值接近预算上限就自动提醒防止月初没留意月底账单一出来整个人都懵了。4.4 安全合规方面的细节提醒做面向企业内部的助手时安全合规是最容易被轻视、却最不该出问题的环节。有几点我基本是写进了团队规范第一用户输入内容可能存在提示注入风险。恶意用户可以构造一段输入试图诱导模型忽略系统提示词。处理的方式是在服务端设立输入过滤规则对输入长度、敏感词、指令注入模式做基础检测超过阈值直接拒绝服务。第二系统提示词不要包含敏感的内部信息。提示词是会随请求发送到模型的任何机密信息都不应该出现在里面。我见过有人把API密钥写进提示词荒唐且危险。第三外部渠道的对话内容要脱敏。如果对话记录需要用于分析或者二次训练必须先把手机号、身份证号等个人信息处理掉再存进日志系统。第四日志记录不能无差别保存。只保存必要的请求元数据不要保存完整对话内容。用户可能不知情地说出隐私信息服务端不应该成为信息泄露的源头。5. 项目的实际效果与后续扩展方向从项目上线到现在这个基于OpenAI API的知识问答助手已经服务了内部几百名员工。用户侧感知最明显的是找答案的时间从过去的“翻半天文档”缩短到“秒级响应”。从后台数据看高频问题转移率提升了挺多——意思是有相当一部分原本需要人工回答的重复性问题现在直接由助手消化掉了。回到开头那个问题一个以“openai”命名的项目到底能做什么我的答案是它不只是一层API封装也不只是花里胡哨的聊天机器人它是一块很扎实的基础设施。你可以用它接客服、做文档处理、搭企业内部的知识大脑甚至对接各种工具软件形成能执行任务的Agent。大模型解决的是“理解与生成”系统工程师解决的是“可靠与落地”两者结合才是有生命力的产品形态。后续如果继续扩展这个项目我会优先考虑几个方向。一是把检索链路做得更细融合粗排和精排两阶段召回让答案更准。二是引入多智能体协作框架将任务拆分给多个子Agent并行处理提高复杂任务的完成度。三是把反馈闭环建起来——用户对回答点“有用”或“无用”的数据都收回来定期做标注用真实反馈迭代提示词和检索策略。这次的项目给我最直观的感受是OpenAI生态的工具链已经相对成熟了但真正拉开差距的仍然是工程化能力。谁把提示词打磨得更精准把上下文管理做得更经济把故障处理得更平滑谁就能把同样的模型用出更好的效果。希望我这段时间的记录能给正在做同类项目的人一点参考。

相关新闻

DeepSeek技术人实战指南:代码生成、Debug、日志分析与提示词模板

DeepSeek技术人实战指南:代码生成、Debug、日志分析与提示词模板

这会儿刚用 DeepSeek 把拖了大半周的一段重构收尾,关掉编辑器的时候忍不住想:这玩意儿现在在我的工作流里,地位已经从"尝鲜玩具"变成真老伙计了。前阵子和几个同行聊起来,发现不少人还在把它当聊天机器人用——问两句生…

2026/10/19 7:49:25 阅读更多 →
开题报告通关密码:从问题意识到文献综述与技术路线全解析

开题报告通关密码:从问题意识到文献综述与技术路线全解析

开题报告这关,说难不难,说简单也真能卡住不少人。我见过太多人,实验做得风生水起,结果一写开题报告就抓瞎:选题被否、文献堆砌、研究内容写得像流水账,答辩现场被评审几句话问到哑火。我自己当年也是从“开…

2026/10/19 7:49:25 阅读更多 →
MATLAB神经网络集成C#桌面端:引擎调用与二次开发实战

MATLAB神经网络集成C#桌面端:引擎调用与二次开发实战

简介:本资源面向需要在C#项目中集成MATLAB神经网络能力的开发者,重点解决跨语言调用MATLAB内核、复用其神经网络工具箱进行建模与训练的问题。内容围绕MATLAB Engine for .NET的配置与使用展开,涵盖引擎初始化、函数调用、C#与MATLAB工作区之…

2026/10/19 7:49:25 阅读更多 →

最新新闻

链表环与相交的底层原理:从内存地址到工程可靠性

链表环与相交的底层原理:从内存地址到工程可靠性

1. 这不是一道“刷题”题,而是数据结构底层思维的试金石“链表是否有环,是否相交”——看到这八个字,很多人第一反应是:哦,又是LeetCode第141、142、160题。翻出快慢指针模板,背下相遇点公式,提…

2026/10/20 13:57:57 阅读更多 →
AI辅助视频剪辑实操:把3小时剪片压缩到45分钟的时间账单

AI辅助视频剪辑实操:把3小时剪片压缩到45分钟的时间账单

经常有人问我:“为什么我剪一条视频要两三个小时,别人半小时就搞定了?”我一般不会直接回答,而是反过来问一句:“你剪视频的时候,是不是一直在手动做字幕?”对方往往一愣,然后陷进沉…

2026/10/20 13:57:57 阅读更多 →
DDS协议实战:分布式仿真系统实时数据分发与调优指南

DDS协议实战:分布式仿真系统实时数据分发与调优指南

做分布式仿真和实时系统这一行,通信协议往往是决定项目成败的“隐形变量”。我真正开始系统研究DDS(Data Distribution Service,数据分发服务)这个协议,是因为一个分布式仿真项目——多个异构节点要在局域网内实时同步…

2026/10/20 13:57:57 阅读更多 →
Python数据分析项目实战:从源码拆解到二次开发

Python数据分析项目实战:从源码拆解到二次开发

简介:这份资源面向希望系统掌握Python数据分析与可视化的学习者,覆盖从编程基础到实战项目的完整技能链路,适合高校学生、转行者及需要处理结构化数据的从业者。压缩包共162个文件,约31.27MB,以67个ipynb实验代码、11个…

2026/10/20 13:57:57 阅读更多 →
AI写教材如何避免重复?低查重工具嵌入创作流程的实战指南

AI写教材如何避免重复?低查重工具嵌入创作流程的实战指南

如果有人觉得“AI写教材”就是输入标题、点一下生成、再复制粘贴,那就大错特错了。真正做过教材或讲义的人都知道,教材创作最耗时的不是“写”,而是让内容准确、成体系、可教学,同时还要保证表达足够原创、不跟已有资料大面积重合…

2026/10/20 13:57:57 阅读更多 →
AO环境光遮蔽合成指南:黑线与白底之间的数值差异与混合策略

AO环境光遮蔽合成指南:黑线与白底之间的数值差异与混合策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 13:56:50 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →