基于AI智能体与技能架构的招投标合规审查引擎设计与实践
1. 项目概述当AI智能体遇上招投标合规审查招标文件对于任何一个参与市场竞争的企业来说都是决定项目成败的“入场券”。动辄上百页的招标文件密密麻麻的条款、技术规范、商务要求背后隐藏着无数合规“陷阱”。一个不起眼的资质要求、一个模糊的技术参数、一个苛刻的付款条件都可能让团队数月的努力付诸东流。传统的审查方式高度依赖资深专家的“火眼金睛”不仅效率低下而且极易因疲劳或疏忽产生疏漏。我们团队一直在思考能否将当下火热的AI智能体Agent技术从一个通用的、概念性的工具真正落地到一个具体、高频、高价值的业务场景中让它成为我们业务人员的“数字合规专家”这就是“招标文件合规引擎”项目的初衷。这个项目的核心不是要创造一个无所不能的通用AI而是要打造一个高度专业化、工程化的“特种兵”。我们选择了基于openJiuwen框架和自定义Skills技能库的技术路线。openJiuwen提供了一个稳定、可扩展的智能体基础架构而Skills则让我们能够将复杂的招投标法规、公司红线条款、历史经验教训封装成一个个可被AI调用的“微服务”。最终的目标是让这个引擎能够像一位不知疲倦的资深专家一样自动解析招标文件精准识别风险点并给出结构化的、可操作的审查报告。这不仅仅是技术上的尝试更是一次对传统工作流程的深度改造。2. 核心思路与架构设计从“通用”到“专精”的蜕变2.1 为什么选择“智能体技能”架构在项目初期我们评估过多种技术方案。比如直接使用大语言模型的API进行全文问答或者训练一个专门的文本分类模型。但这些方案都存在明显短板。纯API调用缺乏可控的业务逻辑和状态管理回答随机性强难以保证审查的稳定性和可追溯性。而训练专用模型则面临招投标领域高质量标注数据稀缺、法规更新频繁导致模型需要频繁重训的挑战。智能体Agent 技能Skills的架构完美地解决了这些问题。智能体在这里扮演“总指挥”的角色它负责理解任务“审查这份招标文件”制定执行计划“先解析文档结构再逐章审查商务、技术、服务条款”并调度合适的技能去完成具体任务。而技能则是封装好的、具有确定性的工具函数。例如“资质条款提取技能”、“付款条件分析技能”、“关联方识别技能”等。这种架构的优势在于模块化与可维护性法规变了我们只需要更新对应的“技能”模块无需改动智能体的核心逻辑。新增一种风险类型开发一个新的“技能”接入即可。确定性可控技能的执行逻辑是代码写死的确保了核心判断规则的稳定输出避免了纯LLM的“幻觉”问题在关键合规点上带来风险。可解释性强整个审查过程被分解为智能体的决策流和技能的执行记录每一步都有迹可循方便人工复核和审计。2.2 基于 openJiuwen 的工程化底座选型openJiuwen是一个开源的、面向生产环境的AI智能体开发框架。我们选择它主要基于以下几点工程化考量完整的生命周期管理它提供了智能体的创建、注册、版本管理、部署和监控的一整套工具这让我们能像管理微服务一样管理我们的合规审查智能体。强大的技能编排能力框架内置的工作流引擎可以让我们以可视化的方式或通过代码定义复杂的审查流程例如串行审查、并行审查、条件分支如果发现某条款则触发更深层次的关联审查。与现有系统集成友好它支持标准的REST API和消息队列接口可以轻松嵌入我们现有的OA系统、项目管理系统或文档管理平台实现从“上传文件”到“收到报告”的全自动流水线。开源可控避免了供应商锁定风险我们可以根据自身业务需求进行深度定制和优化。注意框架选型没有绝对的好坏关键是匹配团队技术栈和业务需求。如果团队以Python为主且需求相对简单LangChain也是一个优秀的选择如果追求极致的性能和可控性甚至可以考虑基于FastAPI或Spring AI自研轻量级框架。我们的选择是基于对长期维护和复杂流程编排的需求。2.3 合规引擎的核心工作流设计我们将审查流程设计为一个多阶段、可回溯的智能工作流文档解析与标准化阶段输入用户上传的PDF/Word格式招标文件。技能调用Doc_Parser_Skill使用PyMuPDF(PDF)或python-docx(Word)解析文档提取原始文本、字体、位置等元信息。Layout_Analysis_Skill基于规则和轻量级ML模型如用于表格识别的Camelot或Tabula识别文档的章节结构如第一章 招标公告、第二章 投标人须知、标题层级、表格、列表。这一步的输出是一棵结构化的“文档树”是后续所有分析的基础。输出结构化的文档对象包含章节、段落、表格及其层级关系。风险点扫描与提取阶段智能体调度智能体根据文档树按章节发起并行扫描任务。技能调用针对不同章节调度不同的扫描技能包。商务条款扫描包包含Qualification_Check_Skill检查资质要求是否超出常规或存在排他性、Payment_Term_Analysis_Skill分析付款比例、账期是否苛刻、Penalty_Clause_Extract_Skill提取违约金条款。技术条款扫描包包含Specification_Ambiguity_Check_Skill利用LLM分析技术参数描述是否存在模糊、歧义或指向特定品牌、Delivery_Timeline_Check_Skill检查交货期是否合理。法律合规扫描包包含Regulation_Keyword_Match_Skill基于关键词和规则匹配识别违反《招标投标法》等法规的明显条款。输出一个初步的“风险点”列表每个风险点包含原文位置、风险类型、初步描述。深度分析与报告生成阶段智能体调度智能体对初步风险点进行优先级排序和关联分析。技能调用LLM_Deep_Analysis_Skill对于复杂、需要上下文理解的风险点如一个看似公平但隐含倾向性的技术描述将相关段落和背景信息发送给大语言模型如GPT-4、文心一言等要求其进行合规性分析和改写建议。这里是AI能力与规则引擎的结合点。Historical_Case_Match_Skill将当前风险点与历史项目风险库进行匹配给出类似案例的处理结果和应对建议。Report_Generation_Skill将所有的风险点、分析结果、建议、原文引用整合成一份结构化的审查报告Markdown/Word/HTML格式。输出最终的合规审查报告。3. 核心技能Skills的设计与实现细节技能是引擎的“肌肉”其设计直接决定了系统的能力边界和可靠性。3.1 规则引擎技能 vs. LLM分析技能这是技能设计的核心哲学能用规则解决的绝不用LLM必须用LLM的要为其提供严格的上下文和输出约束。规则引擎技能确定性技能场景资质证书名称是否在允许清单内、投标保证金比例是否超过法定上限、关键日期格式是否正确等。实现通常基于正则表达式、关键词列表、决策树或简单的逻辑判断。例如def check_qualification(text, allowed_certs): # 从文本中提取所有疑似证书名称 found_certs extract_certificates(text) risky_certs [] for cert in found_certs: if cert not in allowed_certs: # 检查是否为“或同等效力”的模糊表述 if not has_equivalent_clause(text, cert): risky_certs.append(cert) return risky_certs优点速度快、结果100%确定、零成本、易于测试和维护。LLM分析技能非确定性技能场景评估技术方案描述中是否存在隐含的倾向性、判断某个服务要求是否过于模糊可能引发后续纠纷、对一段复杂的法律条款进行通俗化解释。实现关键在于设计高质量的System Prompt和结构化输出要求。def analyze_ambiguity_with_llm(paragraph, context): prompt f 你是一名资深的招投标专家。请分析以下招标文件段落判断其在技术或服务要求描述上是否存在模糊、歧义或可能产生争议的地方。 上下文章节标题{context} 待分析段落{paragraph} 请严格按照以下JSON格式输出 {{ risk_level: 高/中/低/无, ambiguity_description: 清晰描述模糊之处在哪里, potential_risk: 说明可能引发的具体风险, suggestion: 给出具体的条款修改建议 }} 只输出JSON不要有任何其他解释。 # 调用LLM API response call_llm_api(prompt) return parse_json_response(response)要点必须限制输出格式并通过上下文如章节标题约束LLM的分析范围防止其过度发散。3.2 文档解析技能的关键从“文本流”到“文档树”这是整个项目的基础也是最容易踩坑的地方。很多开源解析工具只能提取纯文本丢失了所有的结构信息。我们的Layout_Analysis_Skill采用了混合策略基于规则的头部分析利用字体大小、加粗、居中、编号模式如“1.1”、“2.3.4”来识别标题。基于机器学习的表格恢复使用Camelot或自定义训练的表格检测模型确保复杂表格能被正确提取为结构化数据如Pandas DataFrame而不是杂乱的文本。后处理与纠错建立章节标题的常见模式库如“投标人须知前附表”、“技术规格和要求”对识别结果进行校验和修正。最终生成一个包含id,level,title,content,parent_id等字段的文档树。这个树形结构是后续所有技能进行“定位”和“引用”的坐标系。实操心得不同招标方使用的文档模板差异巨大解析技能需要具备一定的鲁棒性。我们建立了一个“解析错误样本库”持续收集解析失败的案例用于迭代优化规则和模型。同时系统必须提供一个“解析结果预览”界面允许用户在关键步骤进行人工确认或微调这是人机协同的重要一环。3.3 历史案例匹配技能让引擎拥有“记忆”单纯的规则和LLM分析缺乏“经验”。我们开发了Historical_Case_Match_Skill其核心是一个向量数据库如ChromaDB或Milvus。数据准备将历史中标/废标项目的招标文件、识别出的风险点、专家的处理意见和最终结果整理成一条条“案例知识”。向量化使用文本嵌入模型如BGE或OpenAI的text-embedding-3将案例知识的核心描述转换为向量。检索当新文件识别出一个风险点时将该风险点描述向量化并在向量数据库中搜索最相似的Top-K个历史案例。呈现将相似案例的风险描述、应对策略和结果作为参考信息附加到审查报告中。例如“当前发现的‘要求提供特定年限的本地化服务团队证明’条款在2023年XX项目中同样出现我方当时通过提供总部资深工程师派遣计划本地合作伙伴支持函的方案成功化解。”这个技能极大地提升了引擎建议的实用性和说服力让AI从“照本宣科”走向“经验之谈”。4. 工程化落地实践从Demo到生产系统4.1 系统架构与部署我们将整个系统部署为微服务架构前端一个简单的Web界面用于文件上传、报告查看和解析结果预览。使用Vue.js开发。API网关使用Nginx负责路由、负载均衡和认证。核心引擎服务基于openJiuwen框架开发的智能体服务是无状态的服务可以水平扩展。它接收任务协调各个技能。技能服务集群每个或每组技能可以独立部署为一个微服务如parser-service,rule-check-service,llm-service。技能服务通过gRPC或REST与核心引擎通信。消息队列使用RabbitMQ或Kafka。文件上传后生成一个审查任务消息引擎消费消息并执行实现异步处理和削峰填谷。存储使用PostgreSQL存储任务元数据、报告结果和用户信息使用MinIO或阿里云OSS存储上传的原始文件和生成的报告使用向量数据库存储案例知识。缓存使用Redis缓存频繁访问的规则库、资质清单以及LLM API的响应在提示词完全相同时。4.2 性能优化与成本控制异步并行处理文档解析、各章节风险扫描等IO密集型或可独立运行的任务全部采用异步并行模式充分利用服务器资源将单次审查耗时从小时级降到分钟级。LLM调用优化提示词压缩在调用LLM进行深度分析前先对相关文本进行摘要或关键信息提取减少token消耗。分级调用策略对于简单分析使用成本更低的模型如GPT-3.5-Turbo仅对高风险或复杂条款才调用GPT-4等高级模型。缓存对常见、标准的条款分析结果进行缓存。技能懒加载与预热不常用的技能服务在空闲时可以被调度器缩容而在高峰期前进行预热。4.3 监控、日志与持续迭代一个生产系统必须可观测、可维护。监控使用Prometheus收集各项指标API响应时间、各技能执行耗时、LLM调用次数与token消耗、任务队列长度、系统错误率等。并配置Grafana看板。日志结构化日志JSON格式记录每一个任务的完整生命周期包括智能体的决策过程、每个技能的输入输出。使用ELKElasticsearch, Logstash, Kibana栈进行集中管理和检索。当用户对某条风险提示有疑问时我们可以通过任务ID快速定位到当时的完整分析链路。反馈闭环在报告界面设置“反馈”按钮业务专家可以标记“风险误判”、“漏报”或“建议有用”。这些反馈数据自动流入一个标注池用于定期评估技能效果和优化规则/提示词。5. 常见问题与实战避坑指南在实际开发和上线过程中我们遇到了诸多挑战以下是部分典型问题及解决方案。5.1 解析准确率问题问题对于扫描版PDF、图片嵌入的表格、特殊排版的文件解析技能出错率高导致后续分析全盘皆输。解决方案前置OCR集成PaddleOCR或Tesseract对扫描件进行OCR处理并将识别结果与原有解析路径融合。多解析器投票对于关键文件同时使用PyMuPDF、pdfplumber和商业解析服务如有进行解析对结果进行比对和投票选择置信度最高的或人工介入选择。提供人工修正入口在解析后提供一个可视化界面允许用户手动调整章节切分点、合并被错误拆分的段落。这个“人工修正”的结果会被记录用于反哺解析模型的训练。5.2 LLM的“幻觉”与稳定性问题LLM有时会“无中生有”编造一个文件中不存在的风险点或者对同一份文件多次审查的结果有轻微差异。解决方案强约束提示词如前所述使用严格的JSON输出格式并在提示词中反复强调“仅基于提供的文本进行分析”。引用溯源要求LLM在输出风险描述时必须注明引用的原文片段如“第X章第Y条”。在报告中将这些引用高亮显示方便用户核对。如果LLM无法提供具体引用则降低该条风险的置信度。多数投票与置信度对于高风险条款可以配置引擎调用LLM分析多次如3次取多数一致的结果并计算一个“置信度”分数附在报告上。建立“幻觉”黑名单将反复出现的、典型的幻觉表述加入一个过滤列表在结果后处理阶段进行过滤。5.3 规则库的维护与更新问题法规、公司政策、市场常规都在变化规则库容易过时。解决方案版本化管理对规则库资质清单、红线条款、关键词库进行Git版本控制任何修改都有记录、可回滚。定期评审机制建立月度评审会议由法务、商务、技术专家共同审议规则库的有效性根据最新项目反馈和法规变动进行更新。动态加载规则库以配置文件或数据库形式存储支持热更新无需重启服务。5.4 业务接受度与人机协同问题业务专家不信任AI的结果觉得它是“黑盒”或者担心自己被取代。解决方案定位为“辅助”而非“替代”始终强调引擎是“初级合规员”或“专家助手”它的作用是完成海量、重复的初步筛查将专家从繁琐劳动中解放出来专注于最高风险的决策。极致透明的可解释性报告中的每一条风险都必须清晰展示风险类型、原文定位、判断依据是触发了哪条规则还是LLM基于什么分析、参考案例。让专家一眼就能看懂引擎的“思考过程”。设计流畅的协同流程专家可以在报告上直接批注“此条忽略原因...”、“此条风险需升级讨论”这些批注会自动更新任务状态并反馈给引擎的学习系统。从通用Agent的概念到解决具体业务痛点的招标文件合规引擎这个过程充满了工程上的权衡与细节上的打磨。最大的体会是AI项目的成功技术只占一半另一半在于对业务场景的深度理解、对生产环境复杂性的敬畏以及设计出良好的人机协同模式。我们的引擎上线后将单份文件的初步审查时间从平均4-6人时缩短到了10分钟以内风险漏报率低于5%已经成为业务团队不可或缺的“第一道防线”。未来我们计划将技能扩展到投标文件撰写辅助、竞争对手分析等更多环节让这个“数字专家”在招投标的全链条中发挥更大价值。

相关新闻

企业AI落地指南:从工具到生产力的关键路径

企业AI落地指南:从工具到生产力的关键路径

在过去的两年时间里, 企业级人工智能应用由概念验证阶段迅速踏入实际生产环境。《人工智能发展报告》由中国信息通信研究院于2025年发布 , 该报告表明 , 截止到2024年底 , 已有国内42.7%的规模以上企业把AI技术融入了至少一项核心业务流程 , 相较于2022年 , 这一比例提升了将近…

2026/10/15 17:09:59 阅读更多 →
Spring Boot 3 结合 Redis Lua 实现分布式批量数据导入内存配额控制

Spring Boot 3 结合 Redis Lua 实现分布式批量数据导入内存配额控制

Spring Boot 3 结合 Redis Lua 实现分布式批量数据导入内存配额控制 问题背景 在企业级业务中,用户、订单、商品等数据的批量导入是常见需求,通常基于 EasyExcel、OpenCSV 等工具实现 Excel/CSV 文件的解析。当导入文件行数超过 10 万、或分布式集群多实…

2026/10/16 8:01:34 阅读更多 →
图片审核策略调优实战:从误判诊断到闭环迭代的工程实践

图片审核策略调优实战:从误判诊断到闭环迭代的工程实践

1. 项目概述:从“误判”到“精准”的审核策略调优实战图片审核这事儿,干过的都知道,它就像个“薛定谔的猫”——你永远不知道下一张图会被系统判定成什么。明明是一张普通的风景照,可能因为光影对比强烈,被误判为“低俗…

