feat: add fallback mode for AI agents and update knowledge base handling
- Introduced AIAgentFallbackMode with options for NoAnswer and SuggestRetry. - Updated AI agent edit component to include fallback mode selection. - Modified API types and payloads to accommodate fallback mode. - Removed deprecated KnowledgeFallbackMode and related logic from knowledge base. - Adjusted knowledge retrieval and response handling to utilize new fallback logic. - Updated tests to reflect changes in fallback mode handling for AI agents.
This commit is contained in:
@@ -19,7 +19,7 @@ func buildKnowledgeGuardDecision(aiAgent models.AIAgent, retrieveResult *retriev
|
||||
if retrieveResult == nil || len(retrieveResult.KnowledgeBaseIDs) == 0 {
|
||||
return knowledgeGuardDecision{}
|
||||
}
|
||||
fallbackReply := resolveKnowledgeFallbackReply(aiAgent, retrieveResult.FallbackMode)
|
||||
fallbackReply := resolveKnowledgeFallbackReply(aiAgent)
|
||||
if len(retrieveResult.Hits) == 0 {
|
||||
return knowledgeGuardDecision{FallbackReply: fallbackReply}
|
||||
}
|
||||
@@ -32,15 +32,13 @@ func buildKnowledgeGuardDecision(aiAgent models.AIAgent, retrieveResult *retriev
|
||||
}
|
||||
}
|
||||
|
||||
func resolveKnowledgeFallbackReply(aiAgent models.AIAgent, fallbackMode enums.KnowledgeFallbackMode) string {
|
||||
func resolveKnowledgeFallbackReply(aiAgent models.AIAgent) string {
|
||||
if reply := strings.TrimSpace(aiAgent.FallbackMessage); reply != "" {
|
||||
return reply
|
||||
}
|
||||
switch fallbackMode {
|
||||
case enums.KnowledgeFallbackModeSuggestRetry:
|
||||
switch aiAgent.FallbackMode {
|
||||
case enums.AIAgentFallbackModeSuggestRetry:
|
||||
return "当前知识库里没有找到足够明确的信息,你可以换个更具体的问法再试一次。"
|
||||
case enums.KnowledgeFallbackModeTransferHuman:
|
||||
return "当前知识库里没有找到足够明确的信息,建议转人工进一步处理。"
|
||||
default:
|
||||
return "当前知识库暂无明确信息。"
|
||||
}
|
||||
|
||||
@@ -12,9 +12,9 @@ import (
|
||||
|
||||
func TestBuildKnowledgeGuardDecisionFallsBackWhenKnowledgeMisses(t *testing.T) {
|
||||
agent := newKnowledgeGuardAgentFixture()
|
||||
agent.FallbackMode = enums.AIAgentFallbackModeSuggestRetry
|
||||
decision := buildKnowledgeGuardDecision(agent, &retrievers.KnowledgeRetrieveResult{
|
||||
KnowledgeBaseIDs: []int64{1},
|
||||
FallbackMode: enums.KnowledgeFallbackModeSuggestRetry,
|
||||
})
|
||||
|
||||
if decision.FallbackReply != "当前知识库里没有找到足够明确的信息,你可以换个更具体的问法再试一次。" {
|
||||
@@ -30,7 +30,6 @@ func TestBuildKnowledgeGuardDecisionUsesAgentFallbackMessage(t *testing.T) {
|
||||
agent.FallbackMessage = "请联系人工客服"
|
||||
decision := buildKnowledgeGuardDecision(agent, &retrievers.KnowledgeRetrieveResult{
|
||||
KnowledgeBaseIDs: []int64{1},
|
||||
FallbackMode: enums.KnowledgeFallbackModeNoAnswer,
|
||||
})
|
||||
|
||||
if decision.FallbackReply != "请联系人工客服" {
|
||||
@@ -45,8 +44,7 @@ func TestBuildKnowledgeGuardDecisionInjectsStrictInstructionOnHit(t *testing.T)
|
||||
Hits: []rag.RetrieveResult{
|
||||
{KnowledgeBaseID: 1, Score: 0.88},
|
||||
},
|
||||
AnswerMode: enums.KnowledgeAnswerModeStrict,
|
||||
FallbackMode: enums.KnowledgeFallbackModeNoAnswer,
|
||||
AnswerMode: enums.KnowledgeAnswerModeStrict,
|
||||
})
|
||||
|
||||
if decision.FallbackReply != "" {
|
||||
@@ -65,5 +63,7 @@ func TestBuildKnowledgeGuardDecisionInjectsStrictInstructionOnHit(t *testing.T)
|
||||
}
|
||||
|
||||
func newKnowledgeGuardAgentFixture() models.AIAgent {
|
||||
return models.AIAgent{}
|
||||
return models.AIAgent{
|
||||
FallbackMode: enums.AIAgentFallbackModeNoAnswer,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,6 @@ type KnowledgeRetrieveResult struct {
|
||||
ContextText string
|
||||
TopScore float64
|
||||
AnswerMode enums.KnowledgeAnswerMode
|
||||
FallbackMode enums.KnowledgeFallbackMode
|
||||
Trace *rag.RetrieveTrace
|
||||
TraceItems []callbacks.RetrieverTraceItem
|
||||
TraceSummary callbacks.RetrieverTraceSummary
|
||||
@@ -127,7 +126,7 @@ func (r *KnowledgeRetriever) RetrieveContextByOptions(ctx context.Context, opts
|
||||
ret.ContextResults = limitContextResults(ret.ContextResults, maxContextItems)
|
||||
ret.ContextText = strings.TrimSpace(buildContextText(ret.ContextResults))
|
||||
ret.TopScore = resolveTopScore(results)
|
||||
ret.AnswerMode, ret.FallbackMode = resolveRuntimeAnswerSettings(knowledgeBaseIDs, results)
|
||||
ret.AnswerMode = resolveRuntimeAnswerMode(knowledgeBaseIDs, results)
|
||||
ret.TraceItems = buildRetrieverTraceItems(queryPreview, results, trace)
|
||||
ret.TraceSummary = buildRetrieverTraceSummary(ret.Options, ret.Policies, ret.ContextResults, results, trace)
|
||||
return ret, nil
|
||||
@@ -188,34 +187,30 @@ func (r *KnowledgeRetriever) resolvePolicies(knowledgeBaseIDs []int64, opts Know
|
||||
return ret
|
||||
}
|
||||
|
||||
func resolveRuntimeAnswerSettings(knowledgeBaseIDs []int64, results []rag.RetrieveResult) (enums.KnowledgeAnswerMode, enums.KnowledgeFallbackMode) {
|
||||
func resolveRuntimeAnswerMode(knowledgeBaseIDs []int64, results []rag.RetrieveResult) enums.KnowledgeAnswerMode {
|
||||
knowledgeBases := loadRuntimeKnowledgeBases(knowledgeBaseIDs)
|
||||
if len(knowledgeBases) == 0 {
|
||||
return enums.KnowledgeAnswerModeStrict, enums.KnowledgeFallbackModeNoAnswer
|
||||
return enums.KnowledgeAnswerModeStrict
|
||||
}
|
||||
if len(results) > 0 {
|
||||
if knowledgeBase, ok := knowledgeBases[results[0].KnowledgeBaseID]; ok {
|
||||
return normalizeRuntimeAnswerSettings(knowledgeBase)
|
||||
return normalizeRuntimeAnswerMode(knowledgeBase)
|
||||
}
|
||||
}
|
||||
for _, knowledgeBaseID := range knowledgeBaseIDs {
|
||||
if knowledgeBase, ok := knowledgeBases[knowledgeBaseID]; ok {
|
||||
return normalizeRuntimeAnswerSettings(knowledgeBase)
|
||||
return normalizeRuntimeAnswerMode(knowledgeBase)
|
||||
}
|
||||
}
|
||||
return enums.KnowledgeAnswerModeStrict, enums.KnowledgeFallbackModeNoAnswer
|
||||
return enums.KnowledgeAnswerModeStrict
|
||||
}
|
||||
|
||||
func normalizeRuntimeAnswerSettings(knowledgeBase models.KnowledgeBase) (enums.KnowledgeAnswerMode, enums.KnowledgeFallbackMode) {
|
||||
func normalizeRuntimeAnswerMode(knowledgeBase models.KnowledgeBase) enums.KnowledgeAnswerMode {
|
||||
answerMode := enums.KnowledgeAnswerMode(knowledgeBase.AnswerMode)
|
||||
if answerMode == 0 {
|
||||
answerMode = enums.KnowledgeAnswerModeStrict
|
||||
}
|
||||
fallbackMode := enums.KnowledgeFallbackMode(knowledgeBase.FallbackMode)
|
||||
if fallbackMode == 0 {
|
||||
fallbackMode = enums.KnowledgeFallbackModeNoAnswer
|
||||
}
|
||||
return answerMode, fallbackMode
|
||||
return answerMode
|
||||
}
|
||||
|
||||
func loadRuntimeKnowledgeBases(ids []int64) map[int64]models.KnowledgeBase {
|
||||
|
||||
Reference in New Issue
Block a user