Skip to main content

AutoDev DocQL

一、DocQL 概述

DocQL(Document Query Language)是一个类 JSONPath 的文档查询语言,专门设计用于在文档中查询目录(TOC)、实体(Entities)和内容(Content)。它既支持用户在 UI 中交互使用,也适合 AI Agent 程序化调用。

核心设计理念

$.toc[?(@.level==1)]          // 查询一级标题
$.entities[?(@.type=="API")] // 查询所有 API 实体
$.content.heading("架构") // 查询包含"架构"的章节内容
$.code.class("DocQLLexer") // 查询源代码中的类

二、系统架构

2.1 架构层次图

┌─────────────────────────────────────────────────────────────────────┐
│ 应用层 (Application Layer) │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ DocumentAgent │ │ CLI/TUI (TS) │ │ Compose UI │ │
│ │ (AI 驱动查询) │ │ (交互式查询) │ │ (可视化查询) │ │
│ └────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘ │
└───────────┼──────────────────────┼──────────────────────┼───────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────┐
│ 工具层 (Tool Layer) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ DocQLTool │ │
│ │ • Smart Search(关键词智能搜索) │ │
│ │ • Direct Query(标准 DocQL 查询) │ │
│ │ • Multi-Level Keyword Expansion(多级关键词扩展) │ │
│ └──────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────┬───────────────────────────────────┘


┌─────────────────────────────────────────────────────────────────────┐
│ 查询引擎 (Query Engine) │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ DocQLLexer │→ │DocQLParser │→ │DocQLQuery │→ │DocQLExecutor│ │
│ │ (词法分析) │ │ (语法分析) │ │ (AST) │ │ (执行器) │ │
│ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │
└─────────────────────────────────┬───────────────────────────────────┘


┌─────────────────────────────────────────────────────────────────────┐
│ 注册表层 (Registry Layer) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ DocumentRegistry │ │
│ │ • 内存文档缓存 • 解析器管理 • 多文件查询融合 │ │
│ │ • IndexProvider 接口(桥接持久化存储) │ │
│ └──────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────┬───────────────────────────────────┘


┌─────────────────────────────────────────────────────────────────────┐
│ 解析层 (Parser Layer) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Markdown │ │ Tika(PDF/ │ │ Code(Tree- │ │
│ │ Parser │ │ DOCX/PPTX) │ │ Sitter) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ DocumentParserService 接口统一抽象 │
└─────────────────────────────────────────────────────────────────────┘

2.2 核心组件

组件位置职责
DocQLLexer
词法分析,将查询字符串转换为 Token 流
DocQLParser
语法分析,将 Token 解析为 AST
DocQLSyntax
定义 AST 节点和过滤条件
DocQLExecutor
执行查询,返回结构化结果
DocumentRegistry
文档注册和缓存管理
DocQLTool
Agent 工具封装,支持智能搜索

三、查询语法详解

3.1 语法结构 (EBNF)

query         := '$' path
path := (property | arrayAccess | functionCall)*
property := '.' IDENTIFIER
arrayAccess := '[' (STAR | NUMBER | filter) ']'
filter := '?' '(' condition ')'
condition := '@.' IDENTIFIER operator value
operator := '==' | '!=' | '~=' | '=~' | '>' | '>=' | '<' | '<='
| 'startsWith' | 'endsWith'
value := STRING | NUMBER | REGEX
functionCall := '.' IDENTIFIER '(' STRING? ')'

3.2 查询类型

3.2.1 TOC(目录)查询

$.toc[*]                        # 获取所有目录项
$.toc[0] # 获取第一个目录项
$.toc[?(@.level==1)] # 获取一级标题
$.toc[?(@.title~="架构")] # 标题包含"架构"
$.toc[?(@.level>1)] # level > 1 的目录项
$.toc[?(@.title =~ /MCP/i)] # 正则匹配(忽略大小写)
$.toc[?(@.title startsWith "Ch")] # 标题以"Ch"开头

3.2.2 Entities(实体)查询

$.entities[*]                       # 获取所有实体
$.entities[?(@.type=="API")] # 获取 API 类型实体
$.entities[?(@.type=="ClassEntity")]# 获取类实体
$.entities[?(@.name~="User")] # 名称包含"User"

3.2.3 Content(内容)查询

$.content.heading("架构")       # 查询标题匹配的章节内容
$.content.chapter("1.2") # 查询章节 1.2
$.content.h1("Introduction") # H1 标题
$.content.h2("Design") # H2 标题
$.content.grep("关键词") # 全文搜索
$.content.chunks() # 获取所有内容块

3.2.4 Code(代码)查询

$.code.class("DocQLLexer")      # 查询类的完整源码
$.code.function("tokenize") # 查询函数实现
$.code.classes[*] # 列出所有类
$.code.functions[*] # 列出所有函数
$.code.classes[?(@.name~="Lexer")] # 模糊匹配类名
$.code.query("tokenize") # 关键词搜索代码

3.2.5 Files(文件)查询

$.files[*]                          # 列出所有文件
$.files[?(@.path contains "docs")] # 按路径过滤
$.files[?(@.extension == "md")] # 按扩展名过滤

4.1 多级关键词扩展策略

DocQL 的 Smart Search 采用三级关键词扩展策略:

原始查询: "base64 encoding"

Level 1 (Primary) - 最精确
├── "base64 encoding"
├── "base64 encoder"
└── "base64 encode"

Level 2 (Secondary) - 组件词
├── "base64"
└── "encoding"

Level 3 (Tertiary) - 词干变体
├── "encode"
├── "encoded"
└── "encoder"

4.2 自适应搜索策略

enum class SearchStrategy {
KEEP, // 结果数量理想,保持当前级别
EXPAND, // 结果太少,扩展到下一级别
FILTER // 结果太多,使用 secondaryKeyword 过滤
}

// 策略判断逻辑
when {
resultCount < minThreshold && level < 3 -> EXPAND
resultCount > maxThreshold -> FILTER
resultCount in idealRange -> KEEP
}

4.3 多通道融合搜索

┌─────────────────────────────────────────────────┐
│ Smart Search 流程 │
├─────────────────────────────────────────────────┤
│ 1. 并行查询多个通道: │
│ • $.code.classes[?(@.name ~= "keyword")] │
│ • $.code.functions[?(@.name ~= "keyword")] │
│ • $.content.heading("keyword") │
│ • $.entities[?(@.name ~= "keyword")] │
│ │
│ 2. RRF (Reciprocal Rank Fusion) 融合排名 │
│ │
│ 3. Composite Scorer 评分: │
│ • BM25: 词频相关性 (40%) │
│ • Type: 代码实体优先 (30%) │
│ • NameMatch: 名称匹配 (30%) │
│ │
│ 4. 返回 Top-K 结果 │
└─────────────────────────────────────────────────┘

五、文档模型

5.1 核心数据结构

// 文档文件
data class DocumentFile(
val name: String,
val path: String,
val metadata: DocumentMetadata,
val toc: List<TOCItem>, // 目录结构
val entities: List<Entity> // 提取的实体
)

// 目录项
data class TOCItem(
val level: Int, // 层级 (1=H1, 2=H2, ...)
val title: String, // 章节标题
val anchor: String, // 锚点 ID
val lineNumber: Int?, // 行号
val children: List<TOCItem> // 子章节
)

// 实体类型
sealed class Entity {
data class Term(name, definition, location) // 术语
data class API(name, signature, location) // API
data class ClassEntity(name, packageName, location) // 类
data class FunctionEntity(name, signature, location) // 函数
}

// 文档块(带位置信息)
data class DocumentChunk(
val documentPath: String,
val chapterTitle: String?,
val content: String,
val position: PositionMetadata? // 精确位置追踪
)

5.2 位置追踪系统

sealed class DocumentPosition {
// 行范围(Markdown、源代码)
data class LineRange(startLine, endLine, startOffset?, endOffset?)

// 页范围(PDF)
data class PageRange(startPage, endPage)

// 段落位置(DOCX)
data class SectionRange(sectionId, paragraphIndex?)
}

// 位置元数据
data class PositionMetadata(
val documentPath: String,
val formatType: DocumentFormatType,
val position: DocumentPosition
) {
fun toLocationString(): String
// e.g., "/path/doc.md:10-15" 或 "/path/doc.pdf:page 5"
}

六、多格式解析器

6.1 解析器架构

interface DocumentParserService {
suspend fun parse(file: DocumentFile, content: String): DocumentTreeNode
suspend fun parseBytes(file: DocumentFile, bytes: ByteArray): DocumentTreeNode
suspend fun queryHeading(keyword: String): List<DocumentChunk>
suspend fun queryChapter(chapterId: String): DocumentChunk?
}

6.2 支持的格式

格式解析器平台特性
Markdown (.md)MarkdownDocumentParserCommonJetBrains Markdown 库,层次化 TOC
PDF (.pdf)TikaDocumentParserJVMApache Tika,页码追踪
Word (.docx/.doc)TikaDocumentParserJVMApache Tika,段落提取
PowerPoint (.pptx)TikaDocumentParserJVMApache Tika
源代码 (.kt/.java/...)CodeDocumentParserJVMTree-Sitter,类/函数提取

6.3 代码解析(Tree-Sitter)

class CodeDocumentParser : DocumentParserService {
// 支持语言
val supportedLanguages = listOf(
Language.JAVA, Language.KOTLIN, Language.PYTHON,
Language.JAVASCRIPT, Language.TYPESCRIPT,
Language.GO, Language.RUST, Language.CSHARP
)

// 提取结构
// - 类定义 → Entity.ClassEntity + TOCItem
// - 函数/方法 → Entity.FunctionEntity + 嵌套 TOCItem
// - 完整源码保留用于 $.code.class("Name") 查询
}

七、RAG 场景应用

7.1 DocumentAgent 集成

class DocumentAgent(
llmService: KoogLLMService,
parserService: DocumentParserService,
...
) : MainAgent<DocumentTask, ToolResult.AgentResult> {

// 注册 DocQLTool
init {
toolRegistry.registerTool(DocQLTool())
}

// 系统提示词包含 DocQL 使用指南
private suspend fun buildSystemPrompt(): String {
return """
## Code Queries ($.code.*)
- $.code.class("ClassName") - Get full class source code
- $.code.function("funcName") - Get function implementation

## Document Queries ($.content.*)
- $.content.heading("title") - Find section by heading
- $.toc[*] - Get table of contents

## Smart Capabilities
- Automatic Summarization for large content
- SubAgent system for follow-up analysis
""".trimIndent()
}
}

7.2 索引与缓存机制

┌─────────────────────────────────────────────────────────────┐
│ 文档访问流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ DocQLTool.execute() │
│ │ │
│ ▼ │
│ DocumentRegistry.queryDocument(path, query) │
│ │ │
│ ├── 1. 检查内存缓存 │
│ │ │ │
│ │ └── 命中 → 直接执行查询 │
│ │ │
│ ├── 2. 检查 IndexProvider (持久化存储) │
│ │ │ │
│ │ └── 命中 → 加载到内存 → 执行查询 │
│ │ │
│ └── 3. 未找到 → 返回错误 │
│ │
└─────────────────────────────────────────────────────────────┘

7.3 重排序评分模型

class CompositeScorer {
// 组合评分 = BM25 × 0.4 + TypeScore × 0.3 + NameMatch × 0.3

// BM25: 词频-逆文档频率
val bm25Scorer: BM25Scorer

// 类型优先级: Class > Function > Chunk > Other
val typeScorer: TypeScorer

// 名称匹配: 精确匹配 > 前缀匹配 > 包含匹配
val nameMatchScorer: NameMatchScorer
}

// RRF 融合多来源排名
class RRFScorer<T> {
fun fuse(rankedLists: Map<String, List<T>>): List<ScoredItem<T>>
// RRF Score = Σ 1/(k + rank_i)
}

八、使用场景

8.1 知识库问答

用户: "AuthService 的实现原理是什么?"

Agent 执行流程:
1. DocQLTool: {"query": "$.code.class(\"AuthService\")"}
→ 返回完整的 AuthService.kt 源码

2. AnalysisAgent: 自动摘要大型代码
→ 返回结构化的类描述

3. 合成回答: 结合代码和分析结果

8.2 文档导航

用户: "显示所有关于架构的章节"

Agent 执行:
1. DocQLTool: {"query": "$.content.heading(\"架构\")"}
2. 返回匹配的章节列表和内容摘要

8.3 API 探索

用户: "有哪些跟用户相关的 API?"

Agent 执行:
1. Smart Search: {"query": "User", "maxResults": 20}
2. 多通道并行:
- $.code.classes[?(@.name ~= "User")]
- $.code.functions[?(@.name ~= "User")]
- $.entities[?(@.name ~= "User")]
3. RRF 融合 + 重排序
4. 返回 Top-20 相关结果

九、设计亮点

9.1 轻量级查询语言

  • 类 JSONPath 语法:开发者熟悉,学习成本低
  • 声明式查询:表达意图而非过程
  • 渐进式复杂度:简单查询到高级过滤

9.2 Kotlin 多平台支持

┌─────────────────────────────────────────┐
│ mpp-core │
│ (commonMain - 跨平台核心逻辑) │
│ │
│ DocQL 解析器 / 执行器 │
│ DocumentRegistry │
│ 基础解析器 (Markdown) │
├──────────────────┬──────────────────────┤
│ jvmMain │ jsMain │
│ │ │
│ Tika (PDF/DOCX) │ JS 导出层 │
│ Tree-Sitter │ JsDocumentAgent │
│ CodeParser │ │
└──────────────────┴──────────────────────┘

9.3 智能降级策略

  1. 精确查询模糊匹配全文搜索
  2. 代码结构文档内容全量扫描
  3. 内存缓存索引加载实时解析

9.4 可扩展架构

  • 解析器工厂DocumentParserFactory.createParser(formatType)
  • 评分模型接口ScoringModel
  • 索引提供者DocumentIndexProvider

十、总结

DocQL 是一个为 RAG(检索增强生成)场景设计的轻量级文档查询语言,具有以下核心优势:

特性说明
统一查询接口一套语法查询文档、代码、API
智能搜索多级关键词扩展 + RRF 融合排序
精确定位行号/页码/段落级别的位置追踪
多格式支持Markdown、PDF、Word、源代码
Agent 友好结构化输出,易于 LLM 理解和使用
跨平台Kotlin Multiplatform,JVM/JS 通用