AgentScope 2.0 源码解析RAG 模块|一条流水线、两个硬边界、三个抽象基类

本文是 AgentScope 2.0 源码解析系列 (RAG 模块)。

关注追更,后续会持续更新 Workspace、Skill、formatter 等模块。

读完这篇你会带走这些源码层面的结论:

  • 整个 RAG 模块被抽象成一条单向流水线:Parser → Section → Chunker → Chunk → KnowledgeBase → VectorStore,每个阶段有自己的数据载体和边界,前一阶段不知道后一阶段的存在;分块(chunking)被独立成单独一阶段,不藏在解析或存储里

  • Section 是硬边界——ChunkerBase 源码注释里写死「never combine content across two Sections」,PDF 的一页、PPT 的一张幻灯片永远是一个完整切分单元,跨页拼接这种脏数据从结构上就不可能产生

  • KnowledgeBase 把 embedding model 和 vector store 配成一对,对外只露 4 个方法(search / insert_document / delete_document / list_documents),全部 async,collection 是首次调用时懒创建并 memoized

  • metadata_filter 是一道纵深防御的租户隔离:构造时设一次,search/list 永远带上它过滤,insert 则把它的 key 强制覆盖到每个 chunk 的 metadata 上——恶意 parser 也无法把记录塞进别人的 scope

  • Chunk 故意不带 score 也不带 embedding 字段:分数塞进 VectorSearchResult 包装类、向量塞进 VectorRecord 包装类,让 Chunk 在流水线里语义保持稳定

  • 三家向量库(Milvus Lite / Qdrant / MongoDB)实现的是同一个 VectorStoreBase 抽象,差异全压在各自后端,KnowledgeBase 对底层是哪家一无所知

适合谁读:在写或要改 RAG / 知识库功能、想给自己的 Agent 接外部知识、或对「怎么设计一个能换后端、能多租户隔离、还能跨格式」的检索系统感兴趣的 Python 开发者。
预计阅读:主线约 16 分钟(5 张字段表分散在各小节,深度查阅另需约 5 分钟)。

🎯 如果只记一件事

RAG 模块把「索引」这件事拆成 5 个阶段、每阶段一个数据载体 + 一个抽象基类,并且用 Section 这个硬边界从结构上杜绝跨结构单元拼接。这套「流水线分阶段 + 每阶段一个不变量数据类型 + 硬边界防越界」的思路,搬到任何要把异构输入加工成可检索单元的系统(日志检索、代码搜索、多模态库)都成立——宁可多设计一层 Section,也不要让下游 chunker 自己去判断「这里能不能断开」。


一、这个模块到底在解决什么问题?

读完前几篇你会发现一个反差:Agent 的 ReAct 循环、Middleware 的 6 个 Hook、Tool 的工具调用——这些机制都假设 Agent「脑子里已经有知识」。但真实业务里,Agent 需要的知识往往躺在几百份 PDF、PPT、Markdown、图片里。把这些异构文件变成 Agent 能「查」到的东西,就是 RAG 模块要解决的问题。

如果没这个模块会怎样?你得自己写:怎么读 PDF 抽页、怎么把 PPT 的表格转成文字、图片要不要做多模态 embedding、文本按什么粒度切、切完存哪、查的时候怎么去重、多个租户共用一个库怎么不串数据……这些零碎活全压到业务代码里,最后一定长成一个谁也不敢动的「上帝函数」。

AgentScope 选的方案,是把整件事拆成一条单向流水线,每一阶段只干一件事、只产出一个固定形状的数据结构,后一阶段只认前一阶段的输出形状,不关心它怎么来的。一句话理解这个模块:它把「把文件变成可检索的向量」这件又杂又长的事,拆成了 5 个能各自独立测试、独立替换的阶段 。

二、这个模块在整个框架中的位置

先看数据在流水线里怎么流。输入是一个文件(bytes 或路径),最终落进一个向量数据库的 collection。

RAG 五阶段索引流水线

图 1 · RAG 五阶段索引流水线:文件 → Parser → Section(玫红粗线是硬边界)→ Chunker → Chunk → KnowledgeBase → VectorStore

这条链上有两个角色是「业务侧调用者」而非模块内部组件:

  • Parser(4 家):吃原始文件,吐 Section 列表。按 IANA media type 路由(application/pdf → PDFParser 等)。

  • VectorStore(3 家):物理存储和 ANN 检索。MilvusLiteStore / QdrantStore / MongoDBStore 都实现同一个 VectorStoreBase。

依赖方向:KnowledgeBase 依赖 embedding 模块(要算向量)和 message 模块(TextBlock/DataBlock 是内容载体);它不依赖agent / tool / model(LLM 那个 model)。反过来也没有模块依赖 RAG——RAG 是被上层「知识库管理器」和 Agent 工具调用的叶子模块。这个单向、可插拔的位置,是它能支持「换后端、换 parser、换 embedding」而不动其它代码的前提。

三、为什么这样设计?

这是理解整个模块的关键。先讲设计,再讲代码。

3.1 为什么是流水线,而不是一个大 index(file) 方法

最容易想到的写法是一个 KnowledgeBase.index(file_path),内部一把梭:读文件 → 切块 → 嵌入 → 存库。简单,但有三个问题:

  1. 不可测试。想单独测「PDF 解析对不对」必须连向量库一起起。

  2. 不可替换。想换 chunk 策略(按 token / 按语义),得改 index 内部。

  3. 不可复用。Parser 产出的 Section 想给「全文摘要」用、给「关键词抽取」用,都得重新读一遍文件。

AgentScope 把它拆成 5 个阶段,每个阶段一个数据载体(Section / Chunk / VectorRecord / VectorSearchResult / DocumentSummary),阶段之间用这些固定形状的对象交接。Parser 完全不知道 Chunker 存在;Chunker 也不知道有向量库。这样每一段都能单独 mock 测试,也都能被流水线之外的逻辑复用。

3.2 为什么 Section 是硬边界

这是整个模块最该停下来想一想的约束。ChunkerBase 的基类注释里白纸黑字写着三条不变量:

  • No cross-Section merging: every output Chunk is derived from exactly one input Section.

  • DataBlock pass-through: a Section whose content is a DataBlock becomes a single Chunk with the same content; multimodal data is never sliced.

  • Continuous indexing: chunk_index runs from 0 to total_chunks - 1 across the entire output list.

为什么这条约束这么重要?因为 RAG 检索质量的一个常见杀手是上下文断裂:把 PDF 第 3 页的尾巴和第 4 页的开头拼进同一个 chunk,检索时这块文本既不属于任何一页,引用时也无法标页码,用户根本无从核对。Section 把「自然边界」(一页 / 一张幻灯片 / 一张图)固定下来,Chunker 只能在边界内切,从结构上消灭了这种脏数据。这是比「靠 chunker 自己小心」更稳的防线——你不可能在结构层面就禁止掉一个错误。

3.3 为什么 Chunk 不带 score 也不带 embedding

读源码时一个反直觉的细节:Chunk 是流水线的核心数据结构,但它只有content / source / chunk_index / total_chunks / metadata 五个字段。检索的分数在哪?插入的向量在哪?

作者把这两样东西分别塞进了包装类:

  • 插入时:VectorRecord(vector=..., document_id=..., chunk=...) ——向量是「要插进库」时才裹上去的壳。

  • 检索时:VectorSearchResult(score=..., document_id=..., chunk=...) ——分数是「成了查询命中」时才裹上去的壳。

_vector_store.py 的注释点破了意图:"Chunk is intentionally not extended with an embedding field so its semantics stay stable across the indexing pipeline"。换句话说,如果给 Chunk 加 score,那流水线生产阶段(insert)也得扛着一个永远为空的 score 字段;如果加 embedding,消费阶段(search)也得扛着一个永远为空的向量。包装类把这种「这个字段在这个阶段才有意义」的副作用隔离掉了。把数据模型的生命周期语义做进类型系统,比靠注释提醒「这个字段这里别用」可靠得多。

3.4 为什么 collection 是懒创建的

KnowledgeBase.ensure_collection(_knowledge.py:160)只在第一次真正要操作时才检查 collection 存不存在、不存在就用 embedding 维度建一个,建完立刻 self._collection_ready = True 并 memoize,之后所有调用就是一个 if 直接返回。

这个设计解决的是「冷启动体验」:用户新建一个知识库时不需要先跑一遍 setup,第一次 insert_document 或 search 自然就建好了。代价是首次调用多一次 round-trip,但 memoize 之后归零。对一个「库可能建了很久但没人用」的系统,懒创建比「构造即建」省资源。

四、跟着我阅读源码

第一次读只需精读 Chunk 字段表 一张,其余字段表按需查阅,不影响理解主线。

模块源码一共 18 个文件、约 3270 行,但真正承载设计的是少数几个。按重要程度排:

  1. _document.py(102 行)——必读。定义 Section 和 Chunk,是整条流水线的「数据契约」。看懂这两个,就懂了模块的骨架。

  2. _knowledge.py(384 行)——必读。KnowledgeBase 是唯一对外暴露的运行时句柄,4 个 async 方法串起检索 + 增删查。

  3. _vdb/_vector_store.py(292 行)——必读。定义 VectorStoreBase 抽象 + 三个数据包装类。这是「换后端」的根。

  4. _chunker/_base.py + _approx_token_chunker.py——重要。前者定义三条不变量,后者是唯一的 chunker 实现(近似 token 切分)。

  5. _parser/_base.py + 四个 parser——按需。理解 supported_media_types 路由机制时读 _base.py,想看多模态怎么处理时读 _image.py / _ppt.py。

  6. 三个 vector store 实现——按需查阅。挑一个最熟的后端读对照,理解抽象怎么落地即可。

字段表 1:Chunk(核心,必读)

_document.py:71。这是流水线最终产物、向量库每一条记录的业务载荷。

字段

类型

含义

contentTextBlock \| DataBlock

chunk 内容。文本切片是 TextBlock,多模态(图片等)原样透传是 DataBlock

sourcestr

源文件名,从父 Section 继承,用于引用 / 展示

chunk_indexint

在整个文档内的 0 基索引,用于检索时「找相邻 chunk 扩展上下文」

total_chunksint

同源文件切出的 chunk 总数,和 chunk_index 配合判断命中是否在文档首尾

metadatadict[str, Any]

从父 Section 继承的格式特有元信息(如 {"page": 3}、{"slide": 2})

重点理解 chunk_index + total_chunks 这对组合:它们不是给 chunker 自己用的,而是给检索时的上下文扩展用的。命中第 5 个 chunk 时,可以靠 chunk_index 去把第 4、6 个也捞回来,这是 RAG 里「扩大命中窗口」的标准操作。source 和 metadata 一起构成了「这条命中来自哪、具体在哪个位置」的引用链。

字段表 2:Section(按需查阅)

_document.py:31。Parser 的产物,Chunker 的输入。

字段

类型

含义

contentTextBlock \| DataBlock

section 内容,文本用 TextBlock,多模态用 DataBlock

sourcestr

源文件名,向下游传递到每个 Chunk 和向量库 metadata

metadatadict[str, Any]

parser 写入的格式特有元信息(PDF 的 {"page":3}、PPT 的 {"slide":2} 等),透传到向量库供引用

Section 比 Chunk 少了 chunk_index / total_chunks——因为它是「自然边界」的载体,不需要定位编号;它比 Chunk 多承担了「格式特有元信息来源」的角色。

字段表 3:VectorRecord / VectorSearchResult(按需查阅)

_vdb/_vector_store.py:28 / :53。两个包装类,作用见 3.3 节。

类

字段

含义

VectorRecord

(插入壳)

vector: list[float]

密集嵌入向量

document_id: str

源文档 ID,后端必须持久化,delete 按它整批删

chunk: Chunk

业务载荷

VectorSearchResult

(命中壳)

score: float

相似度分数,cosine/dot 越大越相似,L2 越小越相似

document_id: str

命中所属源文档

chunk: Chunk

命中的业务载荷

字段表 4:DocumentSummary(按需查阅)

_vdb/_vector_store.py:76。list_documents 的返回元素,向量库是「库里有哪些文档」的唯一真相源。

字段

类型

含义

document_idstr

源文档 ID

sourcestr

原始文件名(取自遇到的第一个 chunk)

chunk_countint

该文档索引的 chunk 总数

metadatadict[str, Any]

文档级元信息(媒体类型、大小、上传时间等,取自遇到的第一个 chunk)

KnowledgeBase 构造参数(必读)

_knowledge.py:74。这是业务侧会直接 new 的类,参数决定运行时行为。

参数

类型

含义

namestr

面向 Agent 的知识库名,露给 LLM(工具描述里)和前端

descriptionstr

面向 Agent 的描述,LLM 据此判断「要不要查这个库」

embedding_modelEmbeddingModelBase

嵌入模型,索引和检索必须同一模型否则向量不可比

vector_storeVectorStoreBase

共享的向量库连接,必须以 __aenter__

collectionstr

物理集合名,懒创建

metadata_filterdict \| None

纵深防御的 payload 过滤器,见下文

五、代码到底是怎么运行起来的?

跟着一次完整检索走一遍。假设业务侧已经建好了一个 KnowledgeBase,现在调 await kb.search(["年假多少天?"])。

第 1 步:空查询短路(_knowledge.py:228)。

if not queries:
    return []

进来的 queries 是 ["年假多少天?"],非空,继续。

第 2 步:多模态降级(_knowledge.py:231)。

if not self._embedding_model.supports_multimodal:
    queries = [q for q in queries if not isinstance(q, DataBlock)]

如果绑定的 embedding 模型不支持多模态,把 DataBlock(图片查询)静默丢弃。设计意图:调用方可以传混合 list 而不用为每个 KB 判断能力。这里查询是字符串,不受影响。

第 3 步:懒建 collection(_knowledge.py:236 → ensure_collection)。

await self.ensure_collection()

首次调用会走 has_collection 检查,不存在就用 embedding_model.dimensions 建;之后 _collection_ready=True,这里就是个 if 返回。

第 4 步:批量嵌入(_knowledge.py:237)。

response = await self._embedding_model(queries)

所有查询一次性批量嵌入(不是一个一个嵌)。这一步是整条链里最贵的,批量能显著省 LLM 调用成本。

第 5 步:并发检索(_knowledge.py:239)。

results_per_query = await asyncio.gather(
    *(self._vector_store.search(
        collection=self._collection,
        query_vector=vector,
        top_k=top_k,
        metadata_filter=self._metadata_filter,
    ) for vector in response.embeddings)
)

每个查询向量并发打向量库。注意 metadata_filter每次都带上——这是租户隔离的执行点。

第 6 步:去重 + 阈值 + 排序 + 截断(_knowledge.py:251-272)。

key = (result.document_id, result.chunk.chunk_index)
if key not in best or result.score > best[key].score:
    best[key] = result

这是去重的关键:用 (document_id, chunk_index) 作为 chunk 的稳定身份。注释点明它「survives reindex (block UUIDs do not)」——向量库内部的主键 UUID 在重建索引时会变,但「哪个文档的第几个 chunk」是逻辑身份,稳定。多个查询命中同一个 chunk 时保留分数最高的那个。最后按分数降序排,截到 top_k。

插入路径(insert_document,_knowledge.py:278)走的是镜像逻辑,但有一个关键安全细节:metadata 合并时 metadata_filter 的优先级最高(见下文扩展建议里的「千万不要改」)。

六、如何开始调试源码

第一次:在 _knowledge.py:237(response = await self._embedding_model(queries))下断点。观察 queries 进来时长什么样、response.embeddings 出去时维度对不对。这一步能确认 embedding 模型配置正确。

第二次:在 _knowledge.py:245(metadata_filter=self._metadata_filter)下断点。观察传给向量库的 filter 是不是你设的租户隔离值。多租户 bug 经常就出在这一行 filter 没传或传错。

第三次:在 _knowledge.py:263(key = (result.document_id, result.chunk.chunk_index))下断点。观察多查询去重是否如预期——尤其是当你怀疑「明明该出来的 chunk 没出来」时,看 best 字典里它的 score 是不是被另一个查询的低分覆盖了(不会,因为取 max,但值得确认)。

插入调试:在 _knowledge.py:329(metadata 合并那个 for 循环)下断点,看 chunk.metadata 最终长什么样——这是排查「为什么检索时按租户过滤把这个文档过滤掉了」的关键,因为 metadata_filter 的 key 在这里被强制覆盖上去。

七、如何扩展这个模块

✅ 应该改(推荐路径)

加一种文件格式:继承 ParserBase,声明 supported_media_types,实现 parse 返回 list[Section]。这是模块设计的主扩展点,路由靠 MIME 类型自动完成,无需改任何其它代码。参考 _pdf.py(92 行)是最简单的范本。

换 chunk 策略:继承 ChunkerBase 实现 chunk。比如想做「按 Markdown 标题切」或「按句子切」,新写一个 chunker 即可。务必遵守三条不变量(不跨 Section 合并、DataBlock 透传、连续索引)。

加一个向量库后端:继承 VectorStoreBase 实现 7 个抽象方法。KnowledgeBase 对后端无感知,换库零改动。

⚠️ 不应该改(有更优替代)

不要直接改 Chunk 加字段。如果新功能需要「带分数的 chunk」,用包装类(参考 VectorSearchResult),而不是污染 Chunk 的语义。

不要在 KnowledgeBase 里硬编码某个后端的 filter 语法。metadata_filter 是 flat dict 抽象,后端各自翻译(Milvus 翻成 expr、Qdrant 翻成 Filter、MongoDB 翻成 $and)。在 KnowledgeBase 层写死某种语法会破坏可插拔性。

🚫 千万不要改(动了会破坏不变量)

ChunkerBase 的「不跨 Section 合并」约束。这是模块防脏数据的结构防线,一旦放开,跨页拼接这类问题会悄无声息地混进检索结果。

KnowledgeBase.insert_document 里 metadata 合并时 metadata_filter 的最高优先级(_knowledge.py:330-334)。这个顺序是纵深防御的核心——改了它,恶意或 buggy 的 parser 就能把记录塞进别人的租户 scope。

八、本模块最值得学习的设计

第一,流水线 + 每阶段一个数据类型。Section / Chunk / VectorRecord / VectorSearchResult / DocumentSummary,五种类型一一对应五个阶段。这比「一个万能 Document 类扛全流程」清晰得多——每个类型的字段都只在它有意义的阶段出现。这种「让数据类型的生命周期语义显式化」的做法,在任何多阶段处理系统里都值得照搬。

第二,硬边界防越界。Section 不是性能优化、不是代码风格,而是一道结构化的不变量:它让「跨页拼接」这种错误在类型层面就不可表达,而不是靠每个 chunker 作者自觉。这是把「容易出错的判断」从运行时挪到编译/结构时的高级手法。

第三,包装类隔离副作用。Chunk 不带 score / embedding,靠 VectorRecord / VectorSearchResult 包装。这解决了「同一个数据结构在不同阶段有不同可用字段」的污染问题。凡是遇到「这个字段有时有值有时没值」,先想包装类,别想 Optional。

第四,纵深防御的租户隔离。metadata_filter 在 search/list 端过滤、在 insert 端强制覆盖,两端都设防。这不是「信不过调用方」,而是承认「parser 可能 buggy、上游可能传错」——纵深防御的价值就在这里:任何一层失守都还有下一层兜底。

九、阅读建议

先读 _document.py(102 行,半小时)——Section 和 Chunk 是契约,看懂这两个字段表,整条流水线就清晰了。

再读 _knowledge.py 的 search 方法(_knowledge.py:190)——跟着一次查询走完整调用链(第五节那条),这是理解运行时行为的最快路径。

然后读 _chunker/_base.py 的不变量声明 + _approx_token_chunker.py 的 _split_text(_approx_token_chunker.py:106)——看近似 token 切分怎么用 bisect_right 在 UTF-8 字节偏移上做窗口滑动,是个干净的小算法实现。

最后挑一个后端对照读——如果你熟 Milvus 读 _milvus_lite.py,熟 Qdrant 读 _qdrant.py。重点看它怎么把抽象方法落地、怎么把 metadata_filter 翻译成原生 filter 语法。三个都读会发现:差异全在后端 SDK 语法,业务逻辑零差异——这正是抽象基类成功的证据。

可以跳过的:三个后端里挑一个读就够,另外两个对照看 filter 翻译差异即可,不必逐行。

十、阅读完成以后

读完这个模块,你应该能回答:为什么 RAG 被拆成 5 个阶段而不是一个大方法?因为每阶段独立可测、可替换、可复用。为什么 Section 是硬边界?因为它从结构上消灭跨结构单元拼接这种脏数据。代码怎么跑的?search 是批量嵌入 + 并发检索 + (document_id, chunk_index) 去重 + 阈值过滤 + 排序截断。要改从哪改?加格式继承 ParserBase、换策略继承 ChunkerBase、换后端继承 VectorStoreBase——三条扩展路径互不影响。

真正应该带走的,是这套「流水线分阶段 + 每阶段一个不变量类型 + 硬边界防越界 + 包装类隔离副作用 + 纵深防御隔离」的组合拳。它不是为了优雅而优雅,而是每一条都在解决一个具体的工程问题(可测试性 / 脏数据 / 字段污染 / 租户串数据)。把这些思路迁移到你下一个要处理「异构输入 → 可检索单元」的系统里,比记住某个 API 签名有价值得多。


聊聊

💬 留两个问题

1. 低门槛:你做 RAG 时踩过哪些「chunk 切得不对导致检索垃圾」的坑?是按字符切断在词中间,还是把两页不相干的内容拼进了一个 chunk?AgentScope 这种「Section 硬边界 + Chunker 只在边界内切」的结构,能帮你避开其中哪种?

2. 进阶:如果你要做一个多租户的知识库平台,让 A 公司的查询永远查不到 B 公司的数据,你会把隔离做在哪一层?是靠 metadata_filter(像 AgentScope 这样在应用层每次过滤),还是靠物理分 collection,还是两者都要?为什么?

相关推荐

Kitta:Code Review Agent,提升代码审查质量

本文将介绍 Kitta,一套面向领域深度定制的 Code Review Agent。它将通用智能体领域化,通过沉淀项目级专家资产、定制审查流程与领域知识库,并构建在线离线协同进化闭环,精准解决领域特定的代码问题。

技术引领业务创新 305

AI 网关上线 FinOps 会话观测,助力企业优化 Agent 成本

阿里云AI网关Serverless版上线Agent管理功能,可将模型用量细分至各Agent、会话、轮次及模型调用层级,支持ClaudeCode、Codex等主流Agent接入,实现用量归属清晰化。通过整体统计与智能洞察,定位高耗时、高用量任务;结合会话详情,精准分析每轮调用的Token消耗与性能表现,助力企业优化模型选择、上下文设计与工具流程,实现Agent使用成本的精细化管控与持续优化。

技术引领业务创新 414

JEV:一个不会写代码的模型,为什么拿下4000万美元?

2026年,TypeSafeAI推出模型JEV,以“智能if语句”形态实现毫秒级、可校准的概率判断,推动AI系统从“大模型一统”迈向“快慢思考解耦”。它放弃自回归生成,专注结构化决策,通过非自回归并行采样与概率校准(RLCD),将分类、路由等高频判断任务效率提升数十倍。其背后是算子优化、长上下文扩展、训练对齐等层层工程突破的必然结果。在系统架构上,JEV代表“System1”——快速、可靠、可控的判断层,与“System2”(如GPT类推理模型)协同,形成“置信度闸门”式编排。这不仅是技术演进,更是对“何时

技术引领业务创新 326

Agent 时代,前端怎么变?读懂 AG-UI、A2UI 与 MCP Apps 的分工与协同(上)

本文将聚焦到 AG-UI、A2UI、MCP Apps 这三种常见标准及其开发,彻底带你看懂各自的定位、能力与区别。

技术引领业务创新 469

零代码改造:让 AI Agent Sandbox 不再是黑盒

2026年,AIAgent迈向“会干活”时代,阿里云AgentSandbox以MicroVM隔离、每分钟1.5万实例弹性扩容与内存级休眠唤醒,构建安全高效的执行底座。为破解沙箱“黑盒”难题,云监控2.0推出OpenTelemetry无侵入监控(OBI),无需改代码、不重构建镜像,即可自动采集模型调用、工具执行与外部访问链路,实现对大模型生成代码的全链路可观测。结合应用拓扑、调用链与GenAI语义分析,助力性能优化、成本管控与安全审计。三步接入即刻启用,真正实现“安全跑得动,透明看得清”。

技术引领业务创新 390

千问办公 × AgentBridge:连接企业数据,让智能分析触手可及

2026云栖大会,千问办公联合AgentBridge发布“数据分析专家”套件,支持业务人员用自然语言提问,自动调用企业多源数据,完成分析、复核并生成可交付的报告与看板。该套件通过连接ERP、CRM等系统及知识库,实现退单诊断、客户挽留建议等场景的智能分析,提升经营复盘、周报撰写等效率。用户可通过快捷命令一键执行数据质量检查、报告生成与仪表板构建,所有结论附带可核查的数据证据卡,推动数据资产在团队中复用,真正实现“从提问到结论”的高效闭环。

技术引领业务创新 295

拆解爆火的 JEV(下):在 Agent 系统中的 8 类典型应用场景。

本文系统拆解了JEV类快速决策模型在Agent系统中的八大典型应用场景:ReAct行动循环、Web自动化、工具路由、安全守卫、任务评估、模型路由、RAG筛选与上下文管理、实时动态决策。核心思路为“LLM规划生成,JEV高速判断,程序确定执行”,通过毫秒级响应提升决策效率,降低推理成本,适用于高频、有限选项的判断任务,显著优化Agent性能与可扩展性。

技术引领业务创新 268

拆解爆火的 JEV(上):10 分钟看懂这款 Agent 的高速“协处理器”。

JEV是TypeSafe推出的高速决策模型,专为Agent系统设计,解决传统LLM在决策任务中速度慢、成本高的问题。它不生成文本,而是快速回答“选择、评分、判断”类问题,输出带概率与置信度的结构化结果,支持批量处理。通过RLCD训练,提升概率校准度,增强决策可信度。与LLM协同工作,承担高频判断任务,如工单路由、情绪识别、安全评估等,显著降低延迟与成本。适用于自动化分流、安全守卫、动态工具选择等场景,但对复杂指代、多模态、算术计算等仍有限制。定位为Agent系统的“协处理器”,推动智能体高效化发展。

技术引领业务创新 193

NVIDIA Dynamo 部署实战:从环境踩坑到 vLLM 模型上线

本文详解NVIDIA Dynamo 1.0在CentOS 7上部署vLLM模型的实战过程,涵盖内核升级、GCC编译器配置、NVIDIA Container Toolkit安装等关键踩坑点。通过nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.2.0容器镜像,结合Frontend与Worker组件,实现本地Qwen2.5-0.5B-Instruct模型的OpenAI兼容推理服务。验证环节确认GPU可用性、健康状态及接口响应正常,最终提供完整访问地址与故障排查方案。Dynamo以容

技术引领业务创新 542

什么是 Harness?让 AI 从“会回答”变成“可控地做事”

本文提出“Harness”作为LLM/Agent运行时的工程系统,解决模型判断与真实执行之间的鸿沟。它通过四层架构——工作材料、行动能力、控制运行、质量责任,确保任务有正确上下文、可执行工具、安全边界与结果验证。模型决定“做什么”,Harness保障“能否做、如何做、是否完成”。强调:提升Harness比换模型更具杠杆效应,且其复杂度应匹配任务风险与可逆性,避免过度设计。最终,模型的智能需靠工程系统可靠落地。

技术引领业务创新 187

从 Agent Framework 到 Agent Harness,开源 AgentScope 项目新定位

AgentScope2.0作为面向企业任务的通用AgentHarness,通过“服务侧统一编排、沙箱内隔离执行”的架构,实现长程任务的稳定推进。其核心机制覆盖任务规划、信息组织与受控行动三层:以状态管理保障进度连续,通过上下文管线与历史压缩优化模型输入,借助Tool-In-Sandbox模式实现权限与环境隔离。该框架支持可复用的PlanMode、子Agent协同与证据化反馈,助力企业构建ManagedAgents平台,将复杂任务的执行、监控与验收服务化,推动智能体从演示走向规模化落地。

技术引领业务创新 362

大模型训练的网络底座:RoCE/RDMA

大模型训练的通信瓶颈日益凸显,RoCEv2凭借内核旁路、零拷贝与协议卸载三大机制,结合PFC、ECN、DCQCN构建无损网络,成为AI集群主流。通过NVLink+RoCE两级拓扑与NCCL优化,实现高效梯度同步。落地关键:配置无损网络、启用GPUDirect、调优多路径与参数,并以带宽测试与丢包/暂停帧排查保障性能。

技术引领业务创新 537

QLoRA 高效微调完全指南

QLoRA通过NF4分位量化、双重量化与分页优化器,将65B模型微调显存需求从780GB降至48GB以内。其核心在于:4-bit存储主干权重(130GB→36GB),冻结主干避免梯度与优化器状态开销,结合LoRA全层适配与高效训练策略,实现单卡微调大模型。实战中,基于transformers+PEFT+bitsandbytes可轻松在8GB显卡上完成7B模型微调,性能媲美全参微调。

技术引领业务创新 282

GPU推理节点部署与Dynamo访问验证全指南

本文复盘了在定制内核 CentOS 7.3 节点 wc-prodk8s-1-137 上部署 NVIDIA Dynamo vllm-runtime 1.2.0 的完整流程。通过升级至 elrepo 官方内核 5.4.278,清理残留组件并统一 SystemdCgroup,成功解决驱动与 CUDA 兼容性问题。最终通过 Docker 部署 Dynamo 并加载 Qwen 模型,验证前端服务访问正常。核心结论:版本兼容问题需“升级而非绕过”,底层环境清理是关键,可复用于同类机器。

技术引领业务创新 532

用 RBAC 理解权限为什么需要角色

本文以电商后台退款权限管理为切入点,阐述RBAC(基于角色的访问控制)如何解决权限配置重复、维护困难的问题。通过引入“角色”抽象,将零散的用户权限整合为可复用的职责单元,实现权限的集中管理与动态调整。文章进一步延伸至Kubernetes和Agent系统,说明RBAC在资源授权、服务间协作中的通用价值,并强调:权限需由服务端严格校验,前端仅作入口控制;角色决定“能做什么”,属性限制“对谁、在何条件下做”。最终指出,无论前端、后端还是Agent,理解“谁在请求、凭什么、作用于何资源”是构建安全系统的根本。

技术引领业务创新 114

让 Agent 越用越准、成本越来越低:AgentLoop 的 Agent 经验自进化闭环

AgentLoop 是面向 AI Agent 研发和生产运行提供的可观测与持续优化平台。它通过采集 Agent 的模型调用、工具调用和完整执行链路,将原始 Trace 转化为可分析的 Trajectory,并连接评估、实验和经验自进化能力,帮助企业发现问题、验证优化效果,再把真实运行中验证过的有效经验带回 Agent,形成“观测—分析—优化—再验证”的闭环。

技术引领业务创新 570

基于 AgentScope 构建金融级智能体底座实战

FinXScope是阿里云面向金融行业打造的AI原生智能体底座,基于AgentScopeJava构建,具备高可用、安全合规与可扩展性。其六层架构实现从意图理解、三层记忆到双模执行的全链路能力,支持“对话即服务”范式跃迁。通过统一执行引擎、热更新配置、多渠道流式交互及金融级权限管控,助力金融机构在财富管理、合规审查等场景实现智能体规模化落地。已服务超60家客户,验证了企业级智能体运行底座的核心价值。

技术引领业务创新 563

RDMA 与 RoCE 深度解剖:撑起千卡大模型集群的网络基石

本文深度解析了支撑千卡大模型训练的网络基石——RDMA与RoCE。针对传统TCP在延迟、CPU开销和丢包重传上的瓶颈,RDMA通过内核旁路、零拷贝和CPU卸载实现微秒级低延迟通信。RoCEv2基于无损以太网,结合PFC、ECN与DCQCN机制,在成本可控前提下逼近InfiniBand性能。配合NVLink、GPUDirect RDMA与NCCL集合通信库,构建起从节点内到跨节点的高效数据通路。未来,UEC与超节点技术将进一步重塑AI网络架构,让GPU真正“不等数据”,全力投入计算。

技术引领业务创新 267

智能聚类:从海量 Trace 中理解 Agent 的行为和表现

尽管有指标和Trace,Agent问题仍难看清,因汇总数据无法定位波动根源。云监控2.0通过智能聚类,将请求与会话按用户意图和任务主题归类,实现从交互到场景的洞察:Trace聚类识别执行意图,Session聚类拆分用户任务,结合语义向量与自动归因,精准发现高耗时、高摩擦场景。团队可按主题分析资源消耗、交互表现,下钻异常案例,持续追踪需求变化与优化效果,推动从被动排查转向主动改进。

技术引领业务创新 207

Windows 资源管理器无限重启?一招揪出微信/企业微信“WXDrive”插件作祟

Windows10 1607系统中,explorer.exe无限重启致桌面崩溃,经排查锁定罪魁祸首为微信/企业微信的WeDrivePlugin64_97.dll。该DLL因堆栈溢出(异常码0xc0000409)导致资源管理器崩溃。通过命令行禁用自动重启、重命名损坏DLL并修复注册表,可临时恢复系统。建议卸载或更新微信/企业微信,并尽快升级至受支持的Windows版本,以彻底解决兼容性与安全问题。

技术引领业务创新 331

同创星图正式发布:让金融智能体实现「全链路可管可控」(THS)

过去20年我们学会管控代码,未来需驾驭AI。同创星图(AgentAtlas)是同花顺打造的金融智能体全链路运维平台,通过评测、观测、监测、安全四大功能,将智能体从“不敢用”变为“敢用”。它实现上线前准入、运行中实时监控、输出合规审查与全链路安全防护,沉淀可复盘的归因数据,驱动智能体持续进化。目前已有200+智能体接入,稳定观测超1.2亿次调用,真正让智能体走进真实业务生产环境。

技术引领业务创新 508

Agent 的基本任务循环:目标、计划、执行、观察、修正

本文拆解Agent的核心任务循环:目标澄清→计划拆解→执行动作→观察反馈→修正路线→验证结果。强调Agent不是一次性回答,而是通过持续迭代推进任务,将模糊目标转化为可验收成果。关键在于每一步都依赖真实反馈,动态调整,最终实现从“看起来完成”到“真正完成”的验证。人类应在目标、权限、高风险操作和最终验收等关键节点介入,确保安全与责任边界。真正的智能不在于生成答案,而在于构建可靠的任务推进系统。

技术引领业务创新 350

deepseek-v3-moe-mla

DeepSeek-V3 以 671B 总参数实现仅 37B/token 激活,通过 MoE 稀疏架构与 MLA 低秩注意力,大幅降低训练与推理成本。其无辅助损失负载均衡保障专家均衡,MLA 将 KV Cache 压缩至原体积的 1.8%,显存占用下降超 90%。结合 FP8 训练、DualPipe 流水线与 MTP 多 token 预测,278.8 万 H800 小时完成训练,8 卡 H800 即可部署,实现高性能与低成本的平衡。

技术引领业务创新 327

大模型管理中台模型探活设计方案(THS)

本文提出大模型管理中台的“探活”设计方案,解决Gateway对下游模型副本健康状态“盲知”问题。通过管理面主动探测、状态机动态维护、Nacos快照同步与数据面过滤,实现健康副本自动摘除与恢复。核心创新包括:基于config_hash的状态重置、四态健康机(HEALTHY/UNHEALTHY/CONFIG_ERROR/UNKNOWN)、动态配置支持及可视化聚合状态。方案确保高可用、低延迟,从“瞎猜”走向“精准摘除”,显著提升大模型服务稳定性。

技术引领业务创新 482

K8s云原生-GPU 虚拟化切分与算力调度实战

本文记录了在K8s 1.35.6环境下实现GPU资源池化的完整实践,针对T4显卡不支持MIG的限制,选用开源方案HAMi v2.10.0实现显存与算力双维度隔离。通过关闭GPUOperator的驱动和DevicePlugin组件,结合HAMi的调度扩展与运行时拦截机制,将一张物理卡虚拟为10个可调度单位,支持多Pod共享并严格控制资源使用。验证表明,超额申请会被真实拦截,且互不影响。关键经验包括:前置检查、版本对齐、运行时诊断与分层验证。最终实现从“一卡一Pod”到“按需分配”的高效利用,显著提升GPU利用

技术引领业务创新 641

GPT Image 2.5 发布:AI 生图开始真正进入生产力时代

OpenAI 在 9 月 8 日正式发布 ChatGPT Images 2.5。相比 Images 2.0,官方重点其实就四个:生成速度最高提升 50%、参考图人物/主体保持更好、局部编辑更精准、多轮编辑一致性明显增强。同时新增了 Sketch 草图输入、图片局部评论修改、Poster / Merch 等模板。

技术引领业务创新 239

Agent 到底是什么?它不是人格,而是任务执行系统

Agent 不是一个更像人的 AI 角色,而是一套围绕目标运转的任务执行系统。

技术引领业务创新 363

Workspace 与 Sandbox:代码在哪里改,命令在哪里跑

本文通过一个Node.js项目示例,演示了Agent在修改代码、运行测试时的权限控制机制。核心在于工作区(Workspace)与沙箱(Sandbox)的分离:Agent仅能访问指定目录,系统通过Runtime根据配置规则(如denyRead)限制文件和网络访问。以修复slugify()函数为例,沙箱确保其无法读取~/Private等敏感目录,即使命令被允许执行。权限检查在启动前完成,失败则直接拒绝,不依赖运行时错误。实现依赖操作系统级沙箱(如macOS Seatbelt、Linux bubblewrap),

技术引领业务创新 298

MCP 的基本结构:Host、Client、Server、Tools、Resources、Prompts

本文厘清MCP基础结构:用户通过Host(AI应用)接入,由Host内部的Client连接外部Server,Server则提供Tools(行动)、Resources(上下文)和Prompts(流程模板)三类能力。关键在于理解角色分工——模型不直连外部系统,而是由Host统筹管理能力接入与上下文组织。强调先建立“Host-Client-Server”关系图,再深入协议细节,避免将MCP误解为简单工具调用。

技术引领业务创新 624

K8S GPU调度——DRA动态资源分配

DRA(Dynamic Resource Allocation)是Kubernetes中用于管理专用硬件资源(如GPU、TPU等)的原生API框架,通过声明式方式实现设备按属性精确调度。相比传统的DevicePlugin+ExtendedResources模型,DRA支持细粒度匹配(如显存大小、型号、拓扑结构)、资源共享与动态分配,并解耦设备初始化与Pod生命周期。其核心机制类比于存储的CSI,采用DeviceClass定义资源类型,ResourceSlice描述可用资源,ResourceClaim申请资源

技术引领业务创新 318
上一篇: NVIDIA Dynamo 部署实战:从环境踩坑到 vLLM 模型上线
下一篇: 拆解爆火的 JEV(上):10 分钟看懂这款 Agent 的高速“协处理器”。
THS_Allen
THS_Allen 思莱德软件官方账号 思莱德软件官方账号
博客等级 码龄11年 2516粉丝 1160原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值