タスク3: ルーティング + 言語¶
目的: LLMの前に適切なエージェントと言語を選ぶ。
Step 0: ルーティングモードを決める¶
router.mode を設定:
off: 単一エージェント。bootstrap: 最初のNターンのみルーティング。full: すべてのSTT finalでルーティング。
理由: 早期ルーティングでプロンプトを集中させ、LLM負荷を下げる。
システムマップ¶
flowchart LR
Caller((Caller))
Transport[Transport]
STT[STT]
Detector[言語検出]
Router[Router]
LLM[LLM: Agent Prompt]
TTS[TTS]
Caller --> Transport --> STT --> Detector --> Router --> LLM --> TTS --> Transport --> Caller
Step 1: エージェントを定義¶
agents := map[string]processors.AgentConfig{
"triage": {Name: "triage", System: "You are the triage agent."},
"technical": {Name: "technical", System: "You handle technical issues."},
"billing": {Name: "billing", System: "You handle billing and payments."},
}
Step 2: Router Strategyを選ぶ¶
HVAC例はLLMルーターを使います:
llmAdapter, _ := providers.BuildLLM(cfg.Vendors.LLM.Provider, cfg)
router := NewLLMRouterStrategy(llmAdapter, nil, LLMRouterConfig{})
ルールベースなら processors.RouterStrategy を自作できます。
Step 3: Router + AgentをEngineに接続¶
engine := ranya.NewEngine(ranya.EngineOptions{
Config: cfg,
Agents: agents,
Router: router,
})
Step 4: 言語検出を追加 (任意)¶
HVAC例はLLMベースの検出器:
langDetector := NewLLMLanguageDetector(llmAdapter)
engine := ranya.NewEngine(ranya.EngineOptions{
Config: cfg,
Agents: agents,
Router: router,
LanguageDetector: langDetector,
LanguagePrompts: map[string]string{"id": "...", "en": "..."},
LanguageMinConf: 0.55,
DefaultLanguage: cfg.Languages.Default,
})
設定フック:
router:
mode: "bootstrap"
max_turns: 2
languages:
default: "id"
code_switching: true
prompts:
id: "Gunakan Bahasa Indonesia."
en: "Use English."
Step 5: ルーティングを確認¶
以下が見えるはずです:
- エージェントや言語決定時の
global_updatesystemフレーム。 - 後続のtextフレームに
agentメタデータ。
よくある修正¶
- ルーターが動かない: STT final (
source=stt,is_final=true) を確認。 - エージェントが固定されない:
router.modeがoffかmax_turnsが0。 - 言語が検出されない:
LanguageDetector未設定または信頼度が低すぎる。
Related: