v0.7.2: 根目录清理 + Agent 心跳重构 + 内嵌 ONNX 模型

- 根目录清理: branding/docs/knowledge -> assets/, package/tools/deploy -> deploy/
- meta.go: Version 0.7.2, SDKCompatibleVersion 语义改为最高兼容
- Makefile: 版本回退 0.7.2
- registry.go: 系统提示词改用 meta.Version 格式化
- Agent 心跳: reorgGraph 拆分为三个独立循环(archive/merge/review),各自可配间隔
- GraphDB: 新增 sentences 表 + 关系句子溯源 + ClearSentenceID + CleanupOrphanedSentences
- Knowledge: 支持词嵌入向量化器
- NLP 四阶段流水线: Parse -> Extract -> Verify -> Fuse + SentenceRef
- 移除远程 HTTP 解析器(remote_parser.go)
- 新增内嵌 ONNX 模型(vocab + dep_parser.onnx):
  +build onnxruntime: 全量 ONNX Runtime 推理
  !build onnxruntime: 内嵌词表规则式降级解析器
- config: core.agent.onnx_model_path 替代 dep_parser_url
This commit is contained in:
JianFeeeee
2026-07-28 09:56:26 +08:00
parent 1cb3e87dde
commit 2c5f9ff262
47 changed files with 26141 additions and 242 deletions

View File

@ -83,8 +83,9 @@ type Store struct {
mu sync.RWMutex
items map[string]*Knowledge
indexPath string
summaries []string
indexPath string
summaries []string
vectorizer vector.Vectorizer // 可选:词嵌入向量化器,优先于 TF-IDF
}
func NewStore(root string) *Store {
@ -97,6 +98,35 @@ func NewStore(root string) *Store {
}
}
// SetVectorizer 设置词嵌入向量化器,优先于 TF-IDF
func (s *Store) SetVectorizer(v vector.Vectorizer) {
s.vectorizer = v
}
// ReindexWithVectorizer 用给定的向量化器重建所有知识条目的向量索引
func (s *Store) ReindexWithVectorizer(v vector.Vectorizer) {
s.mu.Lock()
defer s.mu.Unlock()
log.Printf("[knowledge] reindex with vectorizer (%d items)", len(s.items))
s.vec = vector.NewStore()
for _, k := range s.items {
vec := v.Vectorize(k.Name + " " + k.Content)
s.vec.Insert(k.Name, k.Name+": "+k.Content, vec, map[string]string{
"name": k.Name, "path": k.Path,
})
}
log.Printf("[knowledge] reindex with vectorizer complete (%d vectors)", s.vec.Size())
}
// vectorize 优先使用词嵌入向量化器,不可用时回退到 TF-IDF
func (s *Store) vectorize(text string) vector.Vector {
if s.vectorizer != nil {
return s.vectorizer.Vectorize(text)
}
return s.veczer.Vectorize(text)
}
func (s *Store) Start() error {
if err := os.MkdirAll(s.root, 0755); err != nil {
return fmt.Errorf("knowledge root: %w", err)
@ -122,7 +152,7 @@ func (s *Store) Search(query string, topK int) []*Knowledge {
topK = 5
}
vec := s.veczer.Vectorize(query)
vec := s.vectorize(query)
results := s.vec.Search(vec, topK)
var out []*Knowledge
@ -171,7 +201,7 @@ func (s *Store) Add(name, content string) error {
}
s.items[id] = k
vec := s.veczer.Vectorize(name + " " + content)
vec := s.vectorize(name + " " + content)
s.vec.Insert(id, name+": "+content, vec, map[string]string{
"name": name, "path": path,
})
@ -202,7 +232,7 @@ func (s *Store) SearchCategories(query string, topK int) []string {
return names
}
vec := s.veczer.Vectorize(query)
vec := s.vectorize(query)
results := s.vec.Search(vec, topK)
var names []string
for _, r := range results {
@ -274,7 +304,7 @@ func (s *Store) BuildTree() *TreeIndex {
}
}
// 获取该条目的向量并压缩
vec := s.veczer.Vectorize(k.Name + " " + k.Content)
vec := s.vectorize(k.Name + " " + k.Content)
preview := []rune(k.Content)
previewStr := ""
if len(preview) > 200 {
@ -303,7 +333,7 @@ func (s *Store) SearchTree(query string, topK int) map[string][]*Knowledge {
topK = 10
}
vec := s.veczer.Vectorize(query)
vec := s.vectorize(query)
results := s.vec.Search(vec, topK*2)
categorized := make(map[string][]*Knowledge)
@ -361,7 +391,7 @@ func (s *Store) scanAll() error {
}
for _, k := range s.items {
vec := s.veczer.Vectorize(k.Name + " " + k.Content)
vec := s.vectorize(k.Name + " " + k.Content)
s.vec.Insert(k.Name, k.Name+": "+k.Content, vec, map[string]string{
"name": k.Name, "path": k.Path,
})