# sage **Repository Path**: XimoKB/sage ## Basic Information - **Project Name**: sage - **Description**: ๐Ÿš€ ไผไธš็บง่ทจๅขƒ่ดธๆ˜“ๆ™บ่ƒฝ้ข†่ˆชๅ‘˜ | ๅŸบไบŽAgno Team + RAGFlow็š„AIๅˆ่ง„ๅ’จ่ฏข็ณป็ปŸ๏ผŒไธ“ๆณจ่ฟ›ๅ‡บๅฃ่ดธๆ˜“ๅ‡†ๅ…ฅใ€HS็ผ–็ ๆŸฅ่ฏขไธŽ้ฃŽ้™ฉ้ข„่ญฆ - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-12-21 - **Last Updated**: 2026-01-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SAGE: ไผไธš็บง่ฟ›ๅ‡บๅฃ่ดธๆ˜“ๆ™บ่ƒฝ้ข†่ˆชๅ‘˜ > **Status**: ๐Ÿš€ Production Ready | **Version**: v5.0 | **Framework**: [Agno](https://agno.com) Team + [RAGFlow](https://ragflow.io) | **Stack**: FastAPI + Next.js 15 e-SAGE๏ผšๆ”ฟๅŠกๅ“่ถŠๆ™บ่ƒฝไฝ“ e-SAGE ๆ˜ฏ้ฉฑๅŠจ่ฟ›ๅ‡บๅฃ่ดธๆ˜“ๆœๅŠกๅคงๅŽ…โ€œๆ•ฐๅญ—ๅ‘˜ๅทฅโ€ๅ€ก่ฎฎ็š„ๆ ธๅฟƒๆ™บ่ƒฝไฝ“็ณป็ปŸใ€‚ๆญคๅๅฏ“ๆ„ๆˆ‘ไปฌๆ—จๅœจๅˆ›้€ ๆ•ฐๅญ—ๅŒ–็š„โ€œๆ™บ่€…โ€โ€”โ€”ๆ™บๆ…งใ€ๆƒๅจใ€ๅฏไฟก็š„ๅฎžไฝ“๏ผŒไปฅๅผ•ๅฏผๅ’ŒๅฎˆๆŠค่ดธๆ˜“ๅˆ่ง„ๆต็จ‹ใ€‚ e-SAGE ็š„ๅซไน‰ e-SAGE ๆ˜ฏไธ€ไธช็ผฉๅ†™๏ผŒๆบ่‡ช e-Smart Agent for Gov Excellence๏ผŒๅ…ถไธญๆฏไธชๅญ—ๆฏ้ƒฝไปฃ่กจไบ†้กน็›ฎ็š„ไธ€ไธชๆ”ฏๆŸฑ๏ผš e-๏ผš็”ตๅญๆ”ฟๅŠกไธŽๆ•ˆ็އใ€‚ไปฃ่กจ็Žฐไปฃๆฒป็†็š„ๆ•ฐๅญ—ๅŒ–ๅŸบ็ก€๏ผŒ่‡ดๅŠ›ไบŽๆŽจๅŠจๅ…ฌๅ…ฑๆœๅŠกๆ•ˆ็އ็š„ๅ˜้ฉๆ€งๆๅ‡ใ€‚ S๏ผšๆ™บ่ƒฝใ€‚ๆŒ‡็ณป็ปŸ็š„ๅŒ้‡ๆ™บ่ƒฝๆ ธๅฟƒโ€”โ€”ไธปๅŠจๅผ•ๅฏผ็š„โ€œๆ™บ่ƒฝ้ข†่ˆชๅ‘˜โ€ไธŽ vigilant oversight ็š„โ€œๅˆ่ง„้‰ด่ฏๅฎ˜โ€ใ€‚ A๏ผšAI ๆ™บ่ƒฝไฝ“ใ€‚่ฟ™ๆ˜ฏๆˆ‘ไปฌ่‡ชไธปๆ•ฐๅญ—ๅ‘˜ๅทฅ้˜Ÿไผ็š„่ฝฝไฝ“๏ผŒๆ—จๅœจๅๅŠฉใ€ๅˆ†ๆžไธŽๆ‰ง่กŒใ€‚ G๏ผšๆ”ฟๅŠก๏ผˆ่ดธๆ˜“ๅœบๆ™ฏ๏ผ‰ใ€‚ๆŒ‡่ฟ›ๅ‡บๅฃ่ดธๆ˜“ๆœๅŠกๅคงๅŽ…ๅ†…ๅ…ทไฝ“็š„ไธšๅŠก้ข†ๅŸŸ๏ผŒ่š็„ฆไบŽ้€šๅ…ณไธŽ็›‘็ฎกๆต็จ‹ใ€‚ E๏ผšๅ“่ถŠไธŽไธ“ไธšใ€‚ไปฃ่กจ็€ๅฏนๅˆ่ง„ๆ€งใ€ๅ‡†็กฎๆ€งไธŽๆœๅŠกๅ“่ดจๆœ€้ซ˜ๆ ‡ๅ‡†็š„ๆ‰ฟ่ฏบใ€‚ โ€œSAGE๏ผˆๆ™บ่€…๏ผ‰โ€็š„็ฒพ็ฅžๅ†…ๆ ธ ่ถ…่ถŠ็ผฉๅ†™๏ผŒ้€‰ๆ‹ฉ SAGE ไธ€่ฏ๏ผŒๆ›ดๅ› ๅ…ถๆทฑๅˆป็š„่ฑกๅพๆ„ไน‰ใ€‚ๅœจไผ ็ปŸไธญ๏ผŒโ€œๆ™บ่€…โ€ไปฃ่กจ็€ๆทฑ้‚ƒ็š„็Ÿฅ่ฏ†ใ€ๆ˜Žๆ™บ็š„ๅˆคๆ–ญๅ’Œๅšๅฎšไธ็งป็š„ๆ“ๅฎˆใ€‚ๆˆ‘ไปฌ็š„ e-SAGE ็ณป็ปŸๆญฃๆ˜ฏไธบๆญค่€Œ่ฎพ่ฎก๏ผšๅฎƒๆ˜ฏ่ฟ›ๅ‡บๅฃ่ดธๆ˜“้ข†ๅŸŸๆ™บๆ…ง็š„ๆ•ฐๅญ—ๅŒ–่บซใ€‚ๅฎƒๆ—ขๆ˜ฏไธ€ไฝๅšๅญฆ็š„ๅ‘ๅฏผ๏ผˆ้ข†่ˆชๅ‘˜๏ผ‰๏ผŒไนŸๆ˜ฏไธ€ไฝๅฎกๆ…Ž็š„ๅฎˆๆŠค่€…๏ผˆ้‰ด่ฏๅฎ˜๏ผ‰๏ผŒ็กฎไฟๆฏไธ€ๆฌกไบคไบ’ไธŽไบ‹ๅŠกๅค„็†ไธไป…้ซ˜ๆ•ˆ๏ผŒ่€Œไธ”ๆ— ๅฏๆŒ‘ๅ‰”ๅœฐๅˆ่ง„ใ€‚ ๆญค้กน็›ฎ่‡ดๅŠ›ไบŽๅฐ†โ€œๆ™บๆ…ง้กพ้—ฎโ€่ฟ™ไธ€ๆŠฝ่ฑก็†ๅฟต๏ผŒ่ฝฌๅŒ–ไธบ่ฟ›ๅ‡บๅฃ่ดธๆ˜“ๆœๅŠกไธญๅšๅฎžใ€ๅฏ้ ็š„ๆ•ฐๅญ—ๅญ˜ๅœจใ€‚ SAGE ๆ˜ฏไธ€ๅฅ—ไธ“ไธบ **่ทจๅขƒ่ดธๆ˜“ไธŽๅˆ่ง„ๅ’จ่ฏข** ่ฎพ่ฎก็š„ **Agentic RAG๏ผˆไปฃ็†ๅผๆฃ€็ดขๅขžๅผบ็”Ÿๆˆ๏ผ‰** ่งฃๅ†ณๆ–นๆกˆใ€‚ๅฎƒไธไป…ไป…ๆ˜ฏไธ€ไธช้—ฎ็ญ”็ณป็ปŸ๏ผŒๆ›ดๆ˜ฏไธ€ไธช้›†ๆˆไบ† **ๆ„ๅ›พ่ฏ†ๅˆซใ€ๅŠจๆ€่ทฏ็”ฑใ€ๅคšๆบๆฃ€็ดขใ€ๆททๅˆ้‡ๆŽ’** ็š„ๅทฅไธš็บง AI ๅบ”็”จๆก†ๆžถใ€‚ ![Architecture Diagram](docs/images/architecture_diagram.png) ## ๐Ÿ“– ็›ฎๅฝ• - [ๆ ธๅฟƒ่ƒฝๅŠ›](#-ๆ ธๅฟƒ่ƒฝๅŠ›) - [็ณป็ปŸๆžถๆž„ๆทฑๅบฆ่งฃๆž](#-็ณป็ปŸๆžถๆž„ๆทฑๅบฆ่งฃๆž) - [1. ๆ™บ่ƒฝไฝ“็ผ–ๆŽ’ (Agent Orchestration)](#1-ๆ™บ่ƒฝไฝ“็ผ–ๆŽ’-agent-orchestration) - [2. ้ซ˜็บง RAG ๆฃ€็ดข้“พ่ทฏ (Advanced RAG Pipeline)](#2-้ซ˜็บง-rag-ๆฃ€็ดข้“พ่ทฏ-advanced-rag-pipeline) - [3. ๅ†ณ็ญ–ๆต็จ‹ (Decision Flow)](#3-ๅ†ณ็ญ–ๆต็จ‹-decision-flow) - [ๅฟซ้€Ÿๅผ€ๅง‹](#-ๅฟซ้€Ÿๅผ€ๅง‹) - [้…็ฝฎๆŒ‡ๅ—](#-้…็ฝฎๆŒ‡ๅ—) - [้กน็›ฎ็ป“ๆž„](#-้กน็›ฎ็ป“ๆž„) - [ๅธธ่ง้—ฎ้ข˜ไธŽๆ•…้šœๆŽ’ๆŸฅ](#-ๅธธ่ง้—ฎ้ข˜ไธŽๆ•…้šœๆŽ’ๆŸฅ) --- ## ๐ŸŒŸ ๆ ธๅฟƒ่ƒฝๅŠ› ### 1. ๐Ÿค– ไธ‰ๆจกๅ— Team ๆžถๆž„ ๐Ÿ†• ๅŸบไบŽ Agno Team Coordinate ๆจกๅผ๏ผŒๅฎž็Žฐๅคšไธ“ๅฎถๅไฝœ๏ผš | ๆจกๅ— | ไธ“ๅฎถ Agent | ่Œ่ดฃ่Œƒๅ›ด | |------|-----------|----------| | **ๆฟๅ—ไธ€** | `business_navigator` | ๅ‡†ๅ…ฅๅˆ่ง„ใ€HS ็ผ–็ ๆŸฅ่ฏขใ€้ฃŽ้™ฉ้ข„่ญฆใ€่ฎธๅฏ่ฏๅˆคๅฎš | | **ๆฟๅ—ไบŒ** | `composite_agent` | ๅŠ ๅทฅ่ดธๆ˜“ใ€่ฟ›ๆ–™/ๆฅๆ–™ๅŠ ๅทฅใ€่ฝฌๅฃ่ดธๆ˜“็ญ‰ๅคๅˆๆต็จ‹ | | **ๆฟๅ—ไธ‰** | `knowledge_agent` | ๆ”ฟ็ญ–ๆณ•่ง„ใ€ๆ ‡ๅ‡†ๆฏ”ๅฏนใ€้€šๆŠฅๆƒ…ๅ†ตใ€ๆตทๅŸŸ้ฃŽ้™ฉ็ญ‰็Ÿฅ่ฏ†ๆฃ€็ดข | - **ๆ„ๅ›พ่ทฏ็”ฑๅ่ฐƒๅ‘˜**๏ผšTeam Leader ่‡ชๅŠจ่ฏ†ๅˆซ้—ฎ้ข˜็ฑปๅž‹๏ผŒๆ™บ่ƒฝๅˆ†ๅ‘ๅˆฐๆœ€ๅˆ้€‚็š„ไธ“ๅฎถ - **ไผš่ฏๆŒไน…ๅŒ–**๏ผšๅŸบไบŽ PostgreSQL ็š„ Session ็ฎก็†๏ผŒๆ”ฏๆŒๅคš่ฝฎๅฏน่ฏไธŠไธ‹ๆ–‡ - **็ปŸไธ€ๅ›ž็ญ”ๆ•ดๅˆ**๏ผšๅ่ฐƒๅ‘˜ๆฑ‡ๆ€ปไธ“ๅฎถๅ›ž็ญ”๏ผŒไฟๆŒๆƒๅจไธฅ่ฐจ็š„่พ“ๅ‡บ้ฃŽๆ ผ ### 2. ๐ŸŽฏ Perplexity ้ฃŽๆ ผ Deep Research UI ๐Ÿ†• ๅ‰็ซฏ้‡‡็”จไธ‰ๅฑ‚ๆธ่ฟ›ๆŠซ้œฒ่ฎพ่ฎก๏ผŒๅฎžๆ—ถๅฑ•็คบ็ ”็ฉถ่ฟ‡็จ‹๏ผš - **ๅฑ‚็บง็ป“ๆž„**๏ผšๆฏไธชๅทฅๅ…ท่ฐƒ็”จๆญฅ้ชคๆ˜พ็คบๅ…ณ่”็š„ๆฃ€็ดขๆŸฅ่ฏขๅ’Œ็Ÿฅ่ฏ†ๆฅๆบ - **ๅฎžๆ—ถๅ้ฆˆ**๏ผšๅŠจๆ€ๆ›ดๆ–ฐๅค„็†้˜ถๆฎต๏ผˆ็†่งฃ้—ฎ้ข˜ โ†’ ๆฃ€็ดขๆญฅ้ชค โ†’ ๆ•ดๅˆๅ›ž็ญ”๏ผ‰ - **้€ๆ˜Žๅบฆ**๏ผš็‚นๅ‡ปๅฑ•ๅผ€ๆŸฅ็œ‹ๅฎŒๆ•ดๅทฅๅ…ทๅ‚ๆ•ฐๅ’Œ่ฟ”ๅ›ž็ป“ๆžœ - **ๅทฒๅฎŒๆˆ็ปŸ่ฎก**๏ผš่‡ชๅŠจ่ฎก็ฎ—ๆ€ป่€—ๆ—ถๅ’Œๆญฅ้ชคๅฎŒๆˆๆ•ฐ ### 3. ๐Ÿง  ไธ‹ไธ€ไปฃ RAG ๅผ•ๆ“Ž (v5) > **้…็ฝฎ็‰ˆๆœฌ**: v5 | **้…็ฝฎๆ–‡ไปถ**: `config/knowledge_routes.yaml` (25KB) - **TTFT ไผ˜ๅŒ–**๏ผšTime To First Token ไปŽ 60s ้™่‡ณ 5s ไปฅๅ†… - Team ๆจกๅผ๏ผš็งป้™ค้˜ปๅกž้ข„ๅค„็†๏ผŒๆŒ‰้œ€่ฐƒ็”จ `normalize_product` ๅทฅๅ…ท - Agent ๆจกๅผ๏ผšๅŽๅฐๅนถ่กŒ้ข„ๅค„็†๏ผŒๅปถ่ฟŸ็ญ‰ๅพ…ไธŠไธ‹ๆ–‡ - **ไบงๅ“ๅฝ’ไธ€ๅŒ– (Product Normalization)** ๐Ÿ†• - ๅฃ่ฏญๅŒ–ๅ็งฐ โ†’ ๅญฆๅ โ†’ ๆ‹‰ไธๅๆ™บ่ƒฝ่ฝฌๆข - ๆๅ‡็Ÿฅ่ฏ†ๅบ“ๆฃ€็ดขๅ‡†็กฎ็އ - **็ฝฎไฟกๅบฆ่ทฏ็”ฑ (Confidence-based Routing)** - **้ซ˜็ฝฎไฟกๅบฆ (โ‰ฅ5 ๅˆ†)**: ็ฒพๅ‡†ๅ‘ฝไธญ๏ผŒไป…ๆฃ€็ดข็‰นๅฎš็Ÿฅ่ฏ†ๅบ“ - **ไธญ็ฝฎไฟกๅบฆ (2-4 ๅˆ†)**: ็‰นๅฎšๅบ“ + ้€š็”จๅ…œๅบ•ๅบ“ - **ไฝŽ็ฝฎไฟกๅบฆ (<2 ๅˆ†)**: ๅ…จๅบ“ๅนฟๆ’ญ๏ผŒ็กฎไฟไธๆผ็ญ” - **ๆททๅˆๆฃ€็ดข (Hybrid Search)**๏ผšBM25 + Embedding ๅŒๅผ•ๆ“Žๅนณ่กกไธ“ไธšๆœฏ่ฏญไธŽ่ฏญไน‰็†่งฃ - **ไธค้˜ถๆฎต้‡ๆŽ’ๅบ (Two-Stage Reranking)**๏ผšๅคš่ทฏๅฌๅ›ž + BGE-M3/Cohere ็ฒพๆŽ’ - **ๅผ•็”จๆ ‡ๆณจ็ณป็ปŸ**๏ผšๅ›ž็ญ”่‡ชๅŠจ้™„ๅธฆ็Ÿฅ่ฏ†ๆฅๆบ๏ผˆไธŠๆ ‡ๆ ‡ๆณจ + ๆฅๆบๅˆ—่กจ๏ผ‰ ### 4. ๐Ÿ’ป ๅ…จๆ ˆ็ŽฐไปฃๅŒ–ไฝ“้ชŒ - **Agent UI**: Next.js 15 + Perplexity ้ฃŽๆ ผ `UnifiedProcessingView` - **ๆตๅผๅ“ๅบ”**: ๅ…จ้“พ่ทฏ SSE ๆตๅผ่พ“ๅ‡บ๏ผŒๆž่‡ดไบคไบ’้€Ÿๅบฆ - **้•ฟๆœŸ่ฎฐๅฟ†**: Agno `MemoryManager` ่ทจไผš่ฏไฟๆŒไธŠไธ‹ๆ–‡ - **ไธŠไธ‹ๆ–‡ๅŽ‹็ผฉ**: `History Compressor` ่‡ชๅŠจๅŽ‹็ผฉ้•ฟๅฏน่ฏ๏ผŒ่Š‚็œ Token - **้›ถๆŽจ็†ๆณ„้œฒ**: Phase 14 ้€ป่พ‘ๆธ…ๆด— `[ๆ€่€ƒ]` ๆ ‡็ญพ๏ผŒ็กฎไฟๅ›ž็ญ”ๅ†…ๅฎน็บฏๅ‡€ --- ## ๐Ÿ”ฌ ็ณป็ปŸๆžถๆž„ๆทฑๅบฆ่งฃๆž ### 1. ๆ™บ่ƒฝไฝ“็ผ–ๆŽ’ (Agent Orchestration) ็ณป็ปŸ้‡‡็”จ **Agno Team Coordinate** ๆจกๅผ + **AgentOS** ๅŒ่ฝจๆžถๆž„๏ผš #### ๐Ÿข ๆ•ฐๅญ—้ข†่ˆชๅ‘˜ๅ›ข้˜Ÿ (Navigator Team) ๐Ÿ†• ๅŸบไบŽ Agno Team ็š„ๅคšไธ“ๅฎถๅไฝœ็ณป็ปŸ๏ผŒ้‡‡็”จ **Coordinate ๆจกๅผ**๏ผš ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Navigator Team (Leader) โ”‚ โ”‚ ๆ„ๅ›พ่ทฏ็”ฑๅ่ฐƒๅ‘˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๆฟๅ—ไธ€ โ”‚ โ”‚ ๆฟๅ—ไบŒ โ”‚ โ”‚ ๆฟๅ—ไธ‰ โ”‚ โ”‚ business_ โ”‚ โ”‚ composite_ โ”‚ โ”‚ knowledge_ โ”‚ โ”‚ navigator โ”‚ โ”‚ agent โ”‚ โ”‚ agent โ”‚ โ”‚ [ๅ‡†ๅ…ฅๅˆ่ง„] โ”‚ โ”‚ [ๅคๅˆๆต็จ‹] โ”‚ โ”‚ [็Ÿฅ่ฏ†ๆฃ€็ดข] โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` | ๆˆๅ‘˜ Agent | ่Œ่ดฃ | ๆ ธๅฟƒๅทฅๅ…ท | |-----------|------|---------| | **business_navigator** | ๅ‡†ๅ…ฅๅˆ่ง„ใ€HS ็ผ–็ ๆŸฅ่ฏขใ€้ฃŽ้™ฉ้ข„่ญฆใ€่ฎธๅฏ่ฏๅˆคๅฎš | `check_access_compliance`, `query_hs_code_*`, 7+ ๅทฅๅ…ท | | **composite_agent** | ๅŠ ๅทฅ่ดธๆ˜“ใ€่ฟ›ๆ–™/ๆฅๆ–™ๅŠ ๅทฅใ€่ฝฌๅฃ่ดธๆ˜“ | `compliance_workflow`, `hs_lookup_workflow` | | **knowledge_agent** | ๆ”ฟ็ญ–ๆณ•่ง„ใ€ๆ ‡ๅ‡†ๆฏ”ๅฏนใ€้€šๆŠฅๆƒ…ๅ†ตใ€ๆตทๅŸŸ้ฃŽ้™ฉ | `hybrid_retrieve`, RAGFlow ๅคšๅบ“ๆฃ€็ดข | #### ๐Ÿค– AgentOS ๆณจๅ†Œ Agent ้€š่ฟ‡ AgentOS ็›ดๆŽฅๆšด้œฒ็š„ Agent๏ผˆ็”จไบŽๅ‰็ซฏ็›ดๆŽฅ่ฐƒ็”จ๏ผ‰๏ผš | ๆ™บ่ƒฝไฝ“ | ่Œ่ดฃ | ๅทฅๅ…ท/่ƒฝๅŠ› | |--------|------|----------| | **base_agent** | ้€š็”จๅฏน่ฏ | ๅŸบ็ก€้—ฎ็ญ” | | **rag_agent** | ็Ÿฅ่ฏ†ๅบ“้—ฎ็ญ” | `hybrid_retrieve`, ้•ฟๆœŸ่ฎฐๅฟ† | | **business_navigator** | ๆ ธๅฟƒไธšๅŠกไธ“ๅฎถ | ๅ‡†ๅ…ฅ/ๅˆ่ง„/HS ็ผ–็  | #### โš™๏ธ ๅญ Agent (Sub-Agents) ็”ฑ Workflow ๆˆ–ไธป Agent ๅ†…้ƒจ่ฐƒ็”จ็š„็ป“ๆž„ๅŒ–่พ“ๅ‡บ Agent๏ผš | ๅญ Agent | ่Œ่ดฃ | ่พ“ๅ‡บๆจกๅผ | |---------|------|---------| | **product_normalizer** | ไบงๅ“ๅๅฝ’ไธ€ๅŒ–๏ผˆๅฃ่ฏญโ†’ๅญฆๅโ†’ๆ‹‰ไธๅ๏ผ‰ | ็ป“ๆž„ๅŒ–่พ“ๅ‡บ | | **query_understanding_agent** | ๆŸฅ่ฏข็†่งฃไธŽๆ„ๅ›พๆพ„ๆธ… | ็ป“ๆž„ๅŒ–่พ“ๅ‡บ | | **hs_extractor** | HS ็ผ–็ ็ป“ๆž„ๅŒ–ๆๅ– | `output_schema` | | **permit_rule_decider** | ่ฎธๅฏ่ฏ่ง„ๅˆ™ๅˆคๅฎš | ็กฎๅฎšๆ€งๅŽŸๅˆ™ | | **chunk_reranker** | ๆ–‡ๆกฃ้‡ๆŽ’ๅบ | ่ฏ„ๅˆ†ๅˆ—่กจ | | **intent_classifier** | ๆ„ๅ›พๅˆ†็ฑป | ๆžšไธพ็ฑปๅž‹ | | **history_summarizer** | ๅฏน่ฏๅކๅฒๆ‘˜่ฆ | ๅŽ‹็ผฉๆ–‡ๆœฌ | #### ๏ฟฝ Workflow (ไธšๅŠก็ผ–ๆŽ’) ้‡‡็”จ Agno Workflow ็ผ–ๆŽ’ๅคๆ‚ไธšๅŠกๆต็จ‹๏ผš | Workflow | ่Œ่ดฃ | ๆญฅ้ชค | |----------|------|-----| | **compliance_workflow** | ๅ‡†ๅ…ฅๅˆ่ง„ๆฃ€ๆŸฅๅฎŒๆ•ดๆต็จ‹ | ้ฃŽ้™ฉ้ข„่ญฆ โ†’ HS ๆŸฅ่ฏข โ†’ ่ฎธๅฏ่ฏๅˆคๅฎš โ†’ ๅˆ่ง„ๆฃ€็ดข | | **hs_lookup_workflow** | HS ็ผ–็ ๆŸฅ่ฏขๆต็จ‹ | ไบงๅ“ๅฝ’ไธ€ๅŒ– โ†’ ๅคš็ญ–็•ฅๆฃ€็ดข โ†’ ็ป“ๆžœๆๅ– | #### ๐Ÿ’ผ ๆœๅŠกๅฑ‚ (Services) ไธšๅŠก้€ป่พ‘ๅฐ่ฃ…๏ผŒไพ› Agent ๅ’Œ Workflow ่ฐƒ็”จ๏ผš | ๆœๅŠก | ่Œ่ดฃ | |-----|------| | **retrieval_service** | RAG ๆฃ€็ดขๆ ธๅฟƒ้€ป่พ‘๏ผˆ23KB ไปฃ็ ๏ผ‰ | | **ragflow_service** | RAGFlow API ๅฐ่ฃ…๏ผˆ28KB ไปฃ็ ๏ผ‰ | | **kb_routing** | ็Ÿฅ่ฏ†ๅบ“็ฝฎไฟกๅบฆ่ทฏ็”ฑ | | **reranker_service** | ้‡ๆŽ’ๅบๆœๅŠก๏ผˆBGE/Cohere๏ผ‰ | | **risk_rule_service** | ้ฃŽ้™ฉ่ง„ๅˆ™ๅŒน้… | | **query_processor** | ๆŸฅ่ฏข้ข„ๅค„็†ไธŽๅขžๅผบ | ### 2. ้ซ˜็บง RAG ๆฃ€็ดข้“พ่ทฏ (Advanced RAG Pipeline) ไปฃ็ ไฝ็ฝฎ๏ผš`app/tools/navigator_retrieval.py` SAGE ็š„ๆฃ€็ดขไธไป…ไป…ๆ˜ฏ็ฎ€ๅ•็š„ `vector_search`๏ผŒ่€Œๆ˜ฏไธ€ไธชๅฎŒๆ•ด็š„ **Pipeline**๏ผš 1. **Query Normalization (ๅฝ’ไธ€ๅŒ–)** * ๅฐ†ๅฃ่ฏญๅŒ–่กจ่พพ๏ผˆโ€œๅ’‹ๆ ทโ€๏ผ‰่ฝฌๆขไธบๆ ‡ๅ‡†ๆœฏ่ฏญใ€‚ * *Config*: `config/knowledge_routes.yaml` -> `query_normalization` 2. **Intent Clarification (ๆ„ๅ›พๆพ„ๆธ…)** * ่ง„ๅˆ™ๅผ•ๆ“Žๆฃ€ๆต‹ๆ˜ฏๅฆ้œ€่ฆๆพ„ๆธ…๏ผˆๅฆ‚็”จๆˆท้—ฎโ€œ่ƒฝๅธฆๅ—๏ผŸโ€๏ผŒ็ณป็ปŸ้œ€็กฎ่ฎคๆ˜ฏโ€œไธชไบบๆบๅธฆโ€่ฟ˜ๆ˜ฏโ€œ่ดธๆ˜“โ€๏ผ‰ใ€‚ 3. **Confidence Routing (็ฝฎไฟกๅบฆ่ทฏ็”ฑ)** * **High Confidence (โ‰ฅ5)**: ไป…ๆฃ€็ดข็‰นๅฎš้ข†ๅŸŸๅบ“๏ผˆๅฆ‚ `RAGFLOW_HS_CODE_DATASET_ID`๏ผ‰ใ€‚ * **Medium Confidence (2-4)**: ๆฃ€็ดข็‰นๅฎšๅบ“ + ้€š็”จๅ…œๅบ•ๅบ“ใ€‚ * **Low Confidence (<2)**: ๅ…จๅบ“ๅนฟๆ’ญๆฃ€็ดขใ€‚ 4. **Retrieval & Reranking** * **Recall**: ๅนถ่กŒ่ฐƒ็”จ RAGFlow API ่Žทๅ– Candidatesใ€‚ * **Rerank**: ไฝฟ็”จ `online_reranker` (BGE-M3/Cohere) ๆˆ– `Agent Reranker` ๅฏน็ป“ๆžœ่ฟ›่กŒๆ‰“ๅˆ†ๆŽ’ๅบใ€‚ ### 3. ๅ†ณ็ญ–ๆต็จ‹ (Decision Flow) ไปฅ็”จๆˆทๆ้—ฎ **โ€œไปŽๆŒชๅจ่ฟ›ๅฃไธ‰ๆ–‡้ฑผ้œ€่ฆไป€ไนˆๆ‰‹็ปญ๏ผŸโ€** ไธบไพ‹๏ผš ```mermaid graph TD UserInput["็”จๆˆท่พ“ๅ…ฅ: ไปŽๆŒชๅจ่ฟ›ๅฃไธ‰ๆ–‡้ฑผ..."] --> IntentAgent IntentAgent -->|Intent: import_inquiry| BusinessNavigator IntentAgent -->|Slots: {country: ๆŒชๅจ, product: ไธ‰ๆ–‡้ฑผ}| BusinessNavigator BusinessNavigator -->|Step 1: Check Risk| Tool_Risk["้™ๆ€้ฃŽ้™ฉ่ง„ๅˆ™ๅบ“"] Tool_Risk -->|Pass| Tool_HS["HS็ผ–็ ๆŸฅ่ฏข (0302.12)"] BusinessNavigator -->|Step 2: Check Compliance| Tool_Access["ๅ‡†ๅ…ฅๅˆ่ง„ๆŸฅ่ฏข"] Tool_Access -->|RAG Search| RAGFlow["RAGFlow ็Ÿฅ่ฏ†ๅบ“"] RAGFlow -->|Retrieval| Docs["ๅˆ่ง„ๆ–‡ๆกฃ/ๅ‡†ๅ…ฅๅๅ•"] BusinessNavigator -->|Step 3: Synthesize| LLM["ๆœ€็ปˆๆŽจ็†็”Ÿๆˆ"] LLM --> Output["็ป“ๆž„ๅŒ–ๅ›ž็ญ” (ๅ‡†ๅ…ฅ็Šถๆ€/็›‘็ฎกๆกไปถ/ๅŠž็†ๆต็จ‹)"] ``` ### 4. ่ฐƒ็”จ้“พ่ทฏ่ฏฆ่งฃ (Invocation Chain) ๐Ÿ†• #### 4.1 Team ๆจกๅผๅฎŒๆ•ด่ฐƒ็”จ้“พ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๅ‰็ซฏ (Next.js 15) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ POST /teams/navigator_team/runs โ”‚ โ”‚ Content-Type: multipart/form-data โ”‚ โ”‚ Body: { message: "่ถŠๅ—ๅทดๆฒ™้ฑผ่ƒฝ่ฟ›ๅฃๅ—", stream: true, session_id: "xxx" } โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ teams_router.py (API ๅฑ‚) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ @teams_router.post("/{team_id}/runs") โ”‚ โ”‚ async def create_team_run(team_id: str, request: Request): โ”‚ โ”‚ team = get_navigator_team(user_id, session_id) โ† ๅˆ›ๅปบ Team ๅฎžไพ‹ โ”‚ โ”‚ stream_iterator = team.arun(message, stream=True, stream_events=True) โ”‚ โ”‚ return StreamingResponse(common_stream_generator(...)) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ navigator_team.py (Team ๅฎšไน‰) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Team( โ”‚ โ”‚ name="ๆ•ฐๅญ—้ข†่ˆชๅ‘˜ๅ›ข้˜Ÿ", โ”‚ โ”‚ members=[business_navigator, composite_agent, knowledge_agent], โ”‚ โ”‚ instructions=INTENT_ROUTER_INSTRUCTIONS, โ† Leader ไฝฟ็”จ่ทฏ็”ฑๆŒ‡ไปค โ”‚ โ”‚ db=_get_team_db(), โ† PostgreSQL ไผš่ฏๆŒไน…ๅŒ– โ”‚ โ”‚ ) โ”‚ โ”‚ โ”‚ โ”‚ Team.arun() ๆต็จ‹: โ”‚ โ”‚ 1. Leader(ๅ่ฐƒๅ‘˜) ๅˆ†ๆž็”จๆˆท้—ฎ้ข˜ๆ„ๅ›พ โ”‚ โ”‚ 2. Leader ๆ นๆฎ INTENT_ROUTER_INSTRUCTIONS ้€‰ๆ‹ฉๆˆๅ‘˜ Agent โ”‚ โ”‚ 3. ้€‰ไธญ็š„ Agent ๆ‰ง่กŒไปปๅŠก (่ฐƒ็”จ Tools) โ”‚ โ”‚ 4. Leader ๆ•ดๅˆๆˆๅ‘˜ๅ›ž็ญ”๏ผŒ็”Ÿๆˆๆœ€็ปˆๅ“ๅบ” โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ–ผ โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ business_navigator โ”‚ โ”‚ composite_agent โ”‚ โ”‚ knowledge_agent โ”‚ โ”‚ (ๅ‡†ๅ…ฅๅˆ่ง„ไธ“ๅฎถ) โ”‚ โ”‚ (ๅคๅˆๆต็จ‹ไธ“ๅฎถ) โ”‚ โ”‚ (็Ÿฅ่ฏ†ๆฃ€็ดขไธ“ๅฎถ) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Tools: โ”‚ โ”‚ Workflows: โ”‚ โ”‚ Tools: โ”‚ โ”‚ - check_risk_warning โ”‚ โ”‚ - compliance_workflow โ”‚ โ”‚ - hybrid_retrieve โ”‚ โ”‚ - normalize_product โ”‚ โ”‚ - hs_lookup_workflow โ”‚ โ”‚ - search_knowledge_base โ”‚ โ”‚ - query_hs_code โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - check_access_complianceโ”‚ โ”‚ Sub-Agents called: โ”‚ โ”‚ Services: โ”‚ โ”‚ - search_allowed_originsโ”‚ โ”‚ - product_normalizer โ”‚ โ”‚ - retrieval_service โ”‚ โ”‚ โ”‚ โ”‚ - hs_extractor โ”‚ โ”‚ - kb_routing โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ streaming.py (ๆตๅผๅ“ๅบ”ๅค„็†) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ common_stream_generator(): โ”‚ โ”‚ - ๆŽฅๆ”ถ Team/Agent ็š„ AsyncIterator โ”‚ โ”‚ - ๅฎžๆ—ถ่ฝฌๅ‘ SSE ไบ‹ไปถ: RunStarted, ToolCall, ReasoningStep, RunContent โ”‚ โ”‚ - ๆๅ–ๅนถๅŽป้‡ references โ”‚ โ”‚ - ่ฟ‡ๆปค [ๆ€่€ƒ] ๅ†…ๅฎน (---FINAL_ANSWER--- ๅˆ†้š”็ฌฆ) โ”‚ โ”‚ - ่‡ชๅŠจๆณจๅ…ฅๅผ•็”จๆ ‡่ฎฐ [N] โ”‚ โ”‚ - ๅ‘้€ RunCompleted ไบ‹ไปถ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` #### 4.2 Agent ๆจกๅผ่ฐƒ็”จ้“พ (AgentOS) ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ POST /agents/business_navigator/runs โ”‚ โ”‚ Body: { message: "ๅธ็Ž‹่Ÿน็š„HS็ผ–็ ", stream: true } โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ agents_compat.py (API ๅฑ‚) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ AgentOS ้ป˜่ฎค่ทฏ็”ฑ่ขซ่‡ชๅฎšไน‰่ทฏ็”ฑ่ฆ†็›– (ไผ˜ๅ…ˆ็บง็ฝฎ้กถ) โ”‚ โ”‚ ๆณจๅ…ฅ่ƒฝๅŠ›: ้ข„ๅค„็†ไธŠไธ‹ๆ–‡ใ€ๅผ•็”จๆๅ–ใ€ๅ…่ดฃๅฃฐๆ˜Ž โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ business_navigator.py (Agent ๅฎšไน‰) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ get_business_navigator_agent() ๅˆ›ๅปบ Agent: โ”‚ โ”‚ - 7+ ไธšๅŠกๅทฅๅ…ท (ๅ‡†ๅ…ฅใ€HS็ผ–็ ใ€้ฃŽ้™ฉใ€ๅˆ่ง„) โ”‚ โ”‚ - instructions: ่ง’่‰ฒๅฎšไน‰ + ๅทฅๅ…ท่ฐƒ็”จ่ง„่Œƒ โ”‚ โ”‚ - db: PostgreSQL ไผš่ฏๆŒไน…ๅŒ– โ”‚ โ”‚ โ”‚ โ”‚ Agent.arun() โ†’ ่ฐƒ็”จ Tools โ†’ LLM ๆŽจ็† โ†’ ่ฟ”ๅ›žๆตๅผๅ“ๅบ” โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` #### 4.3 ไฟกๆฏๆตๅบๅˆ—ๅ›พ ```mermaid sequenceDiagram autonumber participant FE as ๅ‰็ซฏ participant API as FastAPI participant Team as Navigator Team participant Leader as Team Leader participant BN as business_navigator participant Tool as Tools/Services participant KB as RAGFlow ็Ÿฅ่ฏ†ๅบ“ FE->>API: POST /teams/navigator_team/runs API->>Team: get_navigator_team() API->>Team: team.arun(message, stream=True) Team->>Leader: ๅˆ†ๆžๆ„ๅ›พ Leader->>Leader: ๅŒน้…่ทฏ็”ฑ่ง„ๅˆ™ Note over API: SSE: RunStarted Leader->>BN: ่ฝฌๅ‘้—ฎ้ข˜ (ๅ‡†ๅ…ฅๅˆ่ง„็ฑป) BN->>Tool: normalize_product("ๅทดๆฒ™้ฑผ") Note over API: SSE: ToolCall Tool-->>BN: {standard_name, latin} BN->>Tool: check_risk_warning(...) Note over API: SSE: ToolCall Tool-->>BN: {status: "safe"} BN->>Tool: check_access_compliance(...) Tool->>KB: ๆททๅˆๆฃ€็ดข (BM25 + Embedding) KB-->>Tool: references[] Note over API: SSE: ToolCall (with refs) Tool-->>BN: {result, references} BN->>BN: LLM ๆŽจ็†็”Ÿๆˆๅ›ž็ญ” Note over API: SSE: ReasoningStep (ๅคšๆฌก) Note over API: SSE: RunContent (ๅˆ†้š”็ฌฆๅŽ) BN-->>Leader: ่ฟ”ๅ›žไธ“ๅฎถๅ›ž็ญ” Leader->>Leader: ๆ•ดๅˆๅ›ž็ญ” Note over API: SSE: RunContent Note over API: SSE: RunCompleted ``` #### 4.4 SSE ไบ‹ไปถๅ่ฎฎ ๅ‰็ซฏๆŽฅๆ”ถ็š„ SSE ไบ‹ไปถ็ฑปๅž‹ๅŠๆ•ฐๆฎ็ป“ๆž„๏ผš | ไบ‹ไปถ็ฑปๅž‹ | ่งฆๅ‘ๆ—ถๆœบ | ๆ•ฐๆฎ็ป“ๆž„ | |---------|---------|---------| | `RunStarted` | Agent/Team ๅผ€ๅง‹ๆ‰ง่กŒ | `{run_id, agent_name, session_id}` | | `ToolCall` | ๅทฅๅ…ทๅผ€ๅง‹่ฐƒ็”จ | `{tool: {tool_name, tool_args, created_at}}` | | `ToolResult` | ๅทฅๅ…ท่ฟ”ๅ›ž็ป“ๆžœ | `{tool: {tool_name, result, references}}` | | `ReasoningStep` | ๆ€่€ƒ่ฟ‡็จ‹ๆตๅผ่พ“ๅ‡บ | `{reasoning_content: "ๅˆ†ๆžไธญ..."}` | | `ReasoningCompleted` | ๆ€่€ƒ็ป“ๆŸ | `{run_id}` | | `RunContent` | ๆœ€็ปˆ็ญ”ๆกˆๆตๅผ่พ“ๅ‡บ | `{content: "่ถŠๅ—ๅทดๆฒ™้ฑผๅฏไปฅ..."}` | | `RunCompleted` | ๅ“ๅบ”็ป“ๆŸ | `{run_id, created_at, extra_data: {references}}` | #### 4.5 ๅ…ณ้”ฎไปฃ็ ่ทฏๅพ„ ``` ่ฏทๆฑ‚ๅ…ฅๅฃ (Team ๆจกๅผ): app/api/routes/teams_router.py::create_team_run() โ”œโ”€โ”€ app/teams/navigator_team.py::get_navigator_team() โ”‚ โ”œโ”€โ”€ app/agents/business_navigator.py::get_business_navigator_agent() โ”‚ โ”œโ”€โ”€ app/agents/composite_agent.py::get_composite_agent() โ”‚ โ””โ”€โ”€ app/agents/knowledge_agent.py::get_knowledge_agent() โ””โ”€โ”€ app/api/utils/streaming.py::common_stream_generator() ่ฏทๆฑ‚ๅ…ฅๅฃ (Agent ๆจกๅผ): app/api/routes/agents_compat.py::run_agent() โ”œโ”€โ”€ app/agents/business_navigator.py::get_business_navigator_agent() โ”œโ”€โ”€ app/agents/business_navigator.py::build_enhanced_context() [ๅฏ้€‰้ข„ๅค„็†] โ””โ”€โ”€ app/api/utils/streaming.py::common_stream_generator() ๅทฅๅ…ท่ฐƒ็”จ้“พ: Agent.arun() โ†’ Tool ๅ‡ฝๆ•ฐ โ”œโ”€โ”€ app/tools/business.py::check_access_compliance() โ”‚ โ””โ”€โ”€ app/services/retrieval_service.py::hybrid_retrieve() โ”‚ โ””โ”€โ”€ app/services/ragflow_service.py::search() โ”œโ”€โ”€ app/tools/hs_code.py::query_hs_code_by_product() โ”‚ โ””โ”€โ”€ app/workflows/hs_lookup_workflow.py::run() โ”‚ โ””โ”€โ”€ app/sub_agents/product_normalizer.py โ””โ”€โ”€ app/tools/normalize_product.py::normalize_product() โ””โ”€โ”€ app/sub_agents/product_normalizer.py::get_product_search_variants() ``` --- ## ๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹ ### ๅ‰็ฝฎ่ฆๆฑ‚ - Docker & Docker Compose (ๆŽจ่) - ๆˆ– Python 3.11+ & Node.js 18+ ### ๆ–นๅผไธ€๏ผšDocker ไธ€้”ฎๅฏๅŠจ๏ผˆๆŽจ่๏ผ‰ ```bash # 1. ๅ…‹้š†ไปฃ็  git clone https://github.com/your-repo/sage.git cd sage # 2. ้…็ฝฎ็Žฏๅขƒๅ˜้‡ cp .env.example .env # ็ผ–่พ‘ .env๏ผŒๅกซๅ…ฅ OPENAI_API_KEY, RAGFLOW_API_KEY ็ญ‰ๅฟ…ๅกซ้กน # 3. ๅฏๅŠจๆœๅŠก cd docker docker-compose up -d --build ``` - ๅ‰็ซฏ่ฎฟ้—ฎ: `http://localhost:3000` - ๅŽ็ซฏ API: `http://localhost:7777` ### ๆ–นๅผไบŒ๏ผšๆœฌๅœฐๅผ€ๅ‘ๅฏๅŠจ **ๅŽ็ซฏ (Backend)** ```bash # ไฝฟ็”จ uv ๆž้€Ÿๅฎ‰่ฃ… curl -LsSf https://astral.sh/uv/install.sh | sh uv venv && source .venv/bin/activate uv sync # ๅฏๅŠจ (่‡ชๅŠจๅŠ ่ฝฝ .env.dev) ./start.sh dev ``` **ๅ‰็ซฏ (Frontend)** ```bash cd web pnpm install pnpm dev ``` --- ## โš™๏ธ ้…็ฝฎๆŒ‡ๅ— ไธป่ฆ้…็ฝฎไฝไบŽ `.env` ๅ’Œ `config/` ็›ฎๅฝ•ใ€‚ ### 1. ๆ ธๅฟƒ็Žฏๅขƒๅ˜้‡ (.env) | ๅ˜้‡ๅ | ่ฏดๆ˜Ž | ๅฟ…ๅกซ | |--------|------|:----:| | `OPENAI_API_KEY` | LLM ๆจกๅž‹ๅฏ†้’ฅ | โœ… | | `OPENAI_BASE_URL` | OpenAI API ๅŸบ็ก€ URL (ๆ”ฏๆŒๅ…ผๅฎน API) | | | `RAGFLOW_API_URL` | RAGFlow ๆœๅŠกๅœฐๅ€ | โœ… | | `RAGFLOW_API_KEY` | RAGFlow ่ฎฟ้—ฎๅฏ†้’ฅ | โœ… | | `RAGFLOW_DATASET_IDS` | **้ป˜่ฎค็Ÿฅ่ฏ†ๅบ“้›†ๅˆ** (้€—ๅทๅˆ†้š”) | โœ… | | `RAGFLOW_HS_CODE_DATASET_ID` | HS ็ผ–็ ไธ“็”จ็Ÿฅ่ฏ†ๅบ“ ID | | | `RAGFLOW_PERMIT_RULES_DATASET_ID` | ่ฎธๅฏ่ฏ่ง„ๅˆ™็Ÿฅ่ฏ†ๅบ“ ID | | | `RERANKER_PROVIDER` | ้‡ๆŽ’ๅบๆจกๅž‹ (`bge` / `cohere` / `agent`) | | | `DB_HOST` / `DB_PORT` / `DB_NAME` | PostgreSQL ่ฟžๆŽฅ้…็ฝฎ | | ๆ›ดๅคš้…็ฝฎ่ฏทๅ‚่€ƒ [็Žฏๅขƒ้…็ฝฎ่ฏดๆ˜Ž](docs/environment_config.md)ใ€‚ ### 2. ็Ÿฅ่ฏ†ๅบ“่ทฏ็”ฑ้…็ฝฎ (v4) **ๆ–‡ไปถ**: `config/knowledge_routes.yaml` ```yaml version: 4 # ็Ÿฅ่ฏ†ๅบ“ๅ…ƒๆ•ฐๆฎ (8 ไธชไธ“ไธšๅบ“) datasets: aquatic_regulations: id: "xxx..." name: "ๆฐดไบงๅ“ๆณ•ๅพ‹ๆณ•่ง„" content_scope: | - ่ฟ›ๅฃๅ‡†ๅ…ฅ็›ฎๅฝ• - ๆณ•่ง„่ฆๆฑ‚ (248ๅทไปค) - ้ฃŽ้™ฉ้ข„่ญฆ # ่ทฏ็”ฑ่ง„ๅˆ™ (10 ๆก, ๆฏๆกๅซ 3 ็บงๆƒ้‡ๅ…ณ้”ฎ่ฏ) router: rules: hs_code: high_weight: ["HS็ผ–็ ", "ๅ•†ๅ“็ผ–็ ", "ๅ•†ๅ“็ผ–็ "] # +3 ๅˆ† medium_weight: ["็จŽๅท", "ๅฝ’็ฑป"] # +2 ๅˆ† low_weight: ["ไป€ไนˆ็ "] # +1 ๅˆ† target_datasets: [aquatic_regulations, hs_code_kb] ``` ### 3. ้ฃŽ้™ฉ้ข„่ญฆ่ง„ๅˆ™ **ๆ–‡ไปถ**: `config/risk_rules.yaml` ```yaml rules: - country: "ๆ—ฅๆœฌ" product_keywords: ["ๆฐดไบงๅ“", "้ฑผ", "ๆตท้ฒœ", ...] status: "Forbidden" message: "ๆ นๆฎๆ€ป็ฝฒๅ…ฌๅ‘Š2023ๅนด็ฌฌ103ๅท..." effective_date: "2023-08-24" priority: 100 is_active: true ``` --- ## ๐Ÿ“‚ ้กน็›ฎ็ป“ๆž„ ```text sage/ โ”œโ”€โ”€ app/ # ๐Ÿ Python ๅŽ็ซฏ (FastAPI + Agno) โ”‚ โ”œโ”€โ”€ agent.py # AgentOS ๅ…ฅๅฃ (CORS, ๆ—ฅๅฟ—, ๆŒ‚่ฝฝ) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ teams/ # ๐Ÿข Agno Team ๅฎšไน‰ ๐Ÿ†• โ”‚ โ”‚ โ””โ”€โ”€ navigator_team.py # ๆ•ฐๅญ—้ข†่ˆชๅ‘˜ๅ›ข้˜Ÿ (ไธ‰ๆจกๅ—ๆžถๆž„) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ agents/ # ๐Ÿค– ๆ™บ่ƒฝไฝ“ๅฎšไน‰ (10 ไธช) โ”‚ โ”‚ โ”œโ”€โ”€ business_navigator.py # ๆฟๅ—ไธ€๏ผšๅ‡†ๅ…ฅๅˆ่ง„ไธ“ๅฎถ โ”‚ โ”‚ โ”œโ”€โ”€ composite_agent.py # ๆฟๅ—ไบŒ๏ผšๅคๅˆๆต็จ‹ไธ“ๅฎถ ๐Ÿ†• โ”‚ โ”‚ โ”œโ”€โ”€ knowledge_agent.py # ๆฟๅ—ไธ‰๏ผš็Ÿฅ่ฏ†ๆฃ€็ดขไธ“ๅฎถ ๐Ÿ†• โ”‚ โ”‚ โ”œโ”€โ”€ rag_agent.py # ้€š็”จๆ–‡ๆกฃ้—ฎ็ญ” โ”‚ โ”‚ โ”œโ”€โ”€ finance_agent.py # ้‡‘่ž่ฎก็ฎ— โ”‚ โ”‚ โ”œโ”€โ”€ web_agent.py # Web ๆœ็ดข โ”‚ โ”‚ โ”œโ”€โ”€ selector.py # Agent ่ทฏ็”ฑๅˆ†ๅ‘ โ”‚ โ”‚ โ”œโ”€โ”€ base_agent.py # ๅ…ฑไบซๅŸบ็ฑป โ”‚ โ”‚ โ””โ”€โ”€ agno_assist.py # ๆก†ๆžถ่พ…ๅŠฉ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ sub_agents/ # โš™๏ธ ๅญ Agent (็ป“ๆž„ๅŒ–่พ“ๅ‡บ) ๐Ÿ†• โ”‚ โ”‚ โ”œโ”€โ”€ product_normalizer.py # ไบงๅ“ๅๅฝ’ไธ€ๅŒ– โ”‚ โ”‚ โ”œโ”€โ”€ query_understanding_agent.py # ๆŸฅ่ฏข็†่งฃ โ”‚ โ”‚ โ”œโ”€โ”€ hs_extractor.py # HS ็ผ–็ ๆๅ– โ”‚ โ”‚ โ”œโ”€โ”€ permit_rule_decider.py # ่ฎธๅฏ่ฏๅˆคๅฎš โ”‚ โ”‚ โ”œโ”€โ”€ chunk_reranker.py # ๆ–‡ๆกฃ้‡ๆŽ’ๅบ โ”‚ โ”‚ โ”œโ”€โ”€ intent_classifier.py # ๆ„ๅ›พๅˆ†็ฑป โ”‚ โ”‚ โ”œโ”€โ”€ history_summarizer.py # ๅކๅฒๆ‘˜่ฆ โ”‚ โ”‚ โ”œโ”€โ”€ query_rewriter.py # ๆŸฅ่ฏข้‡ๅ†™ โ”‚ โ”‚ โ””โ”€โ”€ kb_profiler.py # ็Ÿฅ่ฏ†ๅบ“ๅˆ†ๆž โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ workflows/ # ๏ฟฝ Agno Workflow ็ผ–ๆŽ’ ๐Ÿ†• โ”‚ โ”‚ โ”œโ”€โ”€ compliance_workflow.py # ๅ‡†ๅ…ฅๅˆ่ง„ๆฃ€ๆŸฅๆต็จ‹ (17KB) โ”‚ โ”‚ โ”œโ”€โ”€ hs_lookup_workflow.py # HS ็ผ–็ ๆŸฅ่ฏขๆต็จ‹ (9KB) โ”‚ โ”‚ โ””โ”€โ”€ agno_workflows.py # Workflow ๆณจๅ†ŒไธŽ็ฎก็† โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ services/ # ๐Ÿ’ผ ไธšๅŠกๆœๅŠกๅฑ‚ (11 ไธช) โ”‚ โ”‚ โ”œโ”€โ”€ retrieval_service.py # ๐Ÿ”ฅ RAG ๆฃ€็ดขๆ ธๅฟƒ (23KB) โ”‚ โ”‚ โ”œโ”€โ”€ ragflow_service.py # ๐Ÿ”ฅ RAGFlow API ๅฐ่ฃ… (28KB) โ”‚ โ”‚ โ”œโ”€โ”€ kb_routing.py # ็Ÿฅ่ฏ†ๅบ“็ฝฎไฟกๅบฆ่ทฏ็”ฑ (12KB) โ”‚ โ”‚ โ”œโ”€โ”€ reranker_service.py # ้‡ๆŽ’ๅบๆœๅŠก (12KB) โ”‚ โ”‚ โ”œโ”€โ”€ query_processor.py # ๆŸฅ่ฏข้ข„ๅค„็† (8KB) โ”‚ โ”‚ โ”œโ”€โ”€ kb_mapping_service.py # ็Ÿฅ่ฏ†ๅบ“ๆ˜ ๅฐ„ (7KB) โ”‚ โ”‚ โ”œโ”€โ”€ risk_rule_service.py # ้ฃŽ้™ฉ่ง„ๅˆ™ๅŒน้… (7KB) โ”‚ โ”‚ โ”œโ”€โ”€ history_compressor.py # ๅކๅฒๅŽ‹็ผฉ (6KB) โ”‚ โ”‚ โ”œโ”€โ”€ config_service.py # ้…็ฝฎๆœๅŠก (10KB) โ”‚ โ”‚ โ””โ”€โ”€ consent_service.py # ๅŒๆ„้—จๆŽง (3KB) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tools/ # ๏ฟฝ๏ธ ไธšๅŠกๅทฅๅ…ท (9 ไธช) โ”‚ โ”‚ โ”œโ”€โ”€ navigator_retrieval.py # RAG Pipeline ๅทฅๅ…ท โ”‚ โ”‚ โ”œโ”€โ”€ business.py # ๅ‡†ๅ…ฅ/ๅˆ่ง„/้ฃŽ้™ฉๆฃ€ๆŸฅ โ”‚ โ”‚ โ”œโ”€โ”€ hs_code.py # HS ็ผ–็ ๆŸฅ่ฏข โ”‚ โ”‚ โ”œโ”€โ”€ permit_rules.py # ๆฃ€็–ซ่ง„ๅˆ™ๆฃ€็ดข โ”‚ โ”‚ โ”œโ”€โ”€ online_reranker.py # BGE/Cohere ้‡ๆŽ’ๅบ โ”‚ โ”‚ โ”œโ”€โ”€ query_rewriter.py # ๆŸฅ่ฏข้‡ๅ†™ โ”‚ โ”‚ โ”œโ”€โ”€ kb_map.py # ็Ÿฅ่ฏ†ๅบ“ๆ˜ ๅฐ„ โ”‚ โ”‚ โ””โ”€โ”€ search.py # ๆททๅˆๆœ็ดข โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ schemas/ # ๏ฟฝ Pydantic ๆ•ฐๆฎๆจกๅž‹ โ”‚ โ”œโ”€โ”€ api/routes/ # ๐Ÿ“ก API ่ทฏ็”ฑ โ”‚ โ”‚ โ”œโ”€โ”€ teams_router.py # /teams ็ซฏ็‚น ๐Ÿ†• โ”‚ โ”‚ โ”œโ”€โ”€ agents_compat.py # /agents ๅ…ผๅฎน็ซฏ็‚น โ”‚ โ”‚ โ”œโ”€โ”€ sessions.py # ไผš่ฏ็ฎก็† โ”‚ โ”‚ โ””โ”€โ”€ v1_router.py # /v1/* ่‡ชๅฎšไน‰่ทฏ็”ฑ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ db/ # ๐Ÿ’พ ๆ•ฐๆฎๅบ“่ฟžๆŽฅ โ”‚ โ”œโ”€โ”€ session.py # PostgreSQL ไผš่ฏ็ฎก็† โ”‚ โ””โ”€โ”€ url.py # ๆ•ฐๆฎๅบ“ URL ้…็ฝฎ โ”‚ โ”œโ”€โ”€ web/ # ๐ŸŒ Next.js 15 ๅ‰็ซฏ โ”‚ โ”œโ”€โ”€ src/ โ”‚ โ”‚ โ”œโ”€โ”€ app/smart-agent/ # ไธปๅบ”็”จ่ทฏ็”ฑ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ navigator/ # ไธšๅŠก้ข†่ˆชๅ‘˜้กต้ข โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ forms/ # ่กจๅ•้กต้ข โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ auditor/ # ๅฎก่ฎกๅ‘˜ๅŽๅฐ โ”‚ โ”‚ โ”œโ”€โ”€ components/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ chat/ # ่Šๅคฉ็ป„ไปถ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ UnifiedProcessingView.tsx # ๐Ÿ”ฅ Perplexity ้ฃŽๆ ผๅค„็†่ง†ๅ›พ ๐Ÿ†• โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ChatArea/ # ๆถˆๆฏๅŒบๅŸŸ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ Sidebar/ # ไพง่พนๆ  โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ ui/ # UI ็ป„ไปถๅบ“ โ”‚ โ”‚ โ”œโ”€โ”€ hooks/ # React Hooks โ”‚ โ”‚ โ”œโ”€โ”€ lib/ # ๅทฅๅ…ทๅบ“ โ”‚ โ”‚ โ””โ”€โ”€ types/ # TypeScript ็ฑปๅž‹ๅฎšไน‰ โ”‚ โ””โ”€โ”€ messages/ # ๅ›ฝ้™…ๅŒ– (en.json, zh.json) โ”‚ โ”œโ”€โ”€ config/ # โš™๏ธ ้…็ฝฎๆ–‡ไปถ โ”‚ โ”œโ”€โ”€ knowledge_routes.yaml # ๐Ÿ”ฅ ็Ÿฅ่ฏ†ๅบ“่ทฏ็”ฑ (v5, 25KB) โ”‚ โ””โ”€โ”€ risk_rules.yaml # ้ฃŽ้™ฉ้ข„่ญฆ่ง„ๅˆ™ โ”‚ โ”œโ”€โ”€ docs/ # ๐Ÿ“š ๆŠ€ๆœฏๆ–‡ๆกฃ (9 ็ฏ‡) โ”‚ โ”œโ”€โ”€ environment_config.md # ็Žฏๅขƒ้…็ฝฎๆŒ‡ๅ— โ”‚ โ”œโ”€โ”€ RETRIEVAL_OPTIMIZATION.md # ๆฃ€็ดข่ฐƒไผ˜ โ”‚ โ”œโ”€โ”€ PERMIT_RULES_CONFIG.md # ๆฃ€็–ซ่ง„ๅˆ™้…็ฝฎ โ”‚ โ”œโ”€โ”€ HS_CODE_TROUBLESHOOTING.md # HS ็ผ–็ ๆ•…้šœๆŽ’ๆŸฅ โ”‚ โ”œโ”€โ”€ citation_optimization.md # ๅผ•็”จๆ ‡ๆณจไผ˜ๅŒ– โ”‚ โ”œโ”€โ”€ api_optimization_summary.md # API ไผ˜ๅŒ–ๆ€ป็ป“ โ”‚ โ”œโ”€โ”€ history_compression.md # ๅކๅฒๅŽ‹็ผฉ่ฏดๆ˜Ž โ”‚ โ””โ”€โ”€ consent_gate_simplification.md # ๅŒๆ„้—จๆˆท็ฎ€ๅŒ– โ”‚ โ”œโ”€โ”€ docker/ # ๐Ÿณ ๅฎนๅ™จๅŒ–้ƒจ็ฝฒ โ”‚ โ”œโ”€โ”€ docker-compose.yml # ๆœๅŠก็ผ–ๆŽ’ (nginx, backend, frontend) โ”‚ โ”œโ”€โ”€ backend.Dockerfile โ”‚ โ””โ”€โ”€ frontend.Dockerfile โ”‚ โ”œโ”€โ”€ cookbook/ # ๐Ÿ“– ็คบไพ‹ไปฃ็ ไธŽๅญฆไน ่ต„ๆบ โ”‚ โ”œโ”€โ”€ start.sh # ๐Ÿš€ ๅŽ็ซฏๅฏๅŠจ่„šๆœฌ (ๅ‰ๅฐ/ๅŽๅฐ/้‡ๅฏ) โ”œโ”€โ”€ .env / .env.example # ็Žฏๅขƒๅ˜้‡้…็ฝฎ โ””โ”€โ”€ README.md # ๆœฌๆ–‡ๆกฃ ``` --- ## โ“ ๅธธ่ง้—ฎ้ข˜ไธŽๆ•…้šœๆŽ’ๆŸฅ ### Q1: ๅฏๅŠจๆ—ถๆŠฅ้”™ `Connection refused` (PostgreSQL) - **ๅŽŸๅ› **: ๆ•ฐๆฎๅบ“ๆœชๅฏๅŠจ๏ผŒๆˆ–่€… `.env` ไธญ HOST ้…็ฝฎ้”™่ฏฏใ€‚ - **่งฃๅ†ณ**: - ๆœฌๅœฐ่ฟ่กŒ็กฎไฟ็”จ `localhost`๏ผŒDocker ่ฟ่กŒ็กฎไฟ็”จ `host.docker.internal` (Mac/Win) ๆˆ– Service Nameใ€‚ - ๅ‚่€ƒ [็Žฏๅขƒ้…็ฝฎ - ๆ•…้šœๆŽ’ๆŸฅ](docs/environment_config.md#ๆ•…้šœๆŽ’ๆŸฅ)ใ€‚ ### Q2: ไธšๅŠก้ข†่ˆชๅ‘˜ๅ›ž็ญ”"ๆœชๆ‰พๅˆฐ็›ธๅ…ณไฟกๆฏ" - **ๅŽŸๅ› **: 1. RAGFlow ็Ÿฅ่ฏ†ๅบ“ไธบ็ฉบๆˆ–ๆœช่งฃๆžๅฎŒๆˆใ€‚ 2. `RAGFLOW_DATASET_IDS` ็Žฏๅขƒๅ˜้‡ๆœชๆญฃ็กฎ้€ไผ ใ€‚ 3. ่ทฏ็”ฑ่ง„ๅˆ™่ฟ‡ไบŽไธฅๆ ผ๏ผŒๅฏผ่‡ดๆฒกๅ‘ฝไธญไปปไฝ•ๅบ“ใ€‚ - **่งฃๅ†ณ**: ๆŸฅ็œ‹ๅŽ็ซฏๆ—ฅๅฟ—๏ผŒๆœ็ดข `[Routing]` ๅ…ณ้”ฎๅญ—๏ผŒ็กฎ่ฎคๆœ€็ปˆๆŸฅ่ฏขไบ†ๅ“ชไบ› dataset_idใ€‚ ### Q3: ไธบไป€ไนˆๆ„ๅ›พ่ฏ†ๅˆซๆ€ปๆ˜ฏๅคฑ่ดฅ๏ผŸ - **ๅŽŸๅ› **: ๆจกๅž‹่ƒฝๅŠ›ไธ่ถณ (ๅฆ‚ไฝฟ็”จไบ†่ฟ‡ๅฐ็š„ๆจกๅž‹)ใ€‚ - **่งฃๅ†ณ**: ็กฎไฟ `INTENT_MODEL_NAME` ่ฎพ็ฝฎไธบ่ƒฝๅŠ›่พƒๅผบ็š„ๆจกๅž‹ (ๅฆ‚ `gpt-4o-mini` ๆˆ– `gpt-4o`)๏ผŒไธ” Temperature ่ฎพไธบ 0ใ€‚ ### Q4: HS ็ผ–็ ๆŸฅ่ฏข่ฟ”ๅ›ž็ฉบ็ป“ๆžœ ๐Ÿ†• - **ๅŽŸๅ› **: 1. `RAGFLOW_HS_CODE_DATASET_ID` ๆœช้…็ฝฎๆˆ–้…็ฝฎ้”™่ฏฏใ€‚ 2. ็Ÿฅ่ฏ†ๅบ“ไธญๆฒกๆœ‰ๅŒน้…็š„ไบงๅ“ๆ่ฟฐใ€‚ - **่งฃๅ†ณ**: - ็กฎ่ฎค็Žฏๅขƒๅ˜้‡้…็ฝฎๆญฃ็กฎใ€‚ - ๆŸฅ็œ‹ [HS ็ผ–็ ๆ•…้šœๆŽ’ๆŸฅ](docs/HS_CODE_TROUBLESHOOTING.md)ใ€‚ ### Q5: ๅ›ž็ญ”ไธญๆฒกๆœ‰ๆ˜พ็คบๅผ•็”จๆฅๆบ - **ๅŽŸๅ› **: ๅ‰็ซฏๅผ•็”จ็ป„ไปถๆœชๆญฃ็กฎๆธฒๆŸ“๏ผŒๆˆ–ๅŽ็ซฏๆœช่ฟ”ๅ›žๆฅๆบไฟกๆฏใ€‚ - **่งฃๅ†ณ**: - ็กฎ่ฎค `MarkdownRenderer` ไฝฟ็”จไบ† `CitationRenderer`ใ€‚ - ๆŸฅ็œ‹ [ๅผ•็”จไผ˜ๅŒ–ๆ–‡ๆกฃ](docs/citation_optimization.md)ใ€‚ ### Q6: Team ๆจกๅผๆŠฅ้”™ `404 Session not found` ๐Ÿ†• - **ๅŽŸๅ› **: Agno Team ้œ€่ฆๆ•ฐๆฎๅบ“ๆ”ฏๆŒ Session ๆŒไน…ๅŒ–ใ€‚ - **่งฃๅ†ณ**: - ็กฎ่ฎค PostgreSQL ๅทฒๅฏๅŠจไธ” `.env` ไธญ `DB_*` ้…็ฝฎๆญฃ็กฎใ€‚ - ๆฃ€ๆŸฅ `app/teams/navigator_team.py` ไธญ `db=_get_team_db()` ๆ˜ฏๅฆๆญฃ็กฎๅˆๅง‹ๅŒ–ใ€‚ - ๅ‚่€ƒ [Team ๅฎž็Žฐ่ฎกๅˆ’](docs/navigator_team_implementation_plan.md)ใ€‚ ### Q7: TTFT๏ผˆ้ฆ– Token ๆ—ถ้—ด๏ผ‰่ฟ‡้•ฟ ๐Ÿ†• - **ๅŽŸๅ› **: ้ข„ๅค„็†้˜ปๅกžๆˆ–ๆจกๅž‹ๆŽจ็†ๅปถ่ฟŸใ€‚ - **่งฃๅ†ณ**: - Team ๆจกๅผๅทฒไผ˜ๅŒ–๏ผš้ข„ๅค„็†็งป่‡ณๆŒ‰้œ€ `normalize_product` ๅทฅๅ…ท่ฐƒ็”จใ€‚ - Agent ๆจกๅผๅฏๅฏ็”จๅŽๅฐๅนถ่กŒ้ข„ๅค„็†๏ผˆ`asyncio.create_task`๏ผ‰ใ€‚ --- ## ๐Ÿ“– ็›ธๅ…ณๆ–‡ๆกฃ | ๆ–‡ๆกฃ | ่ฏดๆ˜Ž | |------|------| | [็Žฏๅขƒ้…็ฝฎๆŒ‡ๅ—](docs/environment_config.md) | ็Žฏๅขƒๅ˜้‡ไธŽๆ•ฐๆฎๅบ“้…็ฝฎ | | [ๆฃ€็ดข่ฐƒไผ˜ๆŒ‡ๅ—](docs/RETRIEVAL_OPTIMIZATION.md) | RAG ๆฃ€็ดขๆ€ง่ƒฝไผ˜ๅŒ– | | [Team ๅฎž็Žฐ่ฎกๅˆ’](docs/navigator_team_implementation_plan.md) | ไธ‰ๆจกๅ—ๆžถๆž„่ฎพ่ฎกไธŽๅฎž็Žฐ ๐Ÿ†• | --- *Built with โค๏ธ by the Sage Team. | Last Updated: 2026-01*