feat(prompts): prompt 版本化地基 —— 注册表 + 运行期文件覆盖

把散落各服务的硬编码 system prompt 收口为受管注册表,不重编译即可改/回滚/对比:
- shared/prompts:内置默认(随代码) + 运行期覆盖(PROMPTS_FILE) + Get/Keys,并发安全,含单测
- 接入 9 处:mcp-go(graph.extract);dispatcher(eval.quality/eval.refine/guard.jailbreak/
  coordinator.lead/memory.extract,按引用登记默认、无文本重复)
- main 启动调 LoadFile 加载 PROMPTS_FILE 覆盖
- live A/B:覆盖 graph.extract → 图谱抽取 2 条→0 条、向量仍正常(覆盖生效、管道未坏)
- v2(DB 控制面热切换 + 灰度)留后续

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Blizzard
2026-06-30 14:36:04 +08:00
parent 865a47eeea
commit 9a3a816c80
12 changed files with 196 additions and 9 deletions
+3 -2
View File
@@ -9,6 +9,8 @@ import (
"github.com/neo4j/neo4j-go-driver/v5/neo4j"
"github.com/neo4j/neo4j-go-driver/v5/neo4j/auth"
"github.com/sundynix/sundynix-shared/prompts"
)
// Triple 是一条知识三元组(主体-关系-客体)。
@@ -178,8 +180,7 @@ func extractTriples(ctx context.Context, chat *chatClient, text string) ([]Tripl
if !chat.ready() {
return nil, nil
}
const sys = "你是知识图谱抽取器。从用户文本中抽取知识三元组,输出 JSON 数组,每项形如 {\"s\":\"主体\",\"p\":\"关系\",\"o\":\"客体\"}。实体用简洁名词,关系用简短动词短语。只输出 JSON,不要任何解释或代码块标记。"
out, err := chat.complete(ctx, sys, text)
out, err := chat.complete(ctx, prompts.Get(prompts.GraphExtract), text)
if err != nil {
return nil, err
}