feat(mcp-go): RAG 语义切块 —— 递归 + 句界 + 重叠 + rune 安全
替换朴素切块(按行切 + 字节硬截)为工业级语义切块: - 修真 bug:旧版 s[:2000] 按字节切,中文 UTF-8(3 字节/字)会被切碎成乱码; 新版全程按 rune 操作。 - 算法:splitToAtoms(换行/中英句末标点切原子,超大无标点原子按 rune 窗口兜底) → packAtoms(贪心打包到 target=500 字、句末收口,尾块 <100 字并入相邻) → addOverlap(块间 80 字重叠,保跨块上下文)。硬上限 1000。 - chunk.go 独立成文件 + chunk_test.go(空/短/rune安全/大小上界/句界/重叠/超大无标点)。 收益:检索片段语义完整(不再断句)、中文不乱码、跨块上下文不丢 → RAG 召回质量。 make test-go 全绿。后续可加 Markdown 标题路径前缀(结构化文档增强)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,7 +6,6 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"log"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/sundynix/sundynix-shared/contract"
|
||||
@@ -252,19 +251,4 @@ func (e *Engine) Close() {
|
||||
e.graph.close(context.Background())
|
||||
}
|
||||
|
||||
// chunk 朴素切块:按行切,去空白;过长再按长度切。真实系统应做版面/语义切块。
|
||||
func chunk(text string) []string {
|
||||
var out []string
|
||||
for _, line := range strings.Split(text, "\n") {
|
||||
s := strings.TrimSpace(line)
|
||||
if s == "" {
|
||||
continue
|
||||
}
|
||||
for len(s) > 2000 {
|
||||
out = append(out, s[:2000])
|
||||
s = s[2000:]
|
||||
}
|
||||
out = append(out, s)
|
||||
}
|
||||
return out
|
||||
}
|
||||
// chunk 的实现已移到 chunk.go(递归 + 句界 + 重叠 + rune 安全的语义切块)。
|
||||
|
||||
Reference in New Issue
Block a user