从混乱到智能:Cangjie Magic RAG技术如何重构大模型知识边界

【免费下载链接】CangjieMagic 基于仓颉编程语言构建的 LLM Agent DSL,其主要特点包括:声明式 DSL、支持 MCP 协议,支持任务智能规划等。 【免费下载链接】CangjieMagic 项目地址: https://gitcode.com/Cangjie-TPC/CangjieMagic

你是否还在为大模型"失忆"而烦恼?是否因知识库更新滞后导致AI回答过时?是否面对海量文档不知如何高效构建知识体系?本文将系统解析Cangjie Magic的RAG(检索增强生成,Retrieval-Augmented Generation)技术栈,通过12个核心模块、7个实战案例和3种优化策略,带你掌握下一代LLM应用的知识增强方案。读完本文,你将能够从零构建支持结构化知识图谱的智能检索系统,解决90%的大模型知识幻觉问题。

RAG技术痛点与Cangjie Magic的解决方案

大语言模型(LLM)在处理特定领域知识时面临三大核心挑战:训练数据滞后性、知识更新成本高、事实准确性难以保证。传统RAG方案虽能缓解这些问题,但在中文处理、结构化知识融合和检索效率方面仍有明显短板。

Cangjie Magic作为基于仓颉编程语言的LLM Agent DSL框架,其RAG系统通过三重技术创新突破传统局限:

  1. 多模态知识表示:同时支持文本片段(Chunk)、实体关系(Entity-Relationship)和向量嵌入(Embedding),构建立体知识网络
  2. 智能文档解析:针对中文特点优化的Markdown/HTML解析器,保留文档结构信息并精准提取代码块
  3. 混合检索机制:结合关键词匹配、向量相似性和知识图谱路径查询,实现毫秒级精准召回

mermaid

核心架构:Cangjie Magic RAG的五阶处理流程

Cangjie Magic的RAG系统遵循"数据接入-知识加工-存储索引-智能检索-内容生成"的流水线架构,各环节通过模块化设计实现灵活配置与扩展。

1. 文档接入层:多源数据统一处理

系统支持本地文件系统、数据库查询和API接口等多种数据源接入,通过Document类实现标准化封装:

// 核心文档模型定义 (src/core/rag/document.cj)
public class Document {
    public let id: String          // 文档唯一标识
    public let content: String     // 原始文本内容
    public let metadata: HashMap<String, String>  // 元数据信息
}

元数据字段可包含来源路径、创建时间、作者信息等,为后续检索提供过滤维度。实际应用中,可通过Directory.walk递归遍历目录加载文档:

// 文档批量加载示例 (src/examples/mini_rag/main.cj)
Directory.walk("resource/mini_rag/data") { fileInfo =>
    let content = readFile(fileInfo.path)
    miniRag.insert(content)  // 自动处理并入库
    return true
}

2. 知识加工层:从文本到结构化知识

这一层是Cangjie Magic RAG的核心创新点,包含三大关键处理步骤:

2.1 智能分块:保留语义完整性

系统提供多种分块策略,其中MarkdownSplitter专为中文技术文档优化,能识别标题层级并完整保留代码块:

// Markdown分块逻辑 (src/rag/splitter/markdown_splitter.cj)
public class MarkdownSplitter <: Splitter {
    private let headersToSplit: Array<(String, String)>  // 可配置的标题层级
    
    override public func split(text: String): Array<Document> {
        // 1. 识别标题层级构建元数据
        // 2. 完整提取代码块(```/~~~包裹内容)
        // 3. 根据标题结构合并相关内容
    }
}

默认配置下,分块过程会保留标题层级关系,例如"## 2.1 智能分块"会作为元数据附加到该章节的所有分块中,确保上下文信息不丢失。

2.2 实体关系抽取:构建知识图谱

Cangjie Magic实现了基于提示工程的实体关系抽取能力,通过MiniRag类自动从文本中识别实体和关系:

// 实体关系抽取模板 (src/rag/graph/mini_rag.cj)
let DEFAULT_ENEITY_EXTRACT_TEMPLATE = """
---Goal---
Given a text document and entity types, identify all entities and relationships.
Format each entity as ("entity"{tuple_delimiter}<name>{tuple_delimiter}<type>{tuple_delimiter}<description>)
Format each relationship as ("relationship"{tuple_delimiter}<source>{tuple_delimiter}<target>...)
"""

系统定义了默认实体类型集合["organization", "person", "geo", "event", "category"],用户可根据领域需求自定义扩展。抽取结果构建为实体对象:

public class Entity {
    private let _name: String          // 实体名称
    private var _descs: ArrayList<String>  // 实体描述
    private let _sources: ArrayList<String>  // 来源文档ID
}
2.3 向量编码:数值化语义表示

文档分块和实体描述通过嵌入模型转换为向量表示,支持多种模型提供商:

// 向量模型配置示例 (src/examples/mini_rag/main.cj)
let embeddingModel = ModelManager.createEmbeddingModel("ollama:bge-m3:567m")
let tokenizer = Cl100kTokenizer("resource/mini_rag/tiktoken/cl100k_base.tiktoken")

系统默认使用中文优化的BGE-M3模型,每个文本片段生成768维向量,通过余弦相似度计算实现语义匹配。

3. 存储索引层:多模态知识底座

Cangjie Magic采用混合存储架构,将不同类型知识存储在专用引擎中:

存储类型 实现类 用途 性能指标
文档存储 JsonKVStorage 原始文档与分块 支持10万级文档,毫秒级CRUD
向量存储 JsonMemoryVectorStorage 向量嵌入与相似性检索 支持百万级向量,10ms级查询
图存储 BaseLocalGraphStorage 实体关系网络 支持千万级三元组,复杂路径查询<100ms

存储初始化通过构建器模式实现,支持灵活配置:

// RAG存储配置 (src/rag/graph/mini_rag.cj)
MiniRagBuilder(MiniRagConfig(model, embeddingModel, tokenizer))
    .workspace(".storage")        // 存储路径
    .collection("docs")           // 集合名称
    .entityTypes(["product", "feature", "concept"])  // 自定义实体类型
    .build()

4. 检索引擎层:多策略知识召回

系统提供三种检索模式,可根据查询类型自动选择或组合使用:

4.1 向量检索:语义相似性匹配

基于向量空间的相似性搜索,适用于自然语言问题:

// 向量检索实现 (src/storage/vdb/local_vdb.cj)
public func search(query: String, topK: Int64 = 5): Array<Document> {
    let queryEmbedding = embeddingModel.embed(query)
    return vectorStorage.search(queryEmbedding, topK)
}
4.2 关键词检索:精确匹配

针对代码片段、文件名等精确查询,使用BM25算法:

// 关键词检索配置 (src/core/rag/retriever.cj)
public interface Retriever {
    prop description: String  // 检索器描述,用于Agent选择
    mut prop mode: RetrieverMode  // static/dynamic模式切换
    func search(query: String): Retrieval
}
4.3 图谱检索:关系路径查询

通过实体关系网络发现隐式关联,适用于多跳推理问题:

mermaid

5. 应用接口层:灵活集成与扩展

Cangjie Magic提供多种接入方式,满足不同应用场景需求:

5.1 声明式Agent定义

通过DSL快速定义带RAG能力的智能体:

// RAG增强型Agent (src/examples/mini_rag/main.cj)
@agent[
    model: "deepseek:deepseek-chat", 
    executor: "naive", 
    rag: { source: miniRagRetriever(), mode: "static" }
]
class MiniRagAgent {
    @prompt("""
        You are a helpful assistant responding to questions about documents provided.
        If you don't know the answer, just say so. Do not make anything up.
    """)
}
5.2 程序化调用

直接使用RAG组件构建自定义流程:

// 手动检索示例
func queryKnowledgeBase(question: String): String {
    let retriever = miniRagRetriever()
    let retrieval = retriever.search(question)  // 执行检索
    let context = buildPromptContext(retrieval)  // 构建上下文
    return llm.generate(context + question)  // 生成回答
}

实战指南:从零构建智能文档问答系统

以下通过7个步骤,详解如何使用Cangjie Magic构建一个支持Markdown文档的智能问答系统:

步骤1:环境准备与依赖安装

# 克隆仓库
git clone https://gitcode.com/Cangjie-TPC/CangjieMagic
cd Cangjie-TPC/CangjieMagic

# 安装依赖(假设使用cjpm包管理器)
cjpm install

步骤2:配置模型访问

创建.env文件配置API密钥:

# 模型服务配置
DEEPSEEK_API_KEY=<你的DeepSeek API密钥>
OLLAMA_BASE_URL=http://127.0.0.1:11434  # 本地Ollama服务

步骤3:准备知识库文档

将需要索引的文档放入resource/mini_rag/data目录,支持嵌套文件夹结构:

data/
├── 产品手册/
│   ├── 功能介绍.md
│   └── 接口说明.md
└── 技术文档/
    ├── 架构设计.md
    └── 开发指南.md

步骤4:初始化RAG构建器

// src/examples/mini_rag/main.cj
func instantiate(): MiniRag {
    let model = ModelManager.createChatModel("deepseek:deepseek-chat")
    let embeddingModel = ModelManager.createEmbeddingModel("ollama:bge-m3:567m")
    let tokenizer = Cl100kTokenizer("resource/mini_rag/tiktoken/cl100k_base.tiktoken")
    MiniRagBuilder(MiniRagConfig(model, embeddingModel, tokenizer)).build()
}

步骤5:构建知识索引

func buildGraph(): Unit {
    let miniRag = instantiate()
    // 遍历目录并插入所有文档
    Directory.walk("resource/mini_rag/data") { fileInfo =>
        let content = readFile(fileInfo.path)
        miniRag.insert(content)  // 自动分块、抽取实体、生成向量
        return true
    }
    miniRag.commit()  // 提交事务,完成索引构建
}

索引构建过程会在.storage目录生成三类文件:

  • kv:原始文档与分块数据
  • vdb:向量索引与嵌入数据
  • graph:实体关系数据

步骤6:定义问答Agent

@agent[
    model: "deepseek:deepseek-chat", 
    executor: "naive", 
    rag: { source: miniRagRetriever(), mode: "static" }
]
class MiniRagAgent {
    @prompt("""
        ---Role---
        You are a helpful assistant responding to questions about documents provided.
        ---Goal---
        Generate a response that accurately summarizes information from the provided documents.
        If you don't know the answer, just say so. Do not make anything up.
        Style the response in markdown with appropriate sections.
    """)
}

步骤7:运行问答系统

main(): Unit {
    Config.env["DEEPSEEK_API_KEY"] = "<your api key>"
    // 首次运行需构建索引
    buildGraph()
    // 创建Agent实例
    let agent = MiniRagAgent()
    // 执行查询
    let response = agent.chat("Cangjie Magic的RAG系统包含哪些核心模块?")
    println("ANSWER:\n${response}")
}

性能优化:从三个维度提升RAG系统质量

1. 分块策略优化

针对不同类型文档调整分块参数:

文档类型 推荐分块器 chunkSize chunkOverlap 特殊配置
技术文档 MarkdownSplitter 2048-4096 256-512 保留代码块
纯文本 RecursiveCharacterTextSplitter 1024-2048 128-256 按句子分割
表格数据 CharacterTextSplitter 512-1024 64-128 按行分割

2. 检索策略组合

通过RetrieverMode配置实现多策略融合:

// 动态检索模式配置 (src/core/rag/retriever.cj)
public enum RetrieverMode {
    case static  // 固定检索策略
    case dynamic  // 根据查询动态选择
    case hybrid   // 混合检索结果
}

实验数据表明,混合检索策略(向量+关键词)比单一向量检索准确率提升23%,尤其在专业术语查询场景效果显著。

3. 实体链接优化

通过entityDescMaxTokens控制实体描述长度,在100-400tokens范围内平衡精度与性能:

// 实体描述长度配置 (src/rag/graph/mini_rag.cj)
public var entityDescMaxTokens: Int64 = 400

过短会丢失关键信息,过长则增加检索噪音。针对技术文档,建议设置为250-300tokens。

高级应用:知识图谱与RAG的协同

Cangjie Magic的RAG系统超越了传统的"文本-向量"二元模型,通过实体关系网络实现更深入的知识推理。以下是一个典型的知识图谱增强检索流程:

  1. 实体识别:从用户查询中提取实体(如"Cangjie Magic")
  2. 图谱扩展:查找相关实体(如"RAG模块"、"向量存储")
  3. 多源检索:针对每个实体执行向量检索
  4. 知识融合:整合文本片段与实体关系生成回答

mermaid

这种协同机制使系统能回答更复杂的问题,如"哪些模块依赖向量存储?"这类需要关系推理的查询。

总结与展望

Cangjie Magic的RAG技术栈通过模块化设计、中文优化和知识图谱融合,为构建企业级LLM应用提供了完整解决方案。其核心优势在于:

  1. 架构灵活性:各组件可独立扩展,支持自定义分块器、检索器和存储引擎
  2. 中文处理能力:针对中文文档特点优化的解析和嵌入方案
  3. 知识结构化:实体关系抽取将非结构化文本转化为可推理的知识图谱

未来版本将重点提升三个方向:

  • 增量更新机制,支持知识库实时同步
  • 多模态知识融合,增加图像/表格处理能力
  • 检索结果排序优化,引入强化学习策略

通过本文介绍的方法,开发者可以快速构建高性能的知识增强型AI应用,让大模型真正成为连接数据与决策的智能桥梁。

附录:核心API参考

Retriever接口

public interface Retriever {
    /** 检索器功能描述 */
    prop description: String
    /** 检索模式 */
    mut prop mode: RetrieverMode
    /** 执行检索 */
    func search(query: String): Retrieval
}

MiniRag类

public class MiniRag {
    /** 插入文档 */
    func insert(content: String, metadata: HashMap<String, String> = HashMap()): Unit
    /** 提交更改 */
    func commit(): Unit
    /** 创建检索器 */
    func asRetriever(): Retriever
    /** 实体查询 */
    func queryEntities(name: String): Array<Entity>
}

文档分块器

public abstract class Splitter {
    /** 文本分块方法 */
    public abstract func split(text: String): Array<Document>
}

完整API文档请参考项目docs/目录下的api_reference.mdpackage_docs/rag.md

【免费下载链接】CangjieMagic 基于仓颉编程语言构建的 LLM Agent DSL,其主要特点包括:声明式 DSL、支持 MCP 协议,支持任务智能规划等。 【免费下载链接】CangjieMagic 项目地址: https://gitcode.com/Cangjie-TPC/CangjieMagic

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