2026/10/16 6:53:54 阅读更多 →

最新新闻

TDH Workflow 工作流调度实战:从设计原理到生产落地

TDH Workflow 工作流调度实战:从设计原理到生产落地

1. 从一个调度需求说起:为什么需要 Workflow第一次接触 TDH 里的 Workflow,是因为一个很具体的需求:每天凌晨要跑一批数据处理任务,任务之间有明确的先后依赖,前一个跑完才能跑下一个,中间任何一个环节失败…

2026/10/16 17:53:21 阅读更多 →
交换机能带多少主机?接口不够怎么办?从端口规划到扩展方案全解析

交换机能带多少主机?接口不够怎么办?从端口规划到扩展方案全解析

机房网络改造这件事,我前前后后摸爬滚打了好些年。今天聊的这个话题,几乎每个搞过机房或办公网络的人都会遇到: 一台交换机到底能接多少台主机,口不够了又该怎么办 。这个问题看起来平平无奇,但真到了现场&#xff0…

2026/10/16 17:53:21 阅读更多 →
.NET 8.0下FastReport报表打印:许可证注册与水印清除指南

.NET 8.0下FastReport报表打印:许可证注册与水印清除指南

简介:.NET 8.0 环境下基于 FastReport 实现无水印报表打印与设计的完整示例包,主要面向使用 WinForms 开发桌面报表功能的程序员,解决在高版本 .NET 中集成 FastReport 时遇到的授权限制与方案搭建问题。包内含一个可直接运行的 WinForms 项目…

2026/10/16 17:53:21 阅读更多 →
SSM企业官网源码包实战:从环境搭建到二次开发避坑指南

SSM企业官网源码包实战:从环境搭建到二次开发避坑指南

简介:这份资源是一套基于SSM(Spring、SpringMVC、Mybatis)框架开发的Java企业官网源代码,面向具备Java Web基础、希望学习或二次开发企业级门户网站的开发者与在校学生。项目整合MySQL数据库与JSP视图技术,包含前台门户…

2026/10/16 17:53:21 阅读更多 →
DeepSeek本地部署全指南:工具选型、硬件配置与避坑实践

DeepSeek本地部署全指南:工具选型、硬件配置与避坑实践

简介:这是一份面向具备一定AI技术基础开发者的DeepSeek本地部署实操指南,适用于希望将先进开源模型应用于个人项目、工作场景或进行深度研究的技术人员。文档以Ollama、LM Studio、Jan三种主流部署工具为主线,从硬件最低配置到推荐配置、操作…

2026/10/16 17:53:21 阅读更多 →
STM32+MPU6050姿态解算源码详解:I2C通信与DMP固件实战

STM32+MPU6050姿态解算源码详解:I2C通信与DMP固件实战

简介:面向嵌入式入门与进阶开发者,一套基于STM32F103C8T6与MPU6050的Keil完整工程可直接编译下载使用。工程自带标准外设库源码与头文件,并配套完整示例与说明文档,覆盖I2C读取MPU6050原始数据、姿态解算、串口输出及定时器、ADC、…

2026/10/16 17:52:20 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →