RAG检索优化:基于LangChain4j的重排序Rerank精排实战
做 RAG 的朋友应该都有过这种体验向量检索跑得好好的相关度得分看起来也不错可最后大模型回答出来的内容就是“差点意思”。真正的关键段落明明在库里却被一堆弱相关的碎片挤到了后面LLM 看到的是被噪声淹没的上下文。我自己在维护某知识库 AI 问答项目时被这个问题折磨了挺久直到给检索链路补上了一道重排序Rerank效果才算立住。这篇内容围绕 LangChain4j 生态讲 RAG 重排序的完整落地先从为什么检索会不准说起再解释 Reranker 的原理最后给出可直接抄走的 Java 代码、实测数据对比以及一路踩过的坑。不管你是刚开始搭 RAG还是已经在生产环境被“召回不准”反复摩擦这里面应该都有用得上的东西。1. 先聊聊 RAG 检索为什么总是不够准RAG 的核心逻辑并不复杂从知识库里把相关内容找出来放进 Prompt 里交给大模型让它基于这些材料回答。可问题就出在“找出来”这一步——你用什么找决定了后面所有环节的上限。1.1 向量检索的“语义陷阱”向量检索这几年很流行原理是把文本映射成高维向量然后通过余弦相似度或者欧氏距离找最接近的片段。它在很多场景下确实比关键词强因为能捕捉同义表达。但问题也很明显它计算的是整体语义相似度对细粒度相关信息不敏感。举个例子用户问“数据库连接超时怎么排查”一个片段整体主题是“系统架构设计”里面恰好有一句提到了连接池配置另一个片段专门讲“连接超时解决方案”。按向量距离打分前者可能因为整体风格接近反而排得靠前。这种整体相似和局部相关之间的错位就是典型的“语义陷阱”。更麻烦的是向量模型本身存在“维度坍缩”的现象——不同文本的向量在空间里分布并不均匀很多并不相关的片段得分差距很小。这意味着召回 Top 10 里可能真正相关的只有两三条但它们的分数和噪声片段差不了多少。向量检索擅长的是“大海捞针”式的粗筛而不是精确判断“哪一段才是用户真正要的”。1.2 混合检索解决了召回但没解决排序针对向量检索的盲区很多人会把传统的关键词检索BM25 这类叠加进来做成混合检索向量搜一批关键词搜一批然后做分数融合。召回阶段确实会厚实很多——能覆盖语义查询和字面匹配两个方向。但到了排序阶段混合检索通常只是简单加权合并比如向量得分占 0.6、BM25 得分占 0.4最后按加权总分排序。这个加权是拍脑袋定的往往并不可靠。不同查询对语义和关键词的依赖程度完全不同同样的权重放在“连接超时”这种问题上是合适的放到“今年 Q3 营收是多少”这种问题上就差很多。更重要的是混合检索的两路得分并不在同一量纲上直接加权本质上是把苹果和橘子强行加在一起。我见过不少项目把混合检索当成“银弹”上了之后就以为检索没问题了。实际上混合检索贡献最大的是召回的广度而不是排序的精度。它能让真正相关的文档大概率出现在候选集里但候选集内部谁先谁后它说了不算。1.3 一句话总结痛点所以 RAG 检索的现状往往是召回不缺排序不准。Top 10 甚至 Top 20 里藏着足够多的相关内容但排序靠后LLM 在拼接上下文时被前面的弱相关片段干扰影响回答质量。重排序Rerank要解决的就是这一层问题——把已召回的结果交给一个更精细的打分器重新排定座次。2. 重排序究竟在干什么聊聊 Reranker 的原理2.1 粗排与精排的两阶段范式如果做过搜索引擎对“粗排 精排”这套框架应该不陌生。粗排阶段用廉价的方式从海量文档里快速筛出几百条候选精排阶段再用更强但更贵的模型对候选逐条精细打分。RAG 里的重排序思路如出一辙向量检索或混合检索负责粗召回Reranker 负责精排。只不过候选数量从几万降到了几十条重排序压力小很多。为什么不能一开始就用 Reranker因为多数 Reranker 是 cross-encoder 架构需要把 query 和每条文档拼在一起过一遍模型文档一多计算量线性上涨。比如候选 1000 条每条 inference 10ms光排序就要 10 秒根本扛不住。先粗召回把数量砍到 20 条Reranker 一次调用 200ms完全可接受。这就是两阶段范式在工程上的意义。2.2 Cross-Encoder 重排序为什么更准交叉编码器Cross-Encoder和向量模型常用的双塔编码器Bi-Encoder有个本质区别。双塔是把 query 和 document 分别编码成向量最后算一个相似度两者编码完全独立模型没有机会让两边的 token 互相“看到”。Cross-Encoder 则是把 query 和 document 拼接成一段文本直接丢给 Transformer 模型做二分类或打分每个 token 都能充分交互。打个不太严谨但容易理解的比方双塔编码器像相亲网站只看照片和资料打分两人没有碰面Cross-Encoder 像线下见面聊了半小时再做判断能捕捉到资料里根本看不出来的默契。相关性问题本质是 query 与 document 的交互Cross-Encoder 在这方面的优势是结构性的不是靠调参能弥补的。实际操作中用某个开源 cross-encoder 重排序模型替换向量检索的排序最常见的感受就是真正相关的文档会被明显提到前面而且分数拉开得很干脆。这是重排序最直观的价值。2.3 什么场景必须上 Reranker不是所有 RAG 场景都需要重排序但下面这几种我建议尽早加。第一种知识库文档相互之间相似度高。比如产品 FAQ 和操作手册里大量段落都在描述同一功能向量检索会把内容类似的片段都召回来排序时难以分辨谁更贴合当前问题。第二种用户问题具有明显的细粒度指向。比如“这个接口在什么情况下返回 429”答案可能藏在一整页文档的一句话里整体相似度不高需要精确交互判断。第三种回答质量对上下文顺序敏感。你观察到 LLM 经常被 Top 前几位的弱相关碎片带走回答出现张冠李戴这就是排序问题已经影响到了生成质量。反过来如果知识库结构简单、问题基本都是整体语义匹配比如“这份文档讲什么主题”向量检索已经足够好可以先不上 Reranker避免增加维护成本和一次额外的网络调用。3. LangChain4j RAG 实战给检索链路加一道精排3.1 环境准备与依赖引入我这边项目是 Java Spring Boot 技术栈RAG 部分直接用了 LangChain4j。LangChain4j 的 RAG 抽象做得比较清晰核心链路是 ContentRetriever检索器到 ContentAggregator聚合器再到 ContentRouter路由器最后注入 Prompt。重排序最适合切入的位置有两个要么包一层自定义 ContentRetriever在召回之后再精排要么在 ContentAggregator 里做后处理。我选择了前者因为能在拿到 query 的地方直接统一处理逻辑更干净。依赖方面核心的包是这几个dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId version1.0.0/version /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-embeddings/artifactId /dependency具体模型服务的依赖按照你自己的服务商引入对应的 provider 包即可比如自己部署的向量模型、商用大模型 API 的 Java SDK 包。重点是理解组件接口而不是绑定某个特定实现。我用的是本地部署的向量模型和重排序服务通过 HTTP 调用所以主项目里只引入了核心包和 HTTP 客户端依赖。3.2 先搭一个基础 RAG 管道在加重排序之前先把基础链路跑通。这里用 LangChain4j 的 EmbeddingStoreContentRetriever 做粗召回代码如下EmbeddingModel embeddingModel ...; // 按服务商初始化 EmbeddingStoreTextSegment embeddingStore ...; // 基础检索器召回 Embedding 相似度最高的 20 条 EmbeddingStoreContentRetriever baseRetriever EmbeddingStoreContentRetriever.builder() .embeddingStore(embeddingStore) .embeddingModel(embeddingModel) .maxResults(20) .minScore(0.3) .build(); // 构建检索增强器 RetrievalAugmentor augmentor DefaultRetrievalAugmentor.builder() .contentRetriever(baseRetriever) .build(); // 定义 AI 服务接口 interface Assistant { String chat(dev.langchain4j.service.UserMessage String message); } ChatLanguageModel chatModel ...; // 大模型 Assistant assistant AiServices.builder(Assistant.class) .chatLanguageModel(chatModel) .retrievalAugmentor(augmentor) .build(); String answer assistant.chat(数据库连接超时怎么排查);这里 maxResults 为什么不直接设成 5因为后续要留给重排序操作空间。只召回 5 条再重排序等于在 5 个里面选座次没有意义召回 20 条重排序后取前 5才有真正的筛选价值。minScore 设成 0.3 也是同理阈值太严会把真正相关但得分不高的候选提前过滤掉。这个阈值取决于嵌入模型自身的打分习惯我建议先按 0.3 起步后面根据数据调整。3.3 在 ContentRetriever 里实现重排序接下来是重头戏自定义一个 RerankContentRetriever包装基础检索器在召回后调用重排序模型精排。这个类的核心逻辑就是两级筛选——先粗召回一批再用 Reranker 重新打分截断。public class RerankContentRetriever implements ContentRetriever { private final ContentRetriever delegate; private final Reranker reranker; private final int topN; public RerankContentRetriever(ContentRetriever delegate, Reranker reranker, int topN) { this.delegate delegate; this.reranker reranker; this.topN topN; } Override public ListContent retrieve(Query query) { // 第一步粗召回拿到候选集 ListContent candidates delegate.retrieve(query); // 第二步按 query 对候选重排序 ListContent ranked reranker.rerank(query.text(), candidates); // 第三步截取精排后的 Top N int size Math.min(topN, ranked.size()); return ranked.subList(0, size); } }Reranker 接口定义得很简单就一个方法——输入 query 和候选列表输出按相关度从高到低排序后的列表。具体实现如下我用 HTTP 方式调用一个独立部署的 cross-encoder 重排序服务public class CrossEncoderReranker implements Reranker { private final RestClient client RestClient.create(); Override public ListContent rerank(String query, ListContent candidates) { if (candidates.isEmpty()) { return candidates; } // 读取每个候选的文本 ListString texts candidates.stream() .map(content - content.textSegment().text()) .toList(); // 调用重排序服务得到每个候选的分数 RerankResponse response client.post() .uri(http://your-rerank-service:8080/rerank) .body(new RerankRequest(query, texts)) .retrieve() .body(RerankResponse.class); // 把分数绑定到原内容上按分数降序排序 ListScoredContent scored new ArrayList(); for (int i 0; i candidates.size(); i) { scored.add(new ScoredContent(candidates.get(i), response.scores().get(i))); } scored.sort(Comparator.comparingDouble(ScoredContent::score).reversed()); return scored.stream().map(ScoredContent::content).toList(); } record ScoredContent(Content content, double score) {} record RerankRequest(String query, ListString documents) {} record RerankResponse(ListDouble scores) {} }这里的重点是把重排序服务设计成独立组件。重排序模型的部署往往和主应用不在同一个进程通过 HTTP 隔离这样升级模型、做缓存、扩展资源都不影响主链路。3.4 完整链路与效果验证把重排序检索器接到增强器上完整链路就成型了Reranker reranker new CrossEncoderReranker(); int rerankTopN 5; ContentRetriever finalRetriever new RerankContentRetriever(baseRetriever, reranker, rerankTopN); RetrievalAugmentor augmentor DefaultRetrievalAugmentor.builder() .contentRetriever(finalRetriever) .build(); Assistant assistant AiServices.builder(Assistant.class) .chatLanguageModel(chatModel) .retrievalAugmentor(augmentor) .build(); String answer assistant.chat(数据库连接超时怎么排查);效果怎么验证先别急着看大模型回答直接把重排序前后的检索结果打出来。我当时的做法是加了一个 debug 开关把候选片段、原始分数、重排序分数、最终名次全部输出。用实际数据观察比靠感觉判断靠谱得多。初次看到重排序把真正相关的片段从第 17 名提到第 1 名时你会直观感受到这一层的价值。4. 参数调优与一次实测对比复盘4.1 不同策略的实测数据我在某知识库项目里做了一个小范围测评检索语料是一批运维手册和产品文档测试问题 50 个人工标注了每个问题对应的正确文档片段。对比三种链路检索策略Top5 命中率P95 延迟回答主观评分1-5仅向量检索 Top561.2%190ms3.1向量 BM25 混合后取 Top578.5%230ms3.7向量粗召回 Top20 Rerank 后取 Top593.4%350ms4.6数据说明了两件事。第一混合检索能提升召回范围但排序质量提升有限第二Rerank 补齐的正是精排这一环命中率和回答质量都有肉眼可见的提升。当然这是单个项目的样本量不代表所有场景都一定是这个涨幅但趋势是一致的——重排序解决的是排序精度问题这正是 RAG 问答质量最容易忽略的瓶颈。4.2 Top-N 到底取多少合适重排序前粗召回数量和重排序后最终取多少这两个参数直接影响效果和开销。我测试下来的经验是粗召回候选数取最终 Top-N 的 4 到 6 倍比较合适。最终想拿 5 条粗召回可以用 20 到 30 条最终想拿 10 条粗召回 40 到 50 条。太少给 Reranker 的挑选空间不足太多排序延迟和模型开销上升。另外还有一个容易忽略的地方最终进入 Prompt 的片段真的越多越好吗不一定。实验数据里从 Top3 增加到 Top5 回答质量有提升但从 Top5 到 Top10 提升趋缓个别问题甚至因为噪声过多反而下降。LLM 的上下文窗口虽然很大但无关片段越多模型越容易“分心”。宁可少而精不要多而杂这个原则在 RAG 里尤其适用。4.3 延迟与成本控制不能被重排序拖垮加了 Rerank 之后延迟上涨是必然的。粗召回 20 条重排序服务对 20 条逐条打分一次 100 到 300ms 很正常。如果候选更多可能就是 500ms 往上。怎么控制我在项目里做了三个优化。第一个是缓存。用户问题在知识问答场景里有明显的热点效应对重复或近似的问题直接缓存重排序结果。缓存 key 用 query 的归一化文本加候选片段指纹命中率大概有 20% 左右。第二个是批量推理。重排序服务如果支持 batch就把多条候选一次过模型而不是 for 循环逐条请求。Cross-Encoder 本身适合 batch 输入实测从逐条请求改成批量整体延迟能降到原来的 40%。第三个是降级策略。重排序服务出现抖动或不可用时自动回退到粗召回直接截断保证服务不挂。RAG 是辅助增强能力不能因为精排环节把自己变成单点故障。5. 踩坑实录与排查速查手册5.1 几个特别容易踩的坑第一个坑是重排序模型输入长度限制导致信息截断。Cross-Encoder 通常有最长输入限制几百到一两千 token 不等。如果候选片段本身很长直接拼接 query 后超出长度会被截断关键细节可能恰好被切掉。解决思路是配合合理的分块策略让片段长度更小更聚焦或者做长文本分段打分再聚合。第二个坑是重排序前阈值设置太激进。我之前把 minScore 设到 0.6发现重排序后经常只剩两三段相关片段。原因是向量检索的得分范围很受嵌入模型影响有些模型正常得分就在 0.4 附近。建议 minScore 从低到高调先保证候选充分再靠 Rerank 把好内容提到前面。第三个坑是召回候选里重复内容太多。知识库里同一主题的文档往往被重复写入或者分块后相邻片段内容高度重叠。重排序不管这些score 差不多会把重复段落同时提到前排最后 Prompt 里全是相似内容。需要在重排序之后加一个基于文本相似度的去重我采用的方式是 SimHash 结合简单的编辑距离阈值明显重复的片段只保留一条。第四个坑是重排序模型与业务领域的匹配。拿通用语料训练的模型处理强领域问题比如专业设备故障诊断效果不一定比混合检索强。选型之前最好拿一批真实 query 加标注结果做小规模评估选领域更匹配的模型而不是盲目追求“越新越好”。5.2 问题排查顺序和常用排查手段遇到重排序没起作用先别急着改参数按顺序查。第一确认重排序服务真的被调用了。我见过把新检索器装配到框架里但外层某处缓存还在生效导致看起来完全没变化的情况。第二打印重排序前后的列表对比。如果前后顺序基本没变可能是打分模型对这批候选区分度不够或者输入拼接有问题。第三检查分数分布。所有分数都接近 1.0 或者都接近 0.0通常说明模型处于饱和状态需要检查是否做了适当的文本预处理。第四做一个最小用例把 query 和一个明显相关的片段、一个明显不相关的片段放进去看模型给分是否合理。现象可能原因排查手段排序结果没变化装配未生效 / 命中缓存打印调用日志、清缓存对比相关片段反而排后模型领域不匹配小规模标注样本评估模型重排序后得分全接近输入文本预处理不当检查输入截断与格式延迟激增候选数过多 / 逐条请求批量发送、降低候选数部分查询无返回minScore 过高降低粗召回阈值5.3 几个值得长期坚持的工程习惯最后说几个我踩过之后长期受益的小经验。评估集一定要建。随手挑十几个问题效果看着不错不等于上线后稳。我后来把历史问题和找到的对应文档片段整理成了评估集每次换模型、调参数都跑一遍用命中率做单选判断。这套小成本评估集比任何参数调优都值钱。第二重排序的优先级应该高于换更强的大模型。在候选排序不准的情况下把 LLM 换成更大参数的模型提升远不如修好排序链路。LLM 是被动消费上下文的给它更准确的上下文才是性价比最高的优化。第三保持两级筛选的节奏别贪心。曾经有一版我直接跳过粗召回把全库几千个片段都拿给 Rerank 打分准确性确实不差但一次请求要好几秒完全没法用。后来老老实实做两级筛选粗召回砍到 20 条左右再精排效果和延迟都平衡了。我在实际项目中最后保留的组合是向量检索加关键词召回做粗选交叉编码器重排序做精排Top5 进 Prompt配合缓存与降级。这套组合并不是所有场景的最优解但对大多数知识库问答业务已经是一个非常稳的起点。如果你也正在被“检索不准”折磨建议按这个思路动手试一遍把检索输出打出来看看大概率能找到你想要的答案。

相关新闻

Ubuntu Crontab定时任务原理与实战避坑指南

Ubuntu Crontab定时任务原理与实战避坑指南

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

2026/10/17 16:45:47 阅读更多 →
用原生Canvas构建完整弹珠游戏:渲染、物理与碰撞实战

用原生Canvas构建完整弹珠游戏:渲染、物理与碰撞实战

1. 为什么我选Canvas写弹珠游戏,以及这个项目最终长什么样弹珠游戏是个很有意思的命题。市面上你搜"canvas 弹珠",能找到一大堆教程,但大多停在"画了一个圆、让它往下掉、碰到挡板就反弹"这种程度,然后就没下…

2026/10/17 16:45:47 阅读更多 →
Unity项目接入APNs推送:从证书到原生桥接的完整指南

Unity项目接入APNs推送:从证书到原生桥接的完整指南

前阵子有个开发者来找我,说他们在Unity里做的社交App要接iOS推送,问APNs到底怎么整。我第一反应是,又是一个被Unity"跨平台"外衣坑了的兄弟。Unity对安卓推送确实有现成封装,但iOS的远程推送从来不是填个参数就能跑的&a…

2026/10/17 16:45:47 阅读更多 →

最新新闻

数据指标多重应用:从口径定义到业务决策的实战指南

