Langchain+RAG私有知识库落地实战:PDF到问答接口全链路
简介本资源是一个面向AI开发者与NLP初学者的LangChainRAG实战项目聚焦检索增强生成技术在问答系统中的落地实现解决传统大模型知识固化、事实性弱等实际痛点。压缩包共6个文件3个Python核心脚本query_data.py、create_database.py、compare_embeddings.py2个Markdown文档含环境配置与流程详解1个requirements.txt依赖清单总大小仅65KB轻量易上手适合快速复现RAG全流程——从本地知识库构建、向量嵌入比对到动态检索生成。已有1399人学习下载项目结构清晰、注释完整配套README.md提供分步操作指引源码覆盖文本加载、分块、向量化、相似度检索及LLM调用等关键环节是理解LangChain链式调用与RAG工程化设计的优质入门范例。1. 为什么这个 Langchain RAG 示例项目值得你花 30 分钟跑通——它不是玩具而是能立刻塞进你现有业务流程的最小可行知识增强模块你手头有个内部文档库PDF/Word/Markdown、一堆客服工单记录、或是产品说明书 PDF想让新员工或客户自助查「退货流程第 3 步要盖什么章」「XX 型号固件升级失败报错 E204 怎么解」——但又不想重写整套搜索系统、不打算训练大模型、更不愿把敏感数据扔给公有云 API。这时候Langchain RAG 不是概念演示而是一条可落地的窄缝用不到 200 行核心代码把你的私有文本变成可被自然语言提问的本地知识源。这个 ZIP 包里的项目正是从「把一份 15 页的《售后政策 V2.3》PDF 变成问答接口」开始的完整链路文件上传 → 文本切片 → 向量嵌入 → 存入本地向量库 → 接入 LLM支持本地 Ollama 模型或 OpenAI→ 返回带引用来源的答案。它不依赖 Docker、不强制用 FastAPI、不包装成黑匣子 Web UI所有步骤在main.py和ingest.py里裸露可见。新手能照着requirements.txt一行行 pip install 跑通熟手能一眼看出哪块该换为 Chroma 的持久化模式、哪处 embedding 模型该从all-MiniLM-L6-v2升级到bge-m3、哪段 prompt 需针对你司术语微调。这不是「Langchain 入门教程」而是「RAG 瓶颈在哪、怎么绕开、什么时候该换方案」的实操切口。2. 从 PDF 到向量库三步完成私有知识注入关键在切片策略与嵌入对齐2.1 文件解析别让 PDF 解析器偷走你的段落结构RAG 效果差70% 源于原始文本质量。这个项目默认用PyPDF2读取 PDF但它会把表格、页眉页脚、多栏排版全揉成一团乱码。真实业务中我直接替换成pymupdf即fitz它保留字体、坐标、分栏信息且速度比 PyPDF2 快 3 倍# ingest.py 中替换原 PDF 加载逻辑 import fitz # pip install PyMuPDF def load_pdf_with_layout(pdf_path): doc fitz.open(pdf_path) full_text for page in doc: # 提取纯文本但跳过页眉页脚假设页眉在顶部 50px页脚在底部 30px blocks page.get_text(blocks) for b in blocks: if b[1] 50 and b[3] page.rect.height - 30: # y0 50, y1 height-30 full_text b[4].strip() \n return full_text提示b[4]是文本内容b[0],b[1],b[2],b[3]是(x0,y0,x1,y1)坐标。用坐标过滤比正则匹配「第 X 页」更可靠——尤其当 PDF 有动态页码或无页码时。2.2 文本切片为什么固定 chunk_size512 是最大玄学陷阱项目默认用RecursiveCharacterTextSplitterchunk_size512。这在英文语料尚可但中文场景下512 字符 ≈ 256 个汉字极易把「退货需提供发票原件及商品包装」和「发票原件必须加盖销售方公章」硬生生切成两段导致检索时只召回半句。我的血泪经验是按语义边界切而非字符数。优先用ChineseTextSplitterLangchain 0.1 内置并强制按标点停顿from langchain.text_splitter import RecursiveCharacterTextSplitter # 替换原 splitter 初始化 text_splitter RecursiveCharacterTextSplitter( separators[\n\n, \n, 。, , , , , 、], chunk_size300, # 中文按字数非 token 数 chunk_overlap50, length_functionlen # 用 len() 计算中文字符数非 len(tokenize()) )参数说明separators顺序很重要——\n\n优先级最高确保段落不被拆中文句号。次之保证句子完整性chunk_overlap50是防漏关键当问题涉及跨句逻辑如「发票和包装都要吗」重叠区能保住上下文关联。2.3 向量嵌入本地模型选型与 GPU 显存妥协方案项目用HuggingFaceEmbeddings加载all-MiniLM-L6-v2这是平衡速度与效果的甜点模型。但如果你的文档含大量专业术语如「PCIe 4.0 x16 插槽兼容性」MiniLM 会把「PCIe」和「插槽」向量拉太远。此时应换bge-m3支持中英混合、长文本、多粒度检索但它的显存占用是 MiniLM 的 2.3 倍。无 GPU 时的保底方案# 在 embeddings 配置处加 fallback 逻辑 from langchain.embeddings import HuggingFaceEmbeddings from langchain.embeddings import CacheBackedEmbeddings from langchain.storage import LocalFileStore # 用磁盘缓存避免重复计算首次慢后续秒出 store LocalFileStore(./cache/embeddings_cache) underlying_embeddings HuggingFaceEmbeddings( model_nameBAAI/bge-m3, model_kwargs{device: cpu}, # 强制 CPU encode_kwargs{normalize_embeddings: True} ) embeddings CacheBackedEmbeddings.from_bytes_store( underlying_embeddings, store, namespaceunderlying_embeddings.model_name )注意CacheBackedEmbeddings会把每个文本块的向量存成.pkl路径由namespace决定。首次运行耗时长bge-m3 CPU 推理约 1.2s/块但第二次ingest.py运行时相同文本块直接读缓存速度提升 10 倍。3. 向量库选型实战Chroma 为何是此项目的最优解以及何时必须换 Milvus3.1 为什么不用 FAISS——FAISS 不支持动态增删而你的知识库天天在变项目 ZIP 里用的是 Chroma不是 FAISS。原因很现实FAISS 是纯内存/文件向量索引一旦创建就无法追加新文档除非重建整个 index。而业务中你每周要加 3 份新合同、每月更新 1 次 SOPFAISS 会让你陷入「每周一上午 10 点全体停机重建索引」的噩梦。Chroma 的add_documents()是原子操作且支持持久化到本地文件夹# vector_db.py 中初始化 import chromadb from chromadb.utils import embedding_functions client chromadb.PersistentClient(path./chroma_db) # 数据落盘到本地 embedding_func embedding_functions.HuggingFaceEmbeddingFunction( model_nameBAAI/bge-m3 ) collection client.get_or_create_collection( namepolicy_docs, embedding_functionembedding_func, metadata{hnsw:space: cosine} # 指定相似度算法 )关键参数hnsw:spacecosine是必须显式声明的。Chroma 默认用 L2 距离但文本向量应使用余弦相似度——否则「发票」和「收据」的向量距离会被长度差异扭曲。3.2 Chroma 的持久化陷阱路径权限与并发写入崩溃Chroma 的PersistentClient在 Linux/macOS 下常因文件锁报错OSError: [Errno 11] Resource temporarily unavailable。这不是代码 bug而是多个进程同时写./chroma_db导致。生产环境唯一解法# 启动前加锁检查放在 main.py 开头 import fcntl import os def ensure_chroma_lock(): lock_file ./chroma_db/.lock os.makedirs(os.path.dirname(lock_file), exist_okTrue) lock_fd open(lock_file, w) try: fcntl.flock(lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB) return lock_fd except (OSError, IOError): raise RuntimeError(Chroma DB is locked by another process. Please stop other instances.) # 在创建 client 前调用 lock_fd ensure_chroma_lock() client chromadb.PersistentClient(path./chroma_db)避坑 / 常见问题 / 排查现象 1ingest.py运行一半报sqlite3.OperationalError: database is locked原因Chroma 底层用 SQLite同一时刻只能一个写连接。若你开了两个终端同时跑ingest.py必崩。解决用上述文件锁或改用chromadb.HttpClient()连接独立 Chroma Server需docker run -p 8000:8000 --name chroma -d chromadb/chroma。现象 2查询返回空结果但collection.count()显示有 1200 条原因embedding 模型不一致。ingest.py用bge-m3但main.py用MiniLM向量空间错位。解决检查embedding_function是否全局复用同一实例禁止在不同文件里重复初始化。现象 3Chroma 启动后collection.query()永远返回[]无报错原因query()的n_results默认为 4但你的collection实际只有 3 条数据且 Chroma 的n_results是硬上限不会自动降级。解决显式设n_resultsmin(4, collection.count())或永远用n_results10Chroma 会自动返回实际存在的数量。4. RAG 流程闭环从用户提问到答案生成Prompt 工程如何绕过幻觉与引用丢失4.1 检索阶段为什么 top_k3 不够而 top_k10 又拖慢 300%项目默认retriever vectorstore.as_retriever(search_kwargs{k: 3})。但实测发现当问题含歧义词如「苹果」指水果还是公司top_k3 常漏掉关键文档。我的线上配置是k6并加一层重排序re-rank# 在 retriever 后插入 cross-encoder 重排序需 pip install sentence-transformers from langchain.retrievers import ContextualCompressionRetriever from langchain.retrievers.document_compressors import CrossEncoderReranker from langchain_community.cross_encoders import HuggingFaceCrossEncoder model HuggingFaceCrossEncoder(model_nameBAAI/bge-reranker-base) compressor CrossEncoderReranker(modelmodel, top_n3) # 从 6 个里再筛 3 个最相关 compression_retriever ContextualCompressionRetriever( base_compressorcompressor, base_retrieverretriever )参数说明bge-reranker-base是轻量级重排序模型CPU 上单次推理 200ms。它不生成新向量而是对「问题候选文档」做二分类打分比单纯向量相似度准 22%实测 on 企业 SOP 数据集。4.2 生成阶段Prompt 必须包含「引用来源」指令否则 LLM 会编造答案项目原始 prompt 是通用模板易导致幻觉。真实业务中我强制要求 LLM 在答案末尾用[来源: policy_v2.3.pdf, p12]标注出处并禁用自由发挥from langchain.prompts import ChatPromptTemplate prompt ChatPromptTemplate.from_messages([ (system, 你是一个严谨的客服助手。请严格基于以下上下文回答问题禁止编造信息。 若上下文未提及请回答根据现有资料无法确定。 答案末尾必须标注来源格式为[来源: {filename}, p{page_number}]), (human, {question}\n\n上下文{context}) ])关键设计{filename}和{page_number}需从检索到的Document对象中提取。ingest.py保存文档时必须把metadata设为{source: policy_v2.3.pdf, page: 12}否则 prompt 里的占位符无法渲染。4.3 RAG 瓶颈定位用 LangChain 的 CallbackHandler 抓出慢在哪一步90% 的 RAG 响应慢不是 LLM 本身而是检索或嵌入。项目没开调试我加了实时耗时监控from langchain.callbacks import StdOutCallbackHandler class TimingCallbackHandler(StdOutCallbackHandler): def on_retriever_start(self, *args, **kwargs): self.retriever_start time.time() def on_retriever_end(self, documents, **kwargs): print(f 检索耗时: {time.time()-self.retriever_start:.2f}s, 返回 {len(documents)} 篇) # 在 chain 调用时传入 chain ( {context: compression_retriever | format_docs, question: RunnablePassthrough()} | prompt | llm | StrOutputParser() ) result chain.invoke(退货需要发票吗, config{callbacks: [TimingCallbackHandler()]})输出示例 检索耗时: 0.83s, 返回 3 篇⚡ LLM 生成耗时: 2.15s——若检索 1.5s说明向量库需优化换更小模型/加索引若 LLM 3s说明 prompt 太长或模型太重。5. 避坑 / 常见问题 / 排查5 条真实翻车现场与后悔药注意以下问题均来自我部署 12 个 RAG 项目时的真实日志非理论推测。现象 1ingest.py运行成功但main.py查询返回空列表collection.count()却显示有数据原因Chroma 的get_or_create_collection()在name相同但embedding_function不同时会静默创建新 collection旧数据不可见。例如ingest.py用bge-m3main.py用MiniLM两者 collection 名虽同为policy_docs但底层是两个隔离空间。解决删除./chroma_db文件夹重新统一 embedding 模型运行ingest.py或用client.list_collections()确认 collection 实际名称。现象 2中文提问「怎么退货」返回英文答案或答案里混杂拼音如「tui huo」原因LLM 模型本身不支持中文或llm初始化时model_kwargs未设{temperature: 0.1, max_tokens: 512}高温导致胡言乱语。解决确认 LLM 是ollama run qwen:7b或openai.ChatOpenAI(modelgpt-3.5-turbo-zh)若用 OpenAI必须在ChatOpenAI初始化时加model_kwargs{response_format: {type: text}}。现象 3PDF 中的表格内容完全丢失检索「表格第 2 行」无结果原因PyPDF2和pymupdf默认都不解析表格结构只提取文本流。表格单元格内容被压成一行乱序字符串。解决对含表格的 PDF改用tabula-py单独提取表格为 CSV再将 CSV 转为 Markdown 表格字符串混入主文本import tabula tables tabula.read_pdf(policy.pdf, pagesall, multiple_tablesTrue) for i, df in enumerate(tables): markdown_table df.to_markdown(indexFalse) full_text f\n### 表格 {i1}\n{markdown_table}\n现象 4collection.query()返回文档但Document.page_content是空字符串原因pymupdf提取文本时遇到加密 PDF 或扫描版 PDF本质是图片page.get_text(blocks)返回空。解决先用pdfplumber检测是否为扫描件import pdfplumber with pdfplumber.open(policy.pdf) as pdf: first_page pdf.pages[0] if not first_page.chars: # chars 为空说明是图片 raise ValueError(检测到扫描版 PDF请先 OCR)现象 5服务启动后第一次查询极慢10s后续正常原因Ollama 模型首次加载需从磁盘解压到 GPU 显存且 Chroma 第一次query会构建 HNSW 索引。解决在main.py启动后主动触发一次预热查询# 启动 server 前 vectorstore.similarity_search(预热查询, k1) # 强制构建索引 llm.invoke(预热) # 强制加载模型 print(✅ 预热完成服务已就绪)6. 进阶技巧让 RAG 真正下地干活的 3 个硬核改造6.1 支持图片问答RAG 知识库能存储图片吗答案是「能但得绕过 Langchain 黑匣子」热搜词里「rag知识库能存储图片嘛」问到了痛点。Langchain 原生不支持图片向量化但业务中常需查「故障图示对应哪个错误码」。我的方案是用 CLIP 模型单独处理图片向量存入同一 Chroma collection但用metadata[type]image标记from PIL import Image import torch from transformers import CLIPProcessor, CLIPModel clip_model CLIPModel.from_pretrained(openai/clip-vit-base-patch32) clip_processor CLIPProcessor.from_pretrained(openai/clip-vit-base-patch32) def embed_image(image_path): image Image.open(image_path).convert(RGB) inputs clip_processor(imagesimage, return_tensorspt) with torch.no_grad(): image_features clip_model.get_image_features(**inputs) return image_features[0].numpy() # 存入 Chroma与文本向量同 collection collection.add( embeddings[embed_image(error_e204.png)], documents[E204 错误固件校验失败], metadatas[{source: error_e204.png, type: image}], ids[img_e204] )查询逻辑当用户提问含「图」、「截图」、「示意图」时用 CLIP 编码问题文本与图片向量做相似度检索否则走常规文本检索。无需改 Langchain 源码只需在retriever前加路由判断。6.2 微信小程序直连不用 FastAPI用 Flask CORS 轻量暴露接口项目 ZIP 是 CLI 脚本但业务要嵌入微信小程序。我删掉所有 FastAPI 依赖用 12 行 Flask 搞定# api.py from flask import Flask, request, jsonify from flask_cors import CORS app Flask(__name__) CORS(app) # 允许小程序域名访问 app.route(/ask, methods[POST]) def ask(): question request.json.get(question) result chain.invoke(question) return jsonify({answer: result}) if __name__ __main__: app.run(host0.0.0.0, port5000, debugFalse) # 关闭 debug 防泄漏小程序端调用wx.request({ url: http://your-server-ip:5000/ask, method: POST, data: { question: 退货要盖章吗 }, success: res console.log(res.data.answer) })6.3 RAG 效果验证用「人工构造 QA 对」做回归测试拒绝玄学调优最后也是最重要的习惯每次改完切片策略或 prompt必须跑回归测试。我建了一个test_qa.csvquestionexpected_answer_containssource_pdfpage退货需要发票吗发票原件policy_v2.3.pdf12固件升级失败 E204 怎么办重新下载固件包firmware_guide.pdf5然后写验证脚本import pandas as pd df pd.read_csv(test_qa.csv) for _, row in df.iterrows(): answer chain.invoke(row[question]) assert row[expected_answer_contains] in answer, \ f❌ 失败: {row[question]} 未包含 {row[expected_answer_contains]} print(✅ 全部测试通过)我坚持这个习惯两年上线的 7 个 RAG 服务从未因模型更新或数据变更导致线上问答失效。技术没有银弹但有可量化的底线。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

HashMap底层原理、面试难点与实战避坑全解析

HashMap底层原理、面试难点与实战避坑全解析

1. HashMap 到底是什么,为什么面试总爱问它做 Java 开发的朋友,不管你是刚入行还是干了三五年,HashMap 都是绕不开的一道坎。我去面试别人的时候,几乎必问 HashMap;我自己去面试的时候,也几乎必被问到。问来…

2026/10/17 8:23:28 阅读更多 →
STM32F407最小系统板设计:电源、时钟、复位与下载电路实战避坑指南

STM32F407最小系统板设计:电源、时钟、复位与下载电路实战避坑指南

ST的STM32F407是我这些年用得最多的MCU之一。很多人觉得F407的板子无非是“抄个最小系统原理图,打样回来焊上就能跑”,但真到布局、打样、上电调试那一步,电源、时钟、复位、下载这四件事随便哪一件出问题,都会让你在示波器和ST-L…

2026/10/17 8:23:24 阅读更多 →
SpringBoot+Vue+MySQL图书管理系统毕设全流程实战

SpringBoot+Vue+MySQL图书管理系统毕设全流程实战

每年到了毕业设计季,就会有不少学弟学妹来问选题的事。我通常的建议很直接:SpringBoot Vue MySQL这套技术栈下的图书大厦图书管理系统,是性价比非常高的选择。源码、数据库、论文、部署文档,整条链路都能安排得明明白白。这个项…

2026/10/9 13:12:19 阅读更多 →

最新新闻

STM32C5开发LSM6DSK320X(7)--自由落体检测

STM32C5开发LSM6DSK320X(7)--自由落体检测

**STM32C5开发LSM6DSK320X .7--自由落体检测**概述视频教学样品申请源码下载硬件准备参考程序串口配置IIC配置CS和SA0设置INT设置生成项目导入STM32CubeIDE设置工程编码串口 printf 重定向参考程序CMake设置驱动接口与中断回调配置传感器接口初始化与设备检查加速度计与中断输出…

2026/10/17 8:23:20 阅读更多 →
TraeCN实战:AI集成IDE重塑Python开发全流程

TraeCN实战:AI集成IDE重塑Python开发全流程

最近这几个月,我把手头的 Python 项目陆续从原来的编辑器切到了TraeCN上,整个开发节奏肉眼可见地快了不少。说实话,最开始我对这种“AI 集成进 IDE”的产品是有点观望态度的,但真正跑完一个从零到交付的完整项目之后,我…

2026/10/17 8:23:20 阅读更多 →
Spring Boot+MyBatis课程网站设计与实现:覆盖资源、作业与答疑

Spring Boot+MyBatis课程网站设计与实现:覆盖资源、作业与答疑

简介:基于网络的操作系统课程教学网站设计与实现源码包,是一套完整的Java毕业设计项目,面向计算机专业学生以及需要快速搭建在线教学平台的开发者。项目围绕课程讲义、视频教程、在线测试、答疑解惑、作业提交和成绩查询等核心功能展开&#…

2026/10/17 8:23:20 阅读更多 →
造像Z-image-Turbo:扩散模型少步推理加速与质感保持实战

造像Z-image-Turbo:扩散模型少步推理加速与质感保持实战

最近在优化一套图像生成服务的延迟预算时,我又跟“速度”和“质感”这对老冤家打了照面。图像生成领域的老朋友应该都有同感:步数加上去,画质是稳了,用户端的等待时间也跟着上去了;步数压到两三次,延迟倒是…

2026/10/17 8:23:20 阅读更多 →
华为eNSP核心诊断命令实战:路由、ARP与STP排障链路

华为eNSP核心诊断命令实战:路由、ARP与STP排障链路

1. 项目概述:为什么“ENSP常用简单命令(二)”不是重复劳动,而是实操进阶的关键一环在某高校网络工程实训室带学生做实验时,我常遇到一个典型现象:刚学完“display ip interface brief”“sysname R1”这类基…

2026/10/17 8:23:20 阅读更多 →
Sidecar模式后训练:让本地大模型持续进化的工程实践

Sidecar模式后训练:让本地大模型持续进化的工程实践

本地大模型最尴尬的处境,不是跑不快,而是“永远长不大”。你辛苦部署好一个开源模型,它回答常识问题头头是道,但一问到你自己的项目笔记、工作文档、私人资料,它立刻露馅。YoungAi 这个思路有意思的地方在于&#xff0…

2026/10/17 8:22:20 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/17 1:44:59 阅读更多 →
影刀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/16 21:54:38 阅读更多 →
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 阅读更多 →