diff --git a/README.md b/README.md index 156f751..ee7de8c 100644 --- a/README.md +++ b/README.md @@ -29,16 +29,22 @@ - ๐ŸŒ **็ฝ‘้กตๆŠ“ๅ–**๏ผšๆๅ–็ฝ‘้กตๆญฃๆ–‡ๅ†…ๅฎน - ๐Ÿ” **็Ÿฅ่ฏ†ๅบ“ๆฃ€็ดข๏ผˆRAG๏ผ‰**๏ผšๅŸบไบŽๅ‘้‡ๆ•ฐๆฎๅบ“็š„ๆ™บ่ƒฝ้—ฎ็ญ” - ๐Ÿ”„ **ๅคšๆจกๅž‹ๅˆ‡ๆข**๏ผšๅ‰็ซฏๅฏ้€‰ๆ‹ฉไธๅŒๅคง่ฏญ่จ€ๆจกๅž‹ +- ๐Ÿ“‡ **้€š่ฎฏๅฝ•็ฎก็†**๏ผšๅญๅ›พๆจกๅ—๏ผŒ่”็ณปไบบ CRUDใ€้‚ฎไปถๅค„็† +- ๐Ÿ“– **ๆ™บ่ƒฝ่ฏๅ…ธ**๏ผšๅญๅ›พๆจกๅ—๏ผŒ็ฟป่ฏ‘ใ€็”Ÿ่ฏๆœฌใ€ไธ“ไธšๆœฏ่ฏญๆๅ– +- ๐Ÿ“ฐ **่ต„่ฎฏๅˆ†ๆž**๏ผšๅญๅ›พๆจกๅ—๏ผŒ่ต„่ฎฏ่Žทๅ–ใ€ๅ†…ๅฎนๅˆ†ๆžใ€ๆ ผๅผๅŒ–ๅฑ•็คบ ### ๆŠ€ๆœฏ็‰นๆ€ง - โœ… **ๆŒไน…ๅŒ–่ฎฐๅฟ†**๏ผšPostgreSQL ๅญ˜ๅ‚จๅฏน่ฏๅކๅฒ๏ผŒ้‡ๅฏไธไธขๅคฑ -- โœ… **้ซ˜ๅฏ็”จๆžถๆž„**๏ผšๆจกๅž‹่‡ชๅŠจ้™็บง๏ผŒ็กฎไฟๆœๅŠก็จณๅฎš +- โœ… **้ซ˜ๅฏ็”จๆžถๆž„**๏ผšๆจกๅž‹ๆœๅŠก่‡ชๅŠจ้™็บง๏ผŒ็กฎไฟๆœๅŠก็จณๅฎš - โœ… **ๅ‰ๅŽ็ซฏๅˆ†็ฆป**๏ผšFastAPI ๅŽ็ซฏ + Streamlit ๅ‰็ซฏ - โœ… **Docker ้ƒจ็ฝฒ**๏ผšไธ€้”ฎๅฏๅŠจๆ‰€ๆœ‰ๆœๅŠก - โœ… **่ฟœ็จ‹ๆœๅŠกๆžถๆž„**๏ผšPostgreSQL ๅ’Œ Qdrant ้ƒจ็ฝฒๅœจ่ฟœ็จ‹ๆœๅŠกๅ™จ - โœ… **ๆตๅผๅ“ๅบ”**๏ผšSSE ๆตๅผ่พ“ๅ‡บ๏ผŒๆๅ‡็”จๆˆทไฝ“้ชŒ - โœ… **ๆจกๅ—ๅŒ–่ฎพ่ฎก**๏ผšๆธ…ๆ™ฐ็š„ไปฃ็ ๅˆ†ๅฑ‚๏ผŒๆ˜“ไบŽๆ‰ฉๅฑ•ๅ’Œ็ปดๆŠค +- โœ… **ๆจกๅž‹ๆœๅŠกๅฑ‚**๏ผš็ปŸไธ€็š„ Embeddingใ€Rerankใ€Chat ๆœๅŠกๆŽฅๅฃ๏ผŒๆ”ฏๆŒ่‡ชๅŠจ้™็บง +- โœ… **ๅญๅ›พ็ณป็ปŸ**๏ผšๆจกๅ—ๅŒ–็š„ๅญๅ›พๆžถๆž„๏ผŒๅ…ฑไบซๅ…ฌๅ…ฑๅทฅๅ…ท๏ผˆๆ„ๅ›พ็†่งฃใ€ไบบๅทฅๅฎกๆ ธใ€ๆ ผๅผๅŒ–่พ“ๅ‡บ๏ผ‰ +- โœ… **React ๆจกๅผ**๏ผšๅพช็ŽฏๆŽจ็† + ่ถ…ๆ—ถ้‡่ฏ• + ็ป“ๆž„ๅŒ–้”™่ฏฏๅค„็† --- @@ -51,8 +57,14 @@ | **LLM ๆœๅŠก** | ไบ‘็ซฏๆจกๅž‹ | ๆ™บ่ฐฑ AI (glm-4.7-flash) | v4.7 | ๅฟซ้€Ÿๅ“ๅบ”๏ผŒ้€‚ๅˆๆ—ฅๅธธๅฏน่ฏ | | | | DeepSeek (deepseek-reasoner) | v3 | ๆทฑๅบฆๆŽจ็†๏ผŒ้€‚ๅˆๅคๆ‚้—ฎ้ข˜ | | | ๆœฌๅœฐๆจกๅž‹ | Gemma-4-E4B-it | v4 | ๆœฌๅœฐ้ƒจ็ฝฒ๏ผŒไฟๆŠค้š็ง | +| **ๆจกๅž‹ๆœๅŠกๅฑ‚** | Chat ๆœๅŠก | chat_services.py | - | ็ปŸไธ€็š„็”Ÿๆˆๅผๅคงๆจกๅž‹ๆŽฅๅฃ | +| | Embedding ๆœๅŠก | embedding_services.py | - | ็ปŸไธ€็š„ๅตŒๅ…ฅๆจกๅž‹ๆŽฅๅฃ | +| | Rerank ๆœๅŠก | rerank_services.py | - | ็ปŸไธ€็š„้‡ๆŽ’ๅบๆŽฅๅฃ | +| | ๆœๅŠกๅŸบ็ฑป | base.py | - | BaseServiceProvider + FallbackServiceChain + SingletonServiceManager | | **Embedding** | ๅ‘้‡ๅตŒๅ…ฅ | llama.cpp server | latest | ๆœฌๅœฐ embedding ๆœๅŠก๏ผŒๆ”ฏๆŒๅคš็งๆจกๅž‹ | | **Agent ๆก†ๆžถ** | ๅทฅไฝœๆต็ผ–ๆŽ’ | LangGraph + LangChain | latest | ็Šถๆ€ๆœบ้ฉฑๅŠจ็š„ๆ™บ่ƒฝไฝ“ๅทฅไฝœๆต | +| **ๅญๅ›พ็ณป็ปŸ** | ๆจกๅ—ๅŒ–ๅญๅ›พ | agent_subgraphs/ | - | ้€š่ฎฏๅฝ•ใ€่ฏๅ…ธใ€่ต„่ฎฏๅˆ†ๆž็ญ‰ๅญๅ›พ | +| | ๅ…ฌๅ…ฑๅทฅๅ…ท | common/ | - | ็Šถๆ€ๅŸบ็ฑปใ€ๆ„ๅ›พ็†่งฃใ€ๆ ผๅผๅŒ–่พ“ๅ‡บใ€ไบบๅทฅๅฎกๆ ธ | | **ๅ‘้‡ๆ•ฐๆฎๅบ“** | ๅ‘้‡ๆฃ€็ดข | Qdrant | v1.12+ | ้ซ˜ๆ€ง่ƒฝๅ‘้‡็›ธไผผๅบฆๆฃ€็ดข๏ผˆ่ฟœ็จ‹ๆœๅŠกๅ™จ๏ผ‰ | | **ๅŽ็ซฏๆก†ๆžถ** | API ๆœๅŠก | FastAPI + Uvicorn | v0.115+ | RESTful API + WebSocket + SSE ๆตๅผ่พ“ๅ‡บ | | **ๅ‰็ซฏๆก†ๆžถ** | Web ็•Œ้ข | Streamlit | v1.40+ | ไบคไบ’ๅผๅฏน่ฏ็•Œ้ข๏ผŒ็ป„ไปถๅŒ–่ฎพ่ฎก | @@ -66,39 +78,54 @@ graph TB User[็”จๆˆทๆต่งˆๅ™จ] -->|HTTP/SSE| Frontend[Streamlit ๅ‰็ซฏ :8501] Frontend -->|REST API| Backend[FastAPI ๅŽ็ซฏ :8083] - + Backend --> AgentService[AIAgentService] - - AgentService -->|ๆจกๅž‹่ทฏ็”ฑ| LLMFactory[LLM Factory] - LLMFactory -->|ๅˆ›ๅปบ| Zhipu[ๆ™บ่ฐฑ GLM-4.7] - LLMFactory -->|ๅˆ›ๅปบ| DeepSeek[DeepSeek Reasoner] - LLMFactory -->|ๅˆ›ๅปบ| LocalGemma[ๆœฌๅœฐ Gemma-4] - + Backend --> SubgraphAPI[ๅญๅ›พ API ็ซฏ็‚น] + + AgentService -->|ๆจกๅž‹่ทฏ็”ฑ| ChatServices[ๆจกๅž‹ๆœๅŠกๅฑ‚ chat_services] + ChatServices -->|่‡ชๅŠจ้™็บง| FallbackChain[FallbackServiceChain] + FallbackChain -->|ๅˆ›ๅปบ| Zhipu[ๆ™บ่ฐฑ GLM-4.7] + FallbackChain -->|ๅˆ›ๅปบ| DeepSeek[DeepSeek Reasoner] + FallbackChain -->|ๅˆ›ๅปบ| LocalGemma[ๆœฌๅœฐ Gemma-4] + AgentService -->|ๅˆๅง‹ๅŒ–| LangGraph[LangGraph ๅทฅไฝœๆตๅผ•ๆ“Ž] - + LangGraph -->|่Š‚็‚น1| RetrieveMemory[่ฎฐๅฟ†ๆฃ€็ดข] LangGraph -->|่Š‚็‚น2| MemoryTrigger[่ฎฐๅฟ†่งฆๅ‘] - LangGraph -->|่Š‚็‚น3| LLMCall[LLM ่ฐƒ็”จ] + LangGraph -->|่Š‚็‚น3| LLMCall[LLM ่ฐƒ็”จ (React ๆจกๅผ)] LangGraph -->|่Š‚็‚น4| ToolNode[ๅทฅๅ…ทๆ‰ง่กŒ] LangGraph -->|่Š‚็‚น5| Summarize[่ฎฐๅฟ†ๆ‘˜่ฆ] LangGraph -->|่Š‚็‚น6| Finalize[ๆœ€็ปˆๅค„็†] - + ToolNode -->|่ฐƒ็”จ| Tools[ๅทฅๅ…ท้›†ๅˆ] Tools -->|ๅคฉๆฐ”| WeatherTool[ๅคฉๆฐ”ๆŸฅ่ฏข] Tools -->|ๆ–‡ไปถ| FileTool[ๆ–‡ไปถ่ฏปๅ–] Tools -->|็ฝ‘้กต| WebTool[็ฝ‘้กตๆŠ“ๅ–] Tools -->|RAG| RAGTool[็Ÿฅ่ฏ†ๅบ“ๆฃ€็ดข] - + RAGTool -->|ๆฃ€็ดข| Qdrant[(Qdrant ๅ‘้‡ๅบ“)] - RAGTool -->|้‡ๆŽ’ๅบ| CrossEncoder[Cross-Encoder] - + RAGTool -->|้‡ๆŽ’ๅบ| RerankService[rerank_services] + RAGTool -->|ๅตŒๅ…ฅ| EmbeddingService[embedding_services] + RetrieveMemory -->|ๅญ˜ๅ‚จ| PostgreSQL[(PostgreSQL)] Summarize -->|ๅญ˜ๅ‚จ| PostgreSQL - + + SubgraphAPI -->|่ทฏ็”ฑ| Subgraphs[ๅญๅ›พ็ณป็ปŸ agent_subgraphs] + Subgraphs --> Contact[้€š่ฎฏๅฝ•ๅญๅ›พ] + Subgraphs --> Dictionary[่ฏๅ…ธๅญๅ›พ] + Subgraphs --> NewsAnalysis[่ต„่ฎฏๅˆ†ๆžๅญๅ›พ] + Subgraphs --> Common[ๅ…ฌๅ…ฑๅทฅๅ…ท common/] + Common --> Intent[ๆ„ๅ›พ็†่งฃ (React)] + Common --> HumanReview[ไบบๅทฅๅฎกๆ ธ] + Common --> Formatter[ๆ ผๅผๅŒ–่พ“ๅ‡บ] + Common --> StateBase[็Šถๆ€ๅŸบ็ฑป] + style User fill:#e1f5ff style Frontend fill:#fff4e1 style Backend fill:#e8f5e9 + style ChatServices fill:#c8e6c9 style LangGraph fill:#f3e5f5 + style Subgraphs fill:#fff3e0 style PostgreSQL fill:#ffebee style Qdrant fill:#ffebee ``` @@ -174,24 +201,30 @@ Agent1/ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py โ”‚ โ”‚ โ”œโ”€โ”€ config.py # ้…็ฝฎ็ฎก็† โ”‚ โ”‚ โ”œโ”€โ”€ logger.py # ๆ—ฅๅฟ—ๅทฅๅ…ท -โ”‚ โ”‚ โ”œโ”€โ”€ backend.py # FastAPI ๅŽ็ซฏๅบ”็”จ +โ”‚ โ”‚ โ”œโ”€โ”€ backend.py # FastAPI ๅŽ็ซฏๅบ”็”จ๏ผˆๅซๅญๅ›พ API๏ผ‰ โ”‚ โ”‚ โ”œโ”€โ”€ agent/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py -โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ service.py # Agent ๆœๅŠกๆ ธๅฟƒ -โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ llm_factory.py # LLM ๅทฅๅŽ‚ +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ service.py # Agent ๆœๅŠกๆ ธๅฟƒ๏ผˆไฝฟ็”จ chat_services๏ผ‰ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ history.py # ๅކๅฒๆŸฅ่ฏขๆœๅŠก โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ prompts.py # ๆ็คบๆจกๆฟ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ rag_initializer.py # RAG ๅทฅๅ…ทๅˆๅง‹ๅŒ– +โ”‚ โ”‚ โ”œโ”€โ”€ model_services/ # ๆจกๅž‹ๆœๅŠกๅฑ‚๏ผˆๆ–ฐๅขž๏ผ‰ +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ base.py # ๅŸบ็ฑป๏ผšBaseServiceProvider, FallbackServiceChain, SingletonServiceManager +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ chat_services.py # ็”Ÿๆˆๅผๅคงๆจกๅž‹ๆœๅŠก๏ผˆๆ›ฟไปฃ llm_factory๏ผ‰ +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ embedding_services.py # ๅตŒๅ…ฅๆจกๅž‹ๆœๅŠก +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ rerank_services.py # ้‡ๆŽ’ๅบๆœๅŠก โ”‚ โ”‚ โ”œโ”€โ”€ graph/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ graph_builder.py # LangGraph ๅ›พๆž„ๅปบๅ™จ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ graph_tools.py # ๅทฅๅ…ทๅฎšไน‰ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ state.py # ็Šถๆ€ๅฎšไน‰ +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ rag_nodes.py # RAG ้›†ๆˆ่Š‚็‚น โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ retrieve_memory.py # ่ฎฐๅฟ†ๆฃ€็ดข โ”‚ โ”‚ โ”œโ”€โ”€ nodes/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ router.py # ่ทฏ็”ฑๅ†ณ็ญ– -โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ llm_call.py # LLM ่ฐƒ็”จ่Š‚็‚น +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ llm_call.py # LLM ่ฐƒ็”จ่Š‚็‚น๏ผˆReact ๆจกๅผ๏ผ‰ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ tool_call.py # ๅทฅๅ…ทๆ‰ง่กŒ่Š‚็‚น โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ retrieve_memory.py # ่ฎฐๅฟ†ๆฃ€็ดข่Š‚็‚น โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ summarize.py # ่ฎฐๅฟ†ๅญ˜ๅ‚จ่Š‚็‚น @@ -203,11 +236,38 @@ Agent1/ โ”‚ โ”‚ โ”œโ”€โ”€ rag/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ retriever.py # ๆฃ€็ดขๅ™จ -โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ reranker.py # ้‡ๆŽ’ๅบ +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ rerank.py # ้‡ๆŽ’ๅบไธšๅŠก้€ป่พ‘๏ผˆไฝฟ็”จ rerank_services๏ผ‰ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ query_transform.py # ๆŸฅ่ฏข่ฝฌๆข โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ pipeline.py # RAG ๆตๆฐด็บฟ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ fusion.py # RAG-Fusion โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ tools.py # RAG ๅทฅๅ…ท +โ”‚ โ”‚ โ”œโ”€โ”€ agent_subgraphs/ # ๅญๅ›พๆจกๅ—๏ผˆๆ–ฐๅขž๏ผ‰ +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ README.md # ๅญๅ›พๆ–‡ๆกฃ +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ common/ # ๅ…ฌๅ…ฑๅทฅๅ…ท +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ state_base.py # ็Šถๆ€ๅŸบ็ฑป +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ intent.py # ๆ„ๅ›พ็†่งฃ๏ผˆReact ๆจกๅผ๏ผ‰ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ formatter.py # ๆ ผๅผๅŒ–่พ“ๅ‡บๅทฅๅ…ท +โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ human_review.py # ไบบๅทฅๅฎกๆ ธ่Š‚็‚น +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ contact/ # ้€š่ฎฏๅฝ•ๅญๅ›พ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ state.py # ็Šถๆ€ๅฎšไน‰ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ nodes.py # ่Š‚็‚นๅฎž็Žฐ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ graph.py # ๅ›พๆž„ๅปบ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ api_client.py # API ๅฎขๆˆท็ซฏ +โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ __init__.py +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ dictionary/ # ่ฏๅ…ธๅญๅ›พ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ state.py # ็Šถๆ€ๅฎšไน‰ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ nodes.py # ่Š‚็‚นๅฎž็Žฐ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ graph.py # ๅ›พๆž„ๅปบ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ api_client.py # API ๅฎขๆˆท็ซฏ +โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ __init__.py +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ news_analysis/ # ่ต„่ฎฏๅˆ†ๆžๅญๅ›พ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ state.py # ็Šถๆ€ๅฎšไน‰ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ nodes.py # ่Š‚็‚นๅฎž็Žฐ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ graph.py # ๅ›พๆž„ๅปบ +โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ api_client.py # API ๅฎขๆˆท็ซฏ +โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ __init__.py +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ research/ # ็ ”็ฉถๅˆ†ๆžๅญๅ›พ๏ผˆ่ง„ๅˆ’ไธญ๏ผ‰ โ”‚ โ”‚ โ””โ”€โ”€ utils/ โ”‚ โ”‚ โ””โ”€โ”€ __init__.py โ”‚ โ””โ”€โ”€ rag_core/ @@ -226,7 +286,7 @@ Agent1/ โ”‚ โ””โ”€โ”€ src/ โ”‚ โ”œโ”€โ”€ __init__.py โ”‚ โ”œโ”€โ”€ frontend_main.py # Streamlit ไธปๅ…ฅๅฃ -โ”‚ โ”œโ”€โ”€ api_client.py # API ๅฎขๆˆท็ซฏ +โ”‚ โ”œโ”€โ”€ api_client.py # API ๅฎขๆˆท็ซฏ๏ผˆๅซๅญๅ›พ่ฐƒ็”จ๏ผ‰ โ”‚ โ”œโ”€โ”€ config.py # ๅ‰็ซฏ้…็ฝฎ โ”‚ โ”œโ”€โ”€ state.py # ็Šถๆ€็ฎก็† โ”‚ โ”œโ”€โ”€ logger.py # ๆ—ฅๅฟ— @@ -255,7 +315,7 @@ Agent1/ โ”œโ”€โ”€ test/ # ๆต‹่ฏ•็›ฎๅฝ• โ”‚ โ”œโ”€โ”€ test_backend.py โ”‚ โ”œโ”€โ”€ test_rag.py -โ”‚ โ”œโ”€โ”€ test_dqrant.py +โ”‚ โ”œโ”€โ”€ test_qdrant.py โ”‚ โ””โ”€โ”€ test_rag_indexer_result.py โ”œโ”€โ”€ .gitea/ โ”‚ โ””โ”€โ”€ workflows/ @@ -785,7 +845,156 @@ RAG ็ณป็ปŸๅˆ†ไธบไธคไธช็‹ฌ็ซ‹ไฝ†ๅๅŒ็š„้˜ถๆฎต๏ผš --- -## ๏ฟฝ๏ฟฝ ๅฟซ้€Ÿๅผ€ๅง‹ +## ๐Ÿงฉ ๅญๅ›พ็ณป็ปŸๆžถๆž„ + +### ่ฎพ่ฎก็†ๅฟต + +ๅญๅ›พ็ณป็ปŸ้‡‡็”จๆจกๅ—ๅŒ–่ฎพ่ฎก๏ผŒๆฏไธชๅญๅ›พๆ˜ฏไธ€ไธช็‹ฌ็ซ‹็š„ LangGraph ๅทฅไฝœๆต๏ผŒๅ…ฑไบซๅ…ฌๅ…ฑๅทฅๅ…ทๅบ“ใ€‚ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ ๅญๅ›พ็ณป็ปŸๆžถๆž„ โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ๅ…ฌๅ…ฑๅทฅๅ…ทๅบ“ (common/) โ”‚ โ”‚ +โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ state_base โ”‚ โ”‚ intent โ”‚ โ”‚ formatter โ”‚ โ”‚human โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ (็Šถๆ€) โ”‚ โ”‚ (React) โ”‚ โ”‚ (ๆ ผๅผๅŒ–) โ”‚ โ”‚reviewโ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ†“ โ†“ โ†“ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ้€š่ฎฏๅฝ•ๅญๅ›พ โ”‚ โ”‚ ่ฏๅ…ธๅญๅ›พ โ”‚ โ”‚ ่ต„่ฎฏๅˆ†ๆžๅญๅ›พ โ”‚ โ”‚ +โ”‚ โ”‚ (contact/) โ”‚ โ”‚ (dictionary/) โ”‚ โ”‚ (news_analysis) โ”‚ โ”‚ +โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ +โ”‚ โ”‚ state.py โ”‚ โ”‚ state.py โ”‚ โ”‚ state.py โ”‚ โ”‚ +โ”‚ โ”‚ nodes.py โ”‚ โ”‚ nodes.py โ”‚ โ”‚ nodes.py โ”‚ โ”‚ +โ”‚ โ”‚ graph.py โ”‚ โ”‚ graph.py โ”‚ โ”‚ graph.py โ”‚ โ”‚ +โ”‚ โ”‚ api_client.py โ”‚ โ”‚ api_client.py โ”‚ โ”‚ api_client.py โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ โ”‚ +โ”‚ โ–ผ โ”‚ +โ”‚ FastAPI ๅญๅ›พ็ซฏ็‚น โ”‚ +โ”‚ (backend/app/backend.py) โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### ๅ…ฌๅ…ฑๅทฅๅ…ท่ฏดๆ˜Ž + +#### 1. state_base.py - ็Šถๆ€ๅŸบ็ฑป +ๆไพ›็ฑปๅž‹ๅฎ‰ๅ…จ็š„็Šถๆ€ๅŸบ็ฑป๏ผŒๆ‰€ๆœ‰ๅญๅ›พ็Šถๆ€็ปงๆ‰ฟๆญค็ฑปใ€‚ + +#### 2. intent.py - ๆ„ๅ›พ็†่งฃ๏ผˆReact ๆจกๅผ๏ผ‰ +ๆ™บ่ƒฝๅ†ณ็ญ–่Š‚็‚น๏ผŒๅˆคๆ–ญๆ˜ฏๅฆ้œ€่ฆ่ฐƒ็”จ RAGใ€ๆ˜ฏๅฆ้œ€่ฆ้‡ๆ–ฐๆฃ€็ดขใ€ๆ˜ฏๅฆ้œ€่ฆ่ฐƒ็”จๅทฅๅ…ทใ€‚ + +```python +# ๆ ธๅฟƒๅŠŸ่ƒฝ +- ๆ„ๅ›พๅˆ†็ฑป๏ผš้—ฒ่Š / ๆŸฅ่ฏข / ไปปๅŠก +- RAG ๅ†ณ็ญ–๏ผšๆ˜ฏๅฆ้œ€่ฆๆฃ€็ดข็Ÿฅ่ฏ†ๅบ“ +- ๆฃ€็ดข็ญ–็•ฅ๏ผšๆ˜ฏๅฆ้œ€่ฆๅคš่ทฏๆฃ€็ดข / ๆ˜ฏๅฆ้œ€่ฆ้‡ๆ–ฐๆฃ€็ดข +``` + +#### 3. formatter.py - ๆ ผๅผๅŒ–่พ“ๅ‡บๅทฅๅ…ท +ไฝฟ็”จ Jinja2 ๆจกๆฟๆไพ›็พŽ่ง‚็š„ Markdown ๆ ผๅผๅŒ–่พ“ๅ‡บใ€‚ + +#### 4. human_review.py - ไบบๅทฅๅฎกๆ ธ่Š‚็‚น +ไฝฟ็”จ LangGraph ็š„ interrupt ๆœบๅˆถๅฎž็Žฐไบบๅทฅๅฎกๆ ธๆต็จ‹๏ผŒๆ”ฏๆŒ๏ผš +- ็กฎๅฎš / ๅ–ๆถˆ / ็ปง็ปญ ไธ‰็งๆ“ไฝœ +- ็Šถๆ€ๆŒไน…ๅŒ– +- ๅผ‚ๆญฅ็ญ‰ๅพ… + +### ๅญๅ›พๅผ€ๅ‘ๆŒ‡ๅ— + +#### ๅˆ›ๅปบๆ–ฐๅญๅ›พ็š„ๆญฅ้ชค + +1. **ๅˆ›ๅปบๅญๅ›พ็›ฎๅฝ•** +```bash +mkdir backend/app/agent_subgraphs/my_subgraph +``` + +2. **ๅˆ›ๅปบ็Šถๆ€ๅฎšไน‰ (state.py)** +```python +from typing_extensions import TypedDict +from ..common.state_base import BaseSubgraphState + +class MySubgraphState(BaseSubgraphState): + \"\"\" + ๆˆ‘็š„ๅญๅ›พ็Šถๆ€ + \"\"\" + my_field: str + my_list: list[str] +``` + +3. **ๅฎž็Žฐ่Š‚็‚น (nodes.py)** +```python +from langgraph.graph import StateGraph +from .state import MySubgraphState + +def my_node(state: MySubgraphState) -> MySubgraphState: + \"\"\" + ๆˆ‘็š„่Š‚็‚น + \"\"\" + # ๅฎž็Žฐ้€ป่พ‘ + return state +``` + +4. **ๆž„ๅปบๅ›พ (graph.py)** +```python +from langgraph.graph import StateGraph, END +from .state import MySubgraphState +from .nodes import my_node + +def build_my_subgraph() -> StateGraph: + \"\"\" + ๆž„ๅปบๆˆ‘็š„ๅญๅ›พ + \"\"\" + graph = StateGraph(MySubgraphState) + + graph.add_node("my_node", my_node) + graph.set_entry_point("my_node") + graph.add_edge("my_node", END) + + return graph.compile() +``` + +5. **ๆทปๅŠ  API ๅฎขๆˆท็ซฏ (api_client.py)**๏ผˆๅฏ้€‰๏ผ‰ +็”จไบŽไธŽๅค–้ƒจ API ไบคไบ’ใ€‚ + +6. **ๅœจ backend.py ไธญๆทปๅŠ  API ็ซฏ็‚น** + +### ๅทฒๅฎž็Žฐ็š„ๅญๅ›พ + +#### 1. ้€š่ฎฏๅฝ•ๅญๅ›พ (contact/) +- ่”็ณปไบบ CRUD +- ้‚ฎไปถ่ฏปๅ–ไธŽๅฎกๆ ธ +- ๅค–ๅ‘้‚ฎไปถ +- ๆ™บ่ƒฝๅ—…ๆŽข +- ็ฒพ็พŽๆ ผๅผๅŒ–ๅฑ•็คบ + +#### 2. ่ฏๅ…ธๅญๅ›พ (dictionary/) +- ็ฟป่ฏ‘ใ€ๆŸฅ่ฏ +- ๆฏๆ—ฅไธ€่ฏ +- ไธ“ไธšๅ่ฏๆ็‚ผ +- ็”Ÿ่ฏๆœฌ็ฎก็† +- ็ฒพ็พŽๆ ผๅผๅŒ–ๅฑ•็คบ + +#### 3. ่ต„่ฎฏๅˆ†ๆžๅญๅ›พ (news_analysis/) +- ่ต„่ฎฏ่Žทๅ– +- ๅ†…ๅฎนๅˆ†ๆž +- ็ฒพ็พŽๆ ผๅผๅŒ–ๅฑ•็คบ + +#### 4. ็ ”็ฉถๅˆ†ๆžๅญๅ›พ (research/) - ่ง„ๅˆ’ไธญ +- ่”็ฝ‘ๆœ็ดข +- ๆŠฅๅ‘Š็”Ÿๆˆ +- ๅผ•็”จๆบฏๆบ +- ๅฏ่ง†ๅŒ–ๅ›พ่กจ + +--- + +## ๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹ ่ฏฆ็ป†ๅฏๅŠจๆŒ‡ๅ—่ฏทๆŸฅ็œ‹ [QUICKSTART.md](QUICKSTART.md) @@ -888,32 +1097,98 @@ def my_new_tool(param: str) -> str: ### ๆทปๅŠ ๆ–ฐๆจกๅž‹ -ๅœจ [backend/app/agent/llm_factory.py](file:///home/huang/Study/AIProject/Agent1/backend/app/agent/llm_factory.py) ไธญๆทปๅŠ ๆจกๅž‹ๅˆ›ๅปบๆ–นๆณ•๏ผš +ๅœจ [backend/app/model_services/chat_services.py](file:///root/projects/ailine/backend/app/model_services/chat_services.py) ไธญๆทปๅŠ ๆ–ฐ็š„ๆœๅŠกๆไพ›่€…๏ผš ```python -@staticmethod -def create_new_model(): - api_key = os.getenv("NEW_MODEL_API_KEY") - return ChatOpenAI( - base_url="https://api.new-model.com/v1", - api_key=SecretStr(api_key), - model="model-name", - temperature=0.1, - streaming=True, - ) +class NewModelChatProvider(BaseServiceProvider[BaseChatModel]): + """ + ๆ–ฐๆจกๅž‹ๆœๅŠกๆไพ›่€… + """ + + def __init__(self, model: str = "new-model-name"): + super().__init__("new_model_chat") + self._model = model + + def is_available(self) -> bool: + """ + ๆฃ€ๆŸฅๆ–ฐๆจกๅž‹ๆœๅŠกๆ˜ฏๅฆๅฏ็”จ + """ + if not os.getenv("NEW_MODEL_API_KEY"): + logger.warning("NEW_MODEL_API_KEY ๆœช้…็ฝฎ") + return False + logger.info(f"ๆ–ฐๆจกๅž‹ๆœๅŠก้…็ฝฎๆญฃ็กฎ๏ผŒๅ‡†ๅค‡ไฝฟ็”จ: {self._model}") + return True + + def get_service(self) -> BaseChatModel: + """ + ่Žทๅ–ๆ–ฐๆจกๅž‹ๆœๅŠก + """ + if self._service_instance is None: + from langchain_openai import ChatOpenAI + from pydantic import SecretStr + + self._service_instance = ChatOpenAI( + base_url="https://api.new-model.com/v1", + api_key=SecretStr(os.getenv("NEW_MODEL_API_KEY")), + model=self._model, + temperature=0.1, + max_tokens=4096, + timeout=60.0, + max_retries=2, + streaming=True, + ) + return self._service_instance ``` -็„ถๅŽๅœจ `CREATORS` ๅญ—ๅ…ธไธญๆณจๅ†Œ๏ผš +็„ถๅŽๅœจ `CHAT_PROVIDERS` ๅญ—ๅ…ธไธญๆณจๅ†Œ๏ผš ```python -CREATORS = { - "local": create_local, - "deepseek": create_deepseek, - "zhipu": create_zhipu, - "new_model": create_new_model, # ๆ–ฐๅขž +CHAT_PROVIDERS: Dict[str, Callable[[], BaseServiceProvider[BaseChatModel]]] = { + "local": lambda: LocalVLLMChatProvider(), + "zhipu": lambda: ZhipuChatProvider(), + "deepseek": lambda: DeepSeekChatProvider(), + "new_model": lambda: NewModelChatProvider(), # ๆ–ฐๅขž } ``` +### ไฝฟ็”จๆจกๅž‹ๆœๅŠก + +#### ็”Ÿๆˆๅผๅคงๆจกๅž‹ +```python +from app.model_services import get_chat_service, get_all_chat_services + +# ่‡ชๅŠจ้€‰ๆ‹ฉๅฏ็”จๆœๅŠก๏ผˆไผ˜ๅ…ˆๆœฌๅœฐ๏ผŒ้™็บงๆ™บ่ฐฑ๏ผŒๅ†้™็บง DeepSeek๏ผ‰ +llm = get_chat_service() + +# ่Žทๅ–ๆ‰€ๆœ‰ๅฏ็”จๆจกๅž‹๏ผˆ็”จไบŽๅคšๆจกๅž‹ๅˆ‡ๆข๏ผ‰ +all_llms = get_all_chat_services() # Dict[str, BaseChatModel] +``` + +#### ๅตŒๅ…ฅๆœๅŠก +```python +from app.model_services import get_embedding_service + +# ่‡ชๅŠจ้€‰ๆ‹ฉๅฏ็”จๆœๅŠก๏ผˆไผ˜ๅ…ˆๆœฌๅœฐ๏ผŒ้™็บงๆ™บ่ฐฑ๏ผ‰ +embeddings = get_embedding_service() + +# ไฝฟ็”จ +vector = embeddings.embed_query("hello") +``` + +#### ้‡ๆŽ’ๆœๅŠก +```python +from app.model_services import get_rerank_service +from app.rag.rerank import create_document_reranker + +# ่Žทๅ–ๅŽŸๅง‹้‡ๆŽ’ๆœๅŠก๏ผˆไป…่ฎก็ฎ—ๅˆ†ๆ•ฐ๏ผ‰ +rerank_service = get_rerank_service() +scores = rerank_service.compute_scores("query", ["doc1", "doc2"]) + +# ไฝฟ็”จไธšๅŠก้€ป่พ‘ๅฑ‚๏ผˆๅฎŒๆ•ด็š„ๆ–‡ๆกฃ้‡ๆŽ’๏ผ‰ +reranker = create_document_reranker() +sorted_docs = reranker.compress_documents(docs, "query", top_n=5) +``` + ### Docker ้ƒจ็ฝฒ ้กน็›ฎๅŒ…ๅซๅฎŒๆ•ด็š„ Docker ้…็ฝฎ๏ผš @@ -950,10 +1225,17 @@ CREATORS = { | `ZHIPUAI_API_KEY` | ๆ™บ่ฐฑAI APIๅฏ†้’ฅ | `your-api-key` | `your-api-key` | | `DEEPSEEK_API_KEY` | DeepSeek APIๅฏ†้’ฅ | `your-api-key` | `your-api-key` | | `LLAMACPP_API_KEY` | llama.cpp API ๅฏ†้’ฅ | `token-abc123` | `token-abc123` | +| `LLM_API_KEY` | ไธป LLM ๆœๅŠก API ๅฏ†้’ฅ | `token-abc123` | `token-abc123` | | `VLLM_BASE_URL` | LLM ๆœๅŠกๅœฐๅ€ | `http://127.0.0.1:8081/v1` | `http://your-server:8081/v1` | | `LLAMACPP_EMBEDDING_URL` | Embedding ๆœๅŠกๅœฐๅ€ | `http://127.0.0.1:8082/v1` | `http://your-server:8082/v1` | +| `LLAMACPP_RERANKER_URL` | Rerank ๆœๅŠกๅœฐๅ€ | `http://127.0.0.1:8083/v1` | `http://your-server:8083/v1` | +| `ZHIPU_EMBEDDING_MODEL` | ๆ™บ่ฐฑๅตŒๅ…ฅๆจกๅž‹๏ผˆๅฏ้€‰๏ผ‰ | `embedding-3` | `embedding-3` | +| `ZHIPU_RERANK_MODEL` | ๆ™บ่ฐฑ้‡ๆŽ’ๆจกๅž‹๏ผˆๅฏ้€‰๏ผ‰ | `rerank-2` | `rerank-2` | +| `ZHIPU_API_BASE` | ๆ™บ่ฐฑ API ๅŸบ็ก€ๅœฐๅ€๏ผˆๅฏ้€‰๏ผ‰ | `https://open.bigmodel.cn/api/paas/v4` | ๅŒๅทฆ | | `DB_URI` | PostgreSQL ่ฟžๆŽฅๅญ—็ฌฆไธฒ | `postgresql://...@115.190.121.151:5432/langgraph_db` | ๅŒๅทฆ | | `QDRANT_URL` | Qdrant ๅ‘้‡ๆ•ฐๆฎๅบ“ๅœฐๅ€ | `http://115.190.121.151:6333` | ๅŒๅทฆ | +| `QDRANT_API_KEY` | Qdrant API ๅฏ†้’ฅ | `your-api-key` | `your-api-key` | +| `QDRANT_COLLECTION_NAME` | Qdrant ้›†ๅˆๅ็งฐ | `rag_documents` | `rag_documents` | | `LOG_LEVEL` | ๆ—ฅๅฟ—็บงๅˆซ | `INFO` | `WARNING` | | `ENABLE_GRAPH_TRACE` | ๆ˜ฏๅฆๅฏ็”จๅ›พๆต่ฝฌ่ฟฝ่ธช | `true` | `false` | | `MEMORY_SUMMARIZE_INTERVAL` | ๅฏน่ฏๆ‘˜่ฆ็”Ÿๆˆ้—ด้š” | `10` | `10` |