数据指标多重应用:从口径定义到业务决策的实战指南

看一眼标题,很多人第一反应是“哪个指标?”,然后就没有然后了。做数据和运营这些年,最明显的一个感受是:大家天天在看日活、看留存、看转化率,但这些“熟悉得不能再熟悉”的指标,绝大多数时候只…

2026/10/17 17:51:34 阅读更多 →
Windows 下 GDAL FileGDB 驱动编译与读写实战:从源码到可运行

Windows 下 GDAL FileGDB 驱动编译与读写实战:从源码到可运行

简介:这份资源面向在 Windows 平台从事地理数据处理与转换的开发者,尤其是需要在脱离 ArcGIS 环境的前提下读写 .gdb 文件地理数据库的工程师。针对 GDAL 3.5 及以下版本默认不支持写入 gdb 的问题,资源给出了基于 FileGDB 驱动的轻量级配置方…

2026/10/17 17:51:34 阅读更多 →
Hive动态分区为何必走Shuffle?揭秘Reduce强制触发机制

Hive动态分区为何必走Shuffle?揭秘Reduce强制触发机制

1. 动态分区不是“开个开关”就能跑得快:为什么Hive里一用动态分区就卡在Shuffle阶段你有没有遇到过这样的场景:写好一个带INSERT OVERWRITE TABLE ... PARTITION (dt, region)的SQL,本地小数据测试飞快,一上生产集群,…

2026/10/17 17:51:34 阅读更多 →
Teamcenter 2406部署避坑指南:四层客户端组件冲突与BMIDE环境变量配置

Teamcenter 2406部署避坑指南:四层客户端组件冲突与BMIDE环境变量配置

简介:这份文档面向Teamcenter实施与运维人员,聚焦PLM系统部署中客户端与开发工具的安装配置问题。内容围绕Deployment Center工具展开,覆盖TC24062、两层与四层客户端以及BMIDE的完整部署流程,适合具备一定PLM基础、需要独立完成环…

2026/10/17 17:51:34 阅读更多 →
基于Autoencoder的反欺诈异常检测实践:从原理到工程落地

基于Autoencoder的反欺诈异常检测实践:从原理到工程落地

做反欺诈相关算法的人,天天面对同一个矛盾:欺诈样本太少,而且永远在变。别的分类模型再强,喂进去的标签说白了都是历史旧账,而你要拦的是明天可能出现的新变种。所以我第一次在某个风控原型项目里尝试用 Autoencoder 做…

2026/10/17 17:51:34 阅读更多 →
MTK/高通/展锐刷机工具全解析:从协议到救砖实战

MTK/高通/展锐刷机工具全解析:从协议到救砖实战

简介:面向MTK、高通、展锐三大移动平台的版本升级烧录工具合集,适合设备厂商、开发者与售后维修人员使用,覆盖固件全量升级、增量升级、底层加载、分区写入、驱动识别与故障恢复等常见场景。资源包共1031个文件,压缩后181.59MB&am…

2026/10/17 17:50:33 阅读更多 →

日新闻

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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →