core: pass ReasoningContent to assistant messages in process.go

- process.go: attach resp.ReasoningContent when building assistant messages
- deepseek.lua v2.1.0: remove last_reasoning closure hack; rely on
  core-provided reasoning_content in messages
- openai.lua: strip reasoning_content from messages in transform_request
  (not supported by OpenAI API)
This commit is contained in:
root
2026-07-28 17:06:59 +08:00
parent f91b20ee16
commit 51f190e0b6
10 changed files with 263 additions and 89 deletions

View File

@ -30,11 +30,28 @@ type Vectorizer interface {
Vectorize(text string) vector.Vector
}
// ExtractorConfig 三元组提取器配置
type ExtractorConfig struct {
FusionAlpha float64 // syntax_conf 权重,默认 0.4
FusionBeta float64 // vector_conf 权重,默认 0.6
FusionThreshold float64 // 最终阈值,默认 0.3
}
// DefaultExtractorConfig 返回默认的提取器配置
func DefaultExtractorConfig() ExtractorConfig {
return ExtractorConfig{
FusionAlpha: 0.4,
FusionBeta: 0.6,
FusionThreshold: 0.3,
}
}
// Extractor 三元组提取器
type Extractor struct {
parser Parser
fallack Parser // 降级用 POS 模板解析器
embedder Vectorizer // 可选:用于 TransE 语义验证
fusionCfg ExtractorConfig
}
// NewExtractor 创建提取器。
@ -45,8 +62,9 @@ func NewExtractor(parser Parser) *Extractor {
parser = defaultParser
}
return &Extractor{
parser: parser,
fallack: newFallbackParser(),
parser: parser,
fallack: newFallbackParser(),
fusionCfg: DefaultExtractorConfig(),
}
}
@ -55,6 +73,21 @@ func (e *Extractor) SetEmbedder(ev Vectorizer) {
e.embedder = ev
}
// SetFusionWeights 设置三元组融合裁决的权重参数。
// - alpha: syntax_conf 权重 (默认 0.4)
// - beta: vector_conf 权重 (默认 0.6)
// - threshold: 最终阈值 (默认 0.3)
func (e *Extractor) SetFusionWeights(alpha, beta, threshold float64) {
e.fusionCfg.FusionAlpha = alpha
e.fusionCfg.FusionBeta = beta
e.fusionCfg.FusionThreshold = threshold
}
// FusionConfig 返回当前融合裁诀配置
func (e *Extractor) FusionConfig() ExtractorConfig {
return e.fusionCfg
}
// Extract 从文本中提取三元组(完整四阶段流水线)
// Phase 1: 句法解析(LTP 分词 → POS 标注 → 依存句法树)
// Phase 2: 结构初筛(依存模板 / POS 模板 → 候选三元组 + syntax_conf)
@ -104,7 +137,7 @@ func (e *Extractor) Extract(text string) *TripleSet {
// ——— Phase 4: 融合裁决 ———
if len(triples) > 0 {
triples = fuseTriples(triples)
triples = fuseTriples(triples, e.fusionCfg)
}
allTriples = append(allTriples, triples...)
@ -140,37 +173,28 @@ func verifyTriples(triples []Triple, embedder Vectorizer) []Triple {
// ——— Phase 4: 融合裁决 ———
const (
fusionAlpha = 0.4 // syntax_conf 权重
fusionBeta = 0.6 // vector_conf 权重
fusionThreshold = 0.3 // 最终阈值
)
// fuseTriples 融合裁决:线性加权计算 final_score,截断阈值,降序输出
// 输入:候选三元组(带 syntax_conf + vector_conf)
// 处理:final_score = α * syntax_conf + β * vector_conf
// 输出:通过阈值且降序排列的最终三元组
func fuseTriples(triples []Triple) []Triple {
func fuseTriples(triples []Triple, cfg ExtractorConfig) []Triple {
if len(triples) == 0 {
return triples
}
// 计算 final_score 并更新 Score 字段
for i := range triples {
t := &triples[i]
finalScore := fusionAlpha*t.Score + fusionBeta*t.VectorConf
finalScore := cfg.FusionAlpha*t.Score + cfg.FusionBeta*t.VectorConf
t.Score = finalScore
}
// 截断低分项
kept := make([]Triple, 0, len(triples))
for _, t := range triples {
if t.Score >= fusionThreshold {
if t.Score >= cfg.FusionThreshold {
kept = append(kept, t)
}
}
// 降序排列
sort.Slice(kept, func(i, j int) bool {
return kept[i].Score > kept[j].Score
})