instructor 文档维护脚本全解析:从 Markdown 清理到 AI 驱动的 Sitemap 生成

发布时间:2026/9/15 13:22:35

instructor 文档维护脚本全解析:从 Markdown 清理到 AI 驱动的 Sitemap 生成 instructor 文档维护脚本全解析从 Markdown 清理到 AI 驱动的 Sitemap 生成【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructor本文以 instructor 开源仓库中的 scripts/README.md 为核心脉络系统讲解仓库scripts/目录下 6 个文档维护工具的设计意图、命令行用法与源码实现。这些脚本服务于 instructor 项目自身文档的日常维护——包括 Markdown 特殊字符清理、博客摘要标签校验、AI 辅助的 Sitemap 生成以及围绕from_provider新 API 的旧代码模式迁移。读完本文你将掌握这套文档质量保障流水线的完整操作方式并能将其中的审计、清理与重构思路复用到自己的项目中。脚本目录概览scripts/目录存放用于维护和改善 instructor 文档与项目结构的工具脚本覆盖清理—校验—生成—审计—修复五个环节脚本类别核心职责make_clean.py清理移除 Markdown 中的特殊空白字符将破折号统一为普通连字符check_blog_excerpts.py校验检查所有博客文章是否包含!-- more --摘要标签make_sitemap.py生成借助 GPT-4o-mini 生成带摘要、关键词与交叉链接的增强版sitemap.yamlfix_api_calls.py修复将client.chat.completions.create等旧调用统一为client.createfix_old_patterns.py修复将instructor.from_openai(...)/instructor.patch(...)迁移到from_provideraudit_patterns.py审计扫描文档中残留的旧 API 模式、旧初始化模式与疑似未使用的导入下文按 README 的组织顺序逐一展开并结合各自源码补充实现细节。1. make_clean.pyMarkdown 文件清理器用途清理 Markdown 文件中特殊的空白字符并将 em dash—替换为普通连字符-。清理逻辑的源码实现查看 make_clean.py 的clean_markdown_content函数可以看清它做了四件事将—em dash与–en dash全部替换为-对每一行调用unicodedata.normalize(NFKC, line)进行 Unicode 规范化统一码位表示用正则[\u200B\u200C\u200D\uFEFF]移除零宽空格ZWSP、零宽非连接符、零宽连接符与 BOM 字符将不换行空格\u00a0替换为普通空格并执行rstrip()去掉行尾空白。整个流程逐行处理、保留行内缩进因此保留有意的排版格式与清理问题字符两者兼得。文件读写均显式指定encodingutf-8统计输出会报告处理的文件总数与被修改文件数make_clean.py。命令行用法# 清理 docs/ 下所有 markdown 文件 python scripts/make_clean.py # 试运行预览将要发生的修改不会真正写入文件 python scripts/make_clean.py --dry-run # 清理其他目录 python scripts/make_clean.py --docs-dir path/to/docs--dry-run模式除了打印Would modify: file外还会对每个将修改的文件展示首处差异的原始行与清理后行使用repr输出便于看清不可见字符非常适合提交前核对make_clean.py。Pre-commit 集成README 说明该脚本在包含docs/目录下 Markdown 文件的提交中会自动运行。当前仓库的 .pre-commit-config.yaml 主要配置了 Rufflint format、uv.lock校验、ty类型检查等 hooks脚本的 hook 配置遵循同一套 pre-commit 机制脚本本身通过sys.exit(0 if success else 1)约定退出码check_blog_excerpts.py这正是 pre-commit 判断通过/失败的依据。2. check_blog_excerpts.py博客摘要校验器用途确保docs/blog/posts/下每篇博客文章都包含!-- more --标签用于站点摘要的正确截断。工作方式脚本递归扫描博客目录中的所有.md文件检查内容是否包含!-- more --字符串缺失该标签的文件会被逐个列出并最终导致脚本以退出码 1 结束check_blog_excerpts.py# 检查所有博客文章 python scripts/check_blog_excerpts.py # 检查其他目录 python scripts/check_blog_excerpts.py --blog-posts-dir path/to/posts由于 pre-commit 钩子以非零退出码判定失败该脚本天然适合接入提交前检查一旦新增博客忘记写摘要分隔符提交即被拦截。该目录下目前已有 60 篇博客文章docs/blog/posts/手工检查显然不可行这正是脚本的价值所在。3. make_sitemap.pyAI 增强的文档 Sitemap 生成器用途遍历docs/目录借助 OpenAI GPT-4o-mini 分析每个 Markdown 文件生成包含摘要、关键词、主题、引用与交叉链接建议的sitemap.yaml。工作流程结合 make_sitemap.py 源码其核心流水线为遍历traverse_docs递归收集所有.md文件并为每个文件计算 MD5 内容哈希make_sitemap.py链接提取extract_markdown_links用正则\[([^\]])\]\(([^)])\)提取文档内链过滤外部链接与锚点目录引用自动补index.mdnormalize_path再把相对路径换算为相对docs/根目录的统一路径make_sitemap.pyAI 分析analyze_content调用gpt-4o-mini要求模型按SUMMARY:/KEYWORDS:/TOPICS:/REFERENCES:四个固定字段返回结构化结果make_sitemap.py写出最终以yaml.dump(..., default_flow_styleFalse, sort_keysTrue)写入指定输出文件make_sitemap.py。仓库根目录的 sitemap.yaml 即为该脚本的产物例如architecture.md: ai_references: [] cross_links: [] hash: 141a2c4c63d93091402d5bf4e39b04f8 keywords: - Instructor - LLM providers - Pydantic Model - Schema Converter - API Request - Response Parser - Validator - Retry Mechanism references: [] summary: The Instructor Architecture document elucidates the internal workings of... topics: - Core Components - Request Flow - Data Validation - LLM Integration - Structured Output输出结构每个文件条目包含以下字段即 README 给出的骨架file.md: summary: Brief description of the content keywords: [keyword1, keyword2, keyword3] topics: [topic1, topic2, topic3] references: [other-file.md, another-file.md] ai_references: [ai-detected-reference.md] cross_links: [suggested-related-file.md] hash: content-hash-for-caching其中references来自正则提取的确定性结果ai_references来自 LLM 对文本中提及页面的识别cross_links则基于内容相似度给出的相关文档建议。缓存、并发与重试缓存已有 sitemap 中hash与当前文件内容哈希一致时直接复用既有分析结果仅重算references避免重复调用 APImake_sitemap.py并发使用asyncio.Semaphore(max_concurrency)限制同时进行的分析请求配合as_completed边完成边推进进度条make_sitemap.py重试通过tenacity装饰器配置最多尝试 3 次、指数退避等待min4s, max10s并在每次重试前打印提示make_sitemap.py单文件多次失败时降级为占位摘要不影响整体流程。命令行用法与依赖# 默认设置生成 sitemap根目录 docs输出 sitemap.yaml python scripts/make_sitemap.py # 自定义参数并发数 10、相似度阈值 0.4 python scripts/make_sitemap.py \ --root-dir docs \ --output-file sitemap.yaml \ --max-concurrency 10 \ --min-similarity 0.4 # 使用自定义 API Key python scripts/make_sitemap.py --api-key your-openai-key要求OpenAI API Key通过OPENAI_API_KEY环境变量或--api-key传入依赖openai、typer、rich、tenacity、pyyamluv add openai typer rich tenacity pyyaml4. fix_api_calls.pyAPI 调用模式标准化用途把文档与 notebook 中冗长的旧 API 调用替换为简化版本共四组映射fix_api_calls.py旧模式新模式client.chat.completions.create(...)client.create(...)client.chat.completions.create_partial(...)client.create_partial(...)client.chat.completions.create_iterable(...)client.create_iterable(...)client.chat.completions.create_with_completion(...)client.create_with_completion(...)注意源码中模式匹配顺序刻意将create_with_completion放在最前避免长匹配被create的短正则提前命中截断。脚本会递归处理docs/下所有.md与.ipynb文件notebook 中的代码单元同样适用并输出处理的文件数 / 修改的文件数 / 替换总数汇总# 试运行查看将被修改的文件与替换数 python scripts/fix_api_calls.py --dry-run # 实际应用修改 python scripts/fix_api_calls.py # 只处理单个文件 python scripts/fix_api_calls.py --file docs/index.md # 指定自定义文档目录 python scripts/fix_api_calls.py --docs-dir path/to/docs5. fix_old_patterns.py客户端初始化模式迁移到 from_provider用途将旧式客户端初始化写法统一迁移为 instructor 现代统一的from_providerAPIinstructor/v2/auto_client.py 中定义instructor.from_openai(OpenAI())→instructor.from_provider(openai/model-name)instructor.from_anthropic(Anthropic())→instructor.from_provider(anthropic/model-name)instructor.patch(OpenAI())→instructor.from_provider(openai/model-name)覆盖的 Provider 映射源码中的PROVIDER_MAPPING表fix_old_patterns.py覆盖 25 个 provideropenai、anthropic、google、cohere、mistral、groq、litellm、ollama、azure、bedrock、vertex、genai归一为google、deepseek、fireworks、cerebras、together、anyscale、perplexity、writer、openrouter、sambanova、truefoundry、cortex、databricks、xai。这与 docs/integrations/ 目录中维护的接入指南一一对应。模型名提取策略脚本会尽力从上下文匹配位置前后各 200 字符中提取model...参数提取不到时回退到各 provider 的默认模型如 OpenAI 默认gpt-4o、Anthropic 默认claude-3-5-sonnet-20241022并明确提示默认模型可能需要人工复核fix_old_patterns.py。instructor.patch(...)场景则由类名反查 provider如GoogleGenerativeAI→google、VertexAI→vertexfix_old_patterns.py。命令行用法# 试运行 python scripts/fix_old_patterns.py --dry-run # 应用修改 python scripts/fix_old_patterns.py # 处理单个文件 python scripts/fix_old_patterns.py --file docs/integrations/openai.md注意模型名尽量从现有代码提取但准确性仍需人工复核。from_provider的统一用法可参考 docs/concepts/from_provider.md。6. audit_patterns.py旧模式审计用途只读扫描找出文档中需要更新的旧模式区别于会改文件的修复脚本。三类检查audit_patterns.py旧 API 调用client.chat.completions.create/create_partial/create_iterable/create_with_completion旧初始化模式instructor.from_*、instructor.patch疑似未使用导入当文档已使用from_provider时标记仅出现一次的import openai/import anthropic等导入行如导入后不再使用即为可清理项。命令行用法# 详细报告按文件列出问题与行号 python scripts/audit_patterns.py # 仅输出汇总统计每类模式的总出现次数 python scripts/audit_patterns.py --summary # 审计单个文件 python scripts/audit_patterns.py --file docs/index.md # 自定义文档目录 python scripts/audit_patterns.py --docs-dir path/to/docs详细模式下每个问题的行号会先显示前 10 个超出部分以... (N total)折叠audit_patterns.py。典型工作流是先audit_patterns.py摸清存量再用fix_api_calls.py/fix_old_patterns.py定点修复最后复查确认清零。Pre-commit 集成与手动运行README 规定make_clean.py与check_blog_excerpts.py面向含 Markdown 提交与含博客文件提交的自动检查场景hook 通过.pre-commit-config.yaml声明当前仓库的 .pre-commit-config.yaml 中实际启用了 Ruff、uv.lock一致性检查、依赖同步检查、requirements.txt导出与ty类型检查等 hooks共同构成提交前的质量闸门。日常使用中也可以手动执行任意脚本完成一次性操作# 预览 markdown 清理效果 python scripts/make_clean.py --dry-run # 检查博客摘要标签 python scripts/check_blog_excerpts.py # 重新生成 sitemap python scripts/make_sitemap.py新增脚本的规范README 为向scripts/添加新工具制定了五条约定这也是审计现有脚本的共同特征文档化在 scripts/README.md 中补充脚本用途与用法说明Pre-commit 集成如适合自动化在.pre-commit-config.yaml中注册 hook退出码约定脚本以适当的错误码退出如check_blog_excerpts.py的0/1供 CI/钩子判定帮助文本命令行脚本提供--help功能各脚本均基于argparse或typer实现测试提交前手动验证脚本行为。依赖与故障排查大部分脚本仅依赖 Python 标准库argparse、re、pathlib、unicodedata等仅make_sitemap.py需要额外依赖上文已给出uv add命令。Pre-commit 钩子失败时确认脚本可执行chmod x scripts/*.py核对.pre-commit-config.yaml中的脚本路径先手动运行脚本定位具体错误。Sitemap 生成异常时确认 OpenAI API Key 已正确设置环境变量或--api-key检查到 API 的网络连通性逐文件查看报错信息——脚本本身已对单文件失败做了重试与降级兜底。Markdown 清理异常时先用--dry-run预览改动检查 docs 目录下文件权限确认 Markdown 文件为 UTF-8 编码。这套工具链体现了文档维护的工程化思路用确定性脚本保证格式一致性用 AI 能力自动生成 SEO 元数据与交叉链接再用审计脚本兜底代码模式迁移。理解其设计后你可以按同样的清理 → 校验 → 生成 → 审计 → 修复循环来管理任何规模的文档仓库。【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/15 13:22:35

鸿蒙+Flutter混合应用崩溃卡顿发热排查指南

1. 这不是“报错日志堆砌”,而是鸿蒙Flutter混合应用的健康体检指南你刚把Flutter项目跑上鸿蒙设备,界面一闪就黑屏;或者滑动列表三秒后手机发烫到不敢握;又或者App在后台待了十分钟,再切回来直接卡死在启动页——这时…

2026/9/15 13:22:35

WinBoat 中文显示修复指南:Windows 应用字体渲染配置

WinBoat 中文显示修复指南:Windows 应用字体渲染配置 【免费下载链接】winboat Run Windows apps on 🐧 Linux with ✨ seamless integration 项目地址: https://gitcode.com/GitHub_Trending/wi/winboat WinBoat 把 Windows 应用装进 Docker/Pod…

2026/9/15 13:37:36

ENVI 5.3.1实战:Landsat 8辐射定标与FLAASH大气校正全流程

用ENVI 5.3.1做Landsat 8影像的辐射定标和大气校正,是每个搞遥感的人最早接触的一整套预处理流水线。不管你后面是要算植被指数、反演地表温度,还是做土地利用分类,这一步绕不过去。今天我把完整的实例操作、参数设置、容易踩的坑从头到尾捋一…

2026/9/15 13:37:36

Halcon与C#联合编程:基于Blob分析的硬币识别系统实战

手里的几枚硬币混在一起,想用代码识别出面值并自动统计总额,这大概是很多接触机器视觉的入门者都动过的心思。我自己当初也是从“Halcon和C#联合编程”这个组合开始做视觉项目的,核心流程很简单:Halcon负责图像处理和特征分析&…

2026/9/15 13:37:36

ecstore 电商项目从零搭建:PHP 环境、伪静态与上线避坑

“从零搭建 ecstore 电商项目”这个事儿,我在过去几年里前前后后干了不下十次,踩过的坑比很多新手看过的教程都多。这系统是老牌开源商城,功能底子厚实,但正因为老,它对环境、对操作顺序、对某些“约定俗成”的细节特别…

2026/9/15 13:37:36

OpenGL PBO异步回读:解决glReadPixels卡顿的实战指南

先说结论:如果你在用 OpenGL 做渲染,同时又需要把 GPU 生成的像素数据拿回 CPU 侧处理,比如截图、视频编码、离屏渲染回读、OpenCV 取帧,那我强烈建议你把 PBO 异步回读当成标配。这个技术不是炫技,是实打实把帧率救回…

2026/9/15 13:32:36

微信小游戏全生命周期实战:从Unity打包到云端运维与降本

这些年做微信小游戏,我最大的感受是:能做出一个跑得起来的 Demo 不难,真正难的是让它一直跑得稳、跑得省、跑得久。从 Unity 里廉几刀出一个包,到微信开发者工具里预览、真机调试,再后端上云、上线、拉新、冲榜、守活动…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码