@anvil/知识-核心
你的密码库,可检索.
代码感知知识堆栈——AST级分解,混合检索, 项目图,和跨repo边缘检测。 特务们看到 页:1 整体 代码库,不只是你碰巧打开的文件.
Grep + 嵌入的问题
代码搜索有两种方法之一: 词汇法(grep, fast, dumb) 或 基于嵌入的(vector DB,在编辑上缓慢,对结构盲去). 两者 错过相同的东西: 代码有 图表 结构。 一个功能不是 只是一大堆文字——它进口东西,被东西召唤, 执行东西,生活在一个包里, 谈话到其他重置.
知识核心把密码库当成一个图表和一个工具 同时. 树保姆将每种支持的语言分析为 AST块。 一个向量存储 + BM25 + 一个工程图形全部回答 相同的查询, 连接到一个排序列表中 。 检索者知道什么时候 你在问一个标识符对一个错误代码对一个自然 - 语言问题和相应的信号加权.
import {
indexFromPath,
getRetriever,
loadKnowledgeConfig,
} from '@esankhan3/anvil-knowledge-core';
// Build a fully-resolved KnowledgeConfig: YAML at
// ~/.anvil/projects/<project>/factory.yaml, overlaid by CODE_SEARCH_*
// env vars. Or hand-construct one — the indexer accepts any shape.
const config = loadKnowledgeConfig('space-tourism');
// Index once — incremental thereafter. Pass config explicitly so
// CODE_SEARCH_* env vars (provider, model, dims, API key, base URL)
// actually reach the embedder — pre-P1 they were silently ignored.
await indexFromPath('space-tourism', '/path/to/workspace', { config });
// Retrieve — vector + BM25 + 1-hop graph + cross-encoder rerank.
// Pass the same config so query-time embedder matches the index.
// getRetriever() also hard-errors on vector-space mismatch (P2) so
// silent provider drift is impossible.
const retriever = await getRetriever('space-tourism', config);
const result = await retriever.retrieve(
'where do we validate booking seat tiers?',
);
console.log(result.chunks.length, 'chunks'); // ranked, deduped
console.log(result.graphContext); // related symbols
console.log(result.totalTokens); // budgeted
你得到的东西
AST 认识块
tree-sitter WASM 解析类型脚本, JavaScript, TSX, Go, Python,
Rust, Java, 和 PHP 进入适当的函数/ 类/ 方法
边框。 不再将一个函数切成两半的块 。 缩写
没有语法的语言倒行逆施,所以没有什么是无索引的.
默认递增
索引员读到 git rev-parse HEAD,对上一个
索引了SHA, 并且只重装改变的东西。 删除的文件获得
从向量存储中移除。 嵌入是独立的
递增的 —— 它向 LanceDB 传递新的块ID , 并且只有
嵌入三角洲。 大回扣永远保持快.
混合检索,四个阶段
- BM25 平行向量 ——语义回想+语法回想.
- 对等排名组合 ——不设一统.
- AST 三方扩展 - 召集呼叫者、被呼叫者以及 通过项目图表键入引用.
- 交叉编码器重新排序 默认的 Quen3- Ranker; Cohere / Voyage / OpenAI相容可互换.
查询分类员选择适应性权重——识别器精度 BM25,自然语言向量倾斜,出错代码都倾斜.
6个嵌入式提供者,4个重排
内嵌 : (原始内容存档于2013-10-12) (英语). Codestral / Mistral / Voyage / OpenAI / Ollama 双子座 OAuth
(自动刷新已过期的访问符号通过 refresh_token·
OpenAI 兼容 / 自定义 auto (根据配置的选取).
重新排序 : Ollama (默认) qwen2.5-coder:7b qwen3:0.6b是一个
静静无声,然后被放弃) 相机 相机 相机 相机 OpenAI 兼容 .
插入符合成本/质量/纬度曲线的任何内容.
明确配置 + 覆盖
KnowledgeConfig 是单项合同. EmbeddingProviderConfig
带 {provider, model?, dimensions?, apiKey?, baseUrl?, ollamaHost?}· ;
RerankerProviderConfig 带 {provider, model?, apiKey?, baseUrl?, timeoutMs?}。 。 。 . loadKnowledgeConfig(project) 读取工程 YAML
然后覆盖 CODE_SEARCH_* (原始内容存档于2013-10-12) (中文(简体) ). env vars (nEMBEDDING_PROVIDER 编号 :
_MODEL 编号 : _DIMENSIONS 编号 : _API_KEY 编号 : _BASE_URL 编号 : OLLAMA_HOST 编号 :
RERANKER_PROVIDER 编号 : _MODEL 编号 : _API_KEY 编号 : _BASE_URL 编号 :
RETRIEVAL_MAX_CHUNKS 编号 : _MAX_TOKENS 编号 : AUTO_INDEX) (中文(简体) ). 提供者
分类仍然读取有文献记载的销售商MISTRAL_API_KEY, (中文(简体) ),
OPENAI_API_KEY,.)作为被贬低的倒计时——每读一读
发出一发一发的 stderr 警告; 库 env 读取在 1.0 中被删除 .
矢量空间安全
getRetriever(project, config?) 读取每个repo的 index_meta.json
打开 如果记录 embeddingProvider 和我们不匹配
当前配置, 它扔出一个硬错误 —— 永远不返回垃圾
从一个配置漂移的向量。 (前P2,无声空间不匹配是
canonical "结果无用,没有出错"bug. )
项目图
A 类 graphology 指导多图缝合 每回波一起.
节点是实体(函数,类,类型,模块),边缘是
导入 / 调用 / 继承 / 包含 / 类型- refs 。 卢万
社区检测群集相近的代码
可以浮出“认证子系统”而不是四个分散的文件.
跨雷波边缘探测
涉及共享类型、卡夫卡专题、HTTP的14个战略 端点, gRPC, 数据库, env vars, npm/工作空间分解, k8s, docker-compose),原生定义,Redis,S3和共享常数. 加上一个LLM-受精语义的边缘层 对于病例的正格克斯不能 抓起来.
由LLM驱动,在它重要的地方
回波剖析(指印文件 → LLM → 键入) RepoProfile, (中文(简体) ),
由指纹散列缓存),语义边缘推论,项目
汇总生成,RAG质量评价. 所有路由经过
@anvil/agent-core 所以,同样的路由器, 重试,和成本分类账
电源 代理堆积 电能知识摄取.
结构散列
computeStructuralHash 将来源化——去除评论,
折叠出白空间,使标识符正常化 —— SHA-256s
结果。 用于块拆卸 财务报告和审定财务报表 与 @anvil/memory-core
所以内存漂移检测 和块分解 说相同的语言.
一览建筑
git repo(s)
│
▼
┌─────────────────────────────────────────────────────────┐
│ Indexing │
│ walk + git diff → tree-sitter chunks → AST graph │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ LanceDB BM25 (FTS) project graph │
│ (vectors) + cross-repo edges │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ HybridRetriever │
│ query classifier ─▶ adaptive weights │
│ vector ⫽ BM25 → RRF → AST expansion → rerank │
└─────────────────────────────────────────────────────────┘
│
▼
ranked chunks + graph context
两个消费者,一叠: @esankhan3/anvil-cli 通过
anvil index 在管道中取回;
@esankhan3/code-search-mcp 曝光与 MCP 相同的检索器
任何代理人都可以调用的工具.
存储布局
~/.anvil/knowledge-base/<project>/
<repo>/chunks.ndjson # the repo's chunks (consumed by embedder)
deleted_files.json # incremental embed cleanup
system_graph_v2.json # merged project graph
PROJECT_GRAPH.json # LLM-generated semantic graph
PROJECT_SUMMARY.md # human-readable companion
lancedb/ # vector store
<repo>/
profile.json # cached RepoProfile
graph.json # per-repo AST graph
GRAPH_REPORT.md # quality report
index_meta.json # { lastIndexedSha, files, chunkCount }
所有东西都放在磁盘上,可以检查,方便点 感(项目图+摘要).
哲学
春克应该遵循代码形状,而不是字节数. AST 边界 保持整个函数。 检索质量从块开始.
没有单一的检索信号就足够了. 矢量丢失标识符 . BM25 错过了解释。 图形错过了文本形状的所有内容 . Hybrid + 适应性加权是唯一诚实的答案.
递增或无. 每条输油管都有异常指数. 完整的再索引是不可接受的; 引擎处理前一个 SHA作为负载输入.
没有供应商锁定. 兰斯DB在磁盘上. graphology 正在处理中.
可插件嵌入器+再排出. 在不重写的情况下交换任意一层
其余部分.
两个表面,一个引擎. CLI 用户通过检索 管道; MCP 用户通过工具调用获得. 检索 管道是同一个代码路径.
状态
平稳:块、AST图、混合检索、增量 指数化,6个嵌入器,4个复排器,14个交叉复排器 战略,项目图,结构散列. 飞行中:富人 图表查询和更深的RAG-eval带.