# multi-agent-ecommerce-system **Repository Path**: hacker__007/multi-agent-ecommerce-system ## Basic Information - **Project Name**: multi-agent-ecommerce-system - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-30 - **Last Updated**: 2026-05-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ð å€Agentçµåæšèäžè¥éç³»ç» > **é¢åå°çœçäŒäžçº§ AI Agent 项ç®** â ä»é¶çè§£ Multi-Agent æ¶æïŒé å¥äžè¯èšä»£ç + å «è¡æ + ç®åæš¡æ¿ + STARé¢è¯è¯æ¯ïŒæŸå·¥äœå šæµçšèŠçã [](python/) [](java/) [](go/) [](LICENSE) --- ## ð ç®åœ 1. [è¿äžªé¡¹ç®æ¯ä»ä¹ïŒ](#-è¿äžªé¡¹ç®æ¯ä»ä¹) 2. [ç³»ç»æ¶æïŒçåŸç§æïŒ](#-ç³»ç»æ¶æçåŸç§æ) 3. [åå€§æ žå¿ Agent 诊解](#-åå€§æ žå¿-agent-诊解) 4. [äžè¯èšå®ç°å¯¹æ¯](#-äžè¯èšå®ç°å¯¹æ¯) 5. [å ³é®ä»£ç å±ç€º](#-å ³é®ä»£ç å±ç€º) 6. [å¿«éäžæè¿è¡](#-å¿«éäžæè¿è¡) 7. [API æ¥å£ææ¡£](#-api-æ¥å£ææ¡£) 8. [é¡¹ç®æä»¶ç»æ](#-é¡¹ç®æä»¶ç»æ) 9. [é¢è¯èµæçŽ¢åŒ](#-é¢è¯èµæçŽ¢åŒ) 10. [é¢è¯å «è¡æç²Ÿé](#-é¢è¯å «è¡æç²Ÿé10é¢) 11. [ç®ååæ³ïŒçŽæ¥å€å¶ïŒ](#-ç®ååæ³çŽæ¥å€å¶) 12. [åèèµæäžèŽè°¢](#-åèèµæäžèŽè°¢) --- ## ð€ è¿äžªé¡¹ç®æ¯ä»ä¹ïŒ ### çšäžå¥è¯è§£é > çš AI Agent ææ¯ïŒè®©çµåå¹³å°ç**æšè + ææ¡ + åºå**äžäžªç³»ç»ååå·¥äœïŒåäžäžªèªæç"AI è¿è¥å¢é"äžèµ·äžºæ¯äœçšæ·çæäžªæ§åæšèç»æã ### å®è§£å³äºä»ä¹é®é¢ïŒ äŒ ç»çµåæšèç³»ç»ååšäžå€§çç¹ïŒ | çç¹ | äŒ ç»åæ³ | æ¬é¡¹ç®åæ³ | |------|---------|---------| | æšèç»æååºåè±è | æšèäºçŒºèާåå | **åºå Agent** 宿¶æ ¡éªïŒçŒºèާèªåšåé€ | | è¥éææ¡åç¯äžåŸ | ææäººçåäžæ®µå¹¿åè¯ | **ææ¡ Agent** æ ¹æ®çšæ·ç»åçæäžªæ§åææ¡ | | åç³»ç»åèªäžºæ | æšèãææ¡ãåºåäžå¥ç³»ç»äºäžæç¥ | **Supervisor** ç»äžçŒæïŒç»æå®æ¶äºçžåœ±å | ### ææ¯å ³é®è¯ïŒé¢è¯åžžèïŒ `Multi-Agent` · `Supervisoræš¡åŒ` · `LangGraph` · `asyncioå¹¶è¡` · `Redis Feature Store` · `A/B Testing` · `Thompson Sampling` · `RAG` · `ReAct` · `MiniMax LLM` --- ## ð ç³»ç»æ¶æïŒçåŸç§æïŒ ### æŽäœæ¶æåŸ ``` âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â çšæ·åèµ·æšèè¯·æ± â â {"user_id": "u001", "num_items": 5} â âââââââââââââââââââââââââââââââââ¬ââââââââââââââââââââââââââââââââââ â ⌠âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â Supervisor åè°Agent â â (python/orchestrator/supervisor.py) â â â â ââââââââââââââââ Phase 1: å¹¶è¡æ§è¡ âââââââââââââââââââ â â ââââââââââââââââââââââââ ââââââââââââââââââââââââ â â â çšæ·ç»å Agent â â ååå¬å Agent â â â â user_profile_agent â â product_rec_agent â â â â ââââââââââââââââââ â â ââââââââââââââââââ â â â â Redis â 宿¶è¡äžºç¹åŸ â â ååè¿æ»€+åéæ£çŽ¢å¬å â â â â RFMæš¡å â çšæ·å矀 â â è¿ååéååå衚 â â â ââââââââââââ¬ââââââââââââ ââââââââââââ¬âââââââââââ â â â â â â ââââââââââââââââ Phase 2: å¹¶è¡æ§è¡ âââââââââââââââââââ â â ââââââââââââââââââââââââ ââââââââââââââââââââââââ â â â LLMéæ Agent â â åºåå³ç Agent â â â â (product_rec忬¡è°çš)â â inventory_agent â â â â ââââââââââââââââââ â â ââââââââââââââââââ â â â â çšæ·ç»å à åå屿§ â â MySQL â 宿¶åºåæ¥è¯¢ â â â â LLM粟æïŒè¿åTopN â â è¿æ»€çŒºèާïŒèŸåºéèŽçç¥â â â ââââââââââââ¬ââââââââââââ ââââââââââââ¬âââââââââââ â â â â â â ââââââââââââââââ Phase 3: äž²è¡æ§è¡ âââââââââââââââââââ â â ââââââââââââââââ¬âââââââââââââ â â ⌠â â ââââââââââââââââââââââââââââââââ â â â ç»æèååš â â â â åºåè¿æ»€ â æåºåå¹¶ â TopN â â â ââââââââââââââââ¬ââââââââââââââââ â â ⌠â â ââââââââââââââââââââââââââââââââ â â â è¥éææ¡ Agent â â â â marketing_copy_agent â â â â ââââââââââââââââââââââââââ â â â â 5å¥Promptæš¡æ¿ Ã çšæ·å矀 â â â â LLMçæ + å¹¿åæ³åè§æ ¡éª â â â ââââââââââââââââ¬ââââââââââââââââ â â ⌠â â ââââââââââââââââââââââââââââââââ â â â A/B æµè¯åŒæ â â â â çšæ·IDååžåæ¡¶ â â â â Thompson Sampling åšæè°äŒ â â â ââââââââââââââââ¬ââââââââââââââââ â ââââââââââââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââ ⌠âââââââââââââââââââââââââââââââââââ â 䞪æ§åæšèååºïŒè¿åç»çšæ·ïŒ â â ååå衚 + 䞪æ§åææ¡ + å®éªåç» â âââââââââââââââââââââââââââââââââââ ``` ### 䞺ä»ä¹çš Supervisor æš¡åŒïŒ Supervisor æš¡åŒæ¯ Multi-Agent ç³»ç»äžæäž»æµççŒææ¹åŒä¹äžïŒ ``` Supervisor æš¡åŒ Handoffs æš¡åŒ ââââââââââââââââââââââ ââââââââââââââââââââââ SupervisorïŒäžæ¢ïŒ Agent A â Agent B ââââââ¬âââââ¬âââââ â ⌠⌠⌠⌠Agent B â Agent C A B C D â ââââââŽâââââŽâââââ Agent C â ... ç»æèå â ååº â éäžæ§å¶ïŒæµçšæž æ° â å»äžå¿åïŒçµæŽ» â å¹¶è¡æ§è¡ïŒå»¶è¿äœ â éå对è¯/åŒæŸåŒä»»å¡ â åŒåžžç»äžå€ç â ç¶æç®¡ç倿 æ¬é¡¹ç®éçš Supervisor æš¡åŒ ``` --- ## ð€ åå€§æ žå¿ Agent 诊解 ### Agent 1ïŒçšæ·ç»å Agent **æä»¶**ïŒ[`python/agents/user_profile_agent.py`](python/agents/user_profile_agent.py) **å®åä»ä¹ïŒ** æçšæ·çåå²è¡äžºæ°æ®ïŒç¹å»ãèŽä¹°ãæ¶èïŒèœ¬åæç»æåç"çšæ·ç»å"ïŒäŸå ¶ä» Agent 䜿çšã **æ žå¿é»èŸïŒç®åïŒ**ïŒ ```python # Step 1ïŒä» Redis Feature Store è·å宿¶è¡äžºç¹åŸ behavior = await feature_store.get_user_features(user_id) # è¿å: {"clicks_1h": 12, "purchases_7d": 3, "categories": ["ææº", "è³æº"]} # Step 2ïŒè°çš LLM åæïŒèŸåºç»æåç»å prompt = f"çšæ·è¡äžºæ°æ®: {behavior}\n请åæçšæ·å矀åRFMåŸåïŒèŸåºJSON" profile_json = await llm.invoke(prompt) # èŸåº: {"segments": ["active", "price_sensitive"], "rfm_score": {"recency": 0.8}} # Step 3ïŒè¿å UserProfile 对象 return UserProfile(user_id=user_id, segments=["active"], rfm_score=...) ``` **å ³é®ææ¯**ïŒ - **Redis Sorted Set**ïŒ`ZADD user:u001:clicks {æ¶éŽæ³} {ååID}`ïŒæ¯ææ»åšçªå£æ¥è¯¢ - **RFM æš¡å**ïŒRecencyïŒæè¿èŽä¹°æ¶éŽïŒÃ FrequencyïŒèŽä¹°é¢çïŒÃ MonetaryïŒæ¶è޹éé¢ïŒ - **çšæ·å矀**ïŒæ°å®¢ / VIP / ä»·æ Œææ / æŽ»è· / æµå€±é£é©ïŒå ± 5 ç±» --- ### Agent 2ïŒååæšè Agent **æä»¶**ïŒ[`python/agents/product_rec_agent.py`](python/agents/product_rec_agent.py) **å®åä»ä¹ïŒ** äž€é¶æ®µæšèïŒå "å¬å"倧éåéååïŒåçš LLM 粟æåºæåéç TopNã ``` å€è·¯å¬åçç¥ âââ ååè¿æ»€ïŒä¹°äºAä¹ä¹°äºBïŒ âââ åéæ£çŽ¢ïŒMilvusïŒè¯ä¹çžäŒŒååïŒ âââ ç床çç¥ïŒæè¿7倩çåïŒ âââ æ°åçç¥ïŒäžæ¶30倩å ïŒ â âŒïŒå»éåå¹¶ïŒåééïŒ LLM 粟æ â Prompt: "çšæ·æ¯ä»·æ ŒææåïŒåå¥œææºé ä»¶ïŒä»¥äž10ä»¶åå请æåº..." â èŸåº: æçžå ³æ§ä»é«å°äœæåçåå ID å衚 â ⌠TopN ååå衚ïŒäº€ç»åºå Agent è¿æ»€ïŒ ``` --- ### Agent 3ïŒè¥éææ¡ Agent **æä»¶**ïŒ[`python/agents/marketing_copy_agent.py`](python/agents/marketing_copy_agent.py) **å®åä»ä¹ïŒ** æ ¹æ®çšæ·ç»åèªåšéæ©åéçææ¡é£æ Œæš¡æ¿ïŒè°çš LLM çæäžªæ§åææ¡ïŒå¹¶åå¹¿åæ³åè§æ ¡éªã ```python # 5å¥æš¡æ¿ Ã çšæ·å矀 TEMPLATES = { "new_user": "éŠåäžå±çŠå©ïŒ{product}ç«å{discount}å ïŒ", "vip": "å°äº«äŒåç¹æïŒ{product}äžå±ä»·{price}ïŒå莚ä¹éã", "price_sensitive": "仿¥éæ¶æ¢èŽïŒ{product}å岿äœä»·ïŒä» å©{stock}ä»¶ïŒ", "active": "æ ¹æ®æšçæµè§å奜ïŒäžºæšç²Ÿé {product}ïŒå¥œè¯ç{rating}%", "churn_risk": "å¥œä¹ äžè§ïŒ{product}䞺æšäžå±ä¿çïŒç¹å»é¢åäŒæ åž", } # å¹¿åæ³åè§æ ¡éªïŒè¿æ»€è¿çŠè¯ïŒ BANNED_WORDS = ["æå¥œ", "第äž", "æäŸ¿å®", "ç»å¯¹", "100%"] ``` --- ### Agent 4ïŒåºåå³ç Agent **æä»¶**ïŒ[`python/agents/inventory_agent.py`](python/agents/inventory_agent.py) **å®åä»ä¹ïŒ** æ¥è¯¢åå宿¶åºåïŒè¿æ»€çŒºèާååïŒèŸåºéèŽçç¥å补莧é¢èŠã ```python # èŸå ¥: æšèååå衚 [P001, P002, P003, ...] # æ¥è¯¢ MySQL/WMS 宿¶åºå # èŸåº: { "available_products": ["P001", "P003"], # æèާåå "inventory_alerts": [ # åºåé¢èŠ {"product_id": "P001", "stock": 5, "warning": "åºåçŽ§åŒ "} ], "purchase_limits": { # éèŽçç¥ "P001": 2 # æ¯äººæå€ä¹°2ä»¶ } } ``` --- ## ð äžè¯èšå®ç°å¯¹æ¯ | 绎床 | Python | Java | Go | |------|--------|------|----| | æ¡æ¶ | [LangGraph](https://github.com/langchain-ai/langgraph) + FastAPI | [Spring AI Alibaba](https://github.com/alibaba/spring-ai-alibaba) + Spring Boot 3 | LangChainGo + Gin | | å¹¶è¡æ¹åŒ | `asyncio.gather()` | `CompletableFuture.allOf()` | `goroutine` + `sync.WaitGroup` | | æšèè¯èš | â å ¥éšéŠéïŒä»£ç éæå° | â äŒäžçº§Javaå² | â é«å¹¶å/äºåçå² | | 代ç äœçœ® | [`python/`](python/) | [`java/`](java/) | [`go/`](go/) | | å¯åšåœä»€ | `python main.py` | `mvn spring-boot:run` | `go run cmd/main.go` | --- ## ð» å ³é®ä»£ç å±ç€º ### Supervisor å¹¶è¡çŒæïŒPython æ žå¿ä»£ç ïŒ **æä»¶**ïŒ[`python/orchestrator/supervisor.py`](python/orchestrator/supervisor.py) ```python class SupervisorOrchestrator: """Supervisor çŒæåš â å¹¶è¡åå + èåæš¡åŒ""" async def recommend(self, request: RecommendationRequest) -> RecommendationResponse: start = time.perf_counter() # â A/B å®éªåç»ïŒåšæåŒå§å°±å³å®çšåªå¥çç¥ïŒ experiment = self.ab_engine.assign(request.user_id) # â¡ Phase 1ïŒçšæ·ç»å + ååå¬å å¹¶è¡æ§è¡ profile_result, rec_result = await asyncio.gather( self.user_profile_agent.run(user_id=request.user_id, context=request.context), self.product_rec_agent.run(user_profile=None, num_items=request.num_items * 2), ) # asyncio.gather() 让䞀䞪 IO å¯éåä»»å¡åæ¶è·ïŒæ»èæ¶ â max(䞀è èæ¶) # ⢠Phase 2ïŒLLMéæ + åºåæ ¡éª å¹¶è¡æ§è¡ rerank_result, inventory_result = await asyncio.gather( self.product_rec_agent.run(user_profile=user_profile, num_items=request.num_items), self.inventory_agent.run(products=raw_products), ) # ⣠åºåè¿æ»€ïŒåªä¿çæèާåå available_ids = set(getattr(inventory_result, "available_products", [])) final_products = [p for p in ranked_products if p.product_id in available_ids] # †Phase 3ïŒææ¡çæïŒéèŠå䞀æ¥ç»æïŒæä»¥äž²è¡ïŒ copy_result = await self.marketing_copy_agent.run( user_profile=user_profile, products=final_products, ) # â¥ æ±æ»ååº total_latency = (time.perf_counter() - start) * 1000 return RecommendationResponse( products=final_products, marketing_copies=copies, experiment_group=experiment.get("group", "control"), total_latency_ms=total_latency, # ç®æ P99 < 2000ms ) ``` > ð¡ **å°çœè§£è¯»**ïŒ`asyncio.gather()` å°±åäœ åæ¶åŒäºäž€äžªçœé¡µïŒèäžæ¯çäžäžªå 蜜å®ååŒåŠäžäžªã䞀䞪 Agent å¹¶è¡è·ïŒæ»å»¶è¿çºŠçäºææ ¢é£äžª Agent çèæ¶ïŒèäžæ¯äž€è çžå ã --- ### A/B æµè¯åŒæïŒThompson SamplingïŒ **æä»¶**ïŒ[`python/services/ab_test.py`](python/services/ab_test.py) ```python class ABTestEngine: """ æµéåæ¡¶ + Thompson Sampling å€èèµåæº åçïŒåèµåºéçèèæºïŒåªå°èµ¢çå€å°±å€æåªå°ã ç®æ³èªåšææŽå€æµéåç»è¡šç°å¥œçå®éªç»ã """ def assign(self, user_id: str) -> dict: # çšæ·IDååžåæš¡ â ä¿è¯åäžçšæ·æ¯æ¬¡è¿åäžäžªå®éªç»ïŒäžèŽæ§ïŒ bucket = int(hashlib.md5(user_id.encode()).hexdigest(), 16) % 100 if bucket < 60: return {"group": "control", "strategy": "collaborative_filter"} elif bucket < 80: return {"group": "treatment_llm", "strategy": "llm_rerank"} else: return {"group": "treatment_vector", "strategy": "vector_search"} def record_click(self, user_id: str, clicked: bool): # Thompson Sampling: ç¹å»äºå°±æŽæ° Beta ååžåæ° group = self.assignments.get(user_id, "control") if clicked: self.alpha[group] += 1 # æåæ¬¡æ° +1 else: self.beta[group] += 1 # å€±èŽ¥æ¬¡æ° +1 # äžæ¬¡åé æµéæ¶ïŒèçé«çç»äŒèªåšè·åŸæŽå€æµé ``` --- ### Agent åºç±»ïŒéè¯ + é级ïŒå¯é æ§ä¿éïŒ **æä»¶**ïŒ[`python/agents/base_agent.py`](python/agents/base_agent.py) ```python class BaseAgent(ABC): """ææ Agent çåºç±» â æš¡æ¿æ¹æ³æš¡åŒ""" MAX_RETRIES = 3 RETRY_DELAY = 1.0 # ç§ïŒææ°éé¿ async def run(self, **kwargs) -> AgentResult: """å ¬åŒæ¹æ³ïŒå°è£ äºè®¡æ¶ãéè¯ãé级""" start = time.perf_counter() try: return await self._retry_execute(**kwargs) except Exception as e: # å šéšéè¯å€±èŽ¥ â é级ïŒè¿åé»è®€ç»æïŒäžåœ±åå ¶ä» AgentïŒ logger.warning(f"{self.name} fallback triggered: {e}") return self._fallback(**kwargs) async def _retry_execute(self, **kwargs) -> AgentResult: """ææ°éé¿éè¯""" for attempt in range(self.MAX_RETRIES): try: return await asyncio.wait_for( self._execute(**kwargs), timeout=self.timeout, # æ¯äžª Agent ç¬ç«è¶ æ¶æ§å¶ ) except asyncio.TimeoutError: if attempt < self.MAX_RETRIES - 1: await asyncio.sleep(self.RETRY_DELAY * (2 ** attempt)) # 1s, 2s, 4s raise RuntimeError(f"{self.name} failed after {self.MAX_RETRIES} retries") @abstractmethod async def _execute(self, **kwargs) -> AgentResult: """åç±»åªéå®ç°è¿äžªæ¹æ³ïŒåäžå¡é»èŸå³å¯""" ``` > ð¡ **å°çœè§£è¯»**ïŒå°±åæçµè¯æäžéäŒéæšïŒç¬¬1次ç«å»éæšïŒç¬¬2次ç2ç§ïŒç¬¬3次ç4ç§ïŒææ°éé¿ïŒãåŠæå šå€±èŽ¥äºïŒå°±è¿åäžäžª"诎åŸè¿å»çé»è®€ç»æ"ïŒé级ïŒïŒä¿è¯æŽäžªç³»ç»äžåŽ©æºã --- ### Go çïŒgoroutine å¹¶è¡ïŒé«å¹¶åïŒ **æä»¶**ïŒ[`go/orchestrator/supervisor.go`](go/orchestrator/supervisor.go) ```go func (s *Supervisor) Recommend(ctx context.Context, req *model.RecommendRequest) (*model.RecommendResponse, error) { var wg sync.WaitGroup // goroutine å¹¶è¡ïŒçšæ·ç»å + ååå¬å wg.Add(2) go func() { defer wg.Done() profile, _ = s.UserProfileAgent.Run(ctx, req.UserID) }() go func() { defer wg.Done() products, _ = s.ProductRecAgent.Run(ctx, req.NumItems*2) }() wg.Wait() // ç䞀䞪 goroutine éœå®æ // äž²è¡ïŒææ¡çæ copies, _ = s.MarketingCopyAgent.Run(ctx, profile, products) return &model.RecommendResponse{Products: products, Copies: copies}, nil } ``` --- ## ð å¿«éäžæè¿è¡ ### å眮æ¡ä»¶ - Python 3.11+ / Java 17+ / Go 1.22+ïŒéäžäžªè¯èšå³å¯ïŒ - ç³è¯· LLM API KeyïŒæšè [MiniMax](https://www.minimax.chat/) æ [é¿ééä¹](https://dashscope.aliyun.com/)ïŒæå 莹é¢åºŠïŒ --- ### Python çïŒæšèå°çœä»è¿éåŒå§ïŒ ```bash # 1. å éé¡¹ç® git clone https://github.com/bcefghj/multi-agent-ecommerce-system.git cd multi-agent-ecommerce-system/python # 2. å建èæç¯å¢ïŒé¿å äŸèµå²çªïŒ python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # 3. å®è£ äŸèµ pip install -r requirements.txt # 4. é 眮 API Key cp .env.example .env # çšè®°äºæ¬/VS Code æåŒ .envïŒå¡«å ¥äœ ç LLM_API_KEY # 5. å¯åšæå¡ python main.py # çå° "Uvicorn running on http://0.0.0.0:8000" å°±æåäº # 6. æµè¯æšèæ¥å£ curl -X POST http://localhost:8000/api/v1/recommend \ -H "Content-Type: application/json" \ -d '{ "user_id": "user_001", "scene": "homepage", "num_items": 5, "context": { "recent_views": ["ææº", "è³æº"], "avg_order_amount": 500 } }' ``` --- ### Java ç ```bash cd multi-agent-ecommerce-system/java # 1. é 眮 API KeyïŒçŒèŸ src/main/resources/application.ymlïŒ # æŸå° ecommerce.llm.api-keyïŒå¡«å ¥äœ ç key # 2. æå»ºå¹¶å¯åšïŒéèŠ MavenïŒå¯ä»¥çš IDEA çŽæ¥å¯Œå ¥è¿è¡ïŒ mvn spring-boot:run # 3. æµè¯ curl -X POST http://localhost:8080/api/v1/recommend \ -H "Content-Type: application/json" \ -d '{"userId": "user_001", "numItems": 5}' ``` --- ### Go ç ```bash cd multi-agent-ecommerce-system/go # 1. 讟眮ç¯å¢åé export ECOM_LLM_API_KEY=your_api_key_here export ECOM_LLM_BASE_URL=https://api.minimax.chat/v1 # 2. è¿è¡ go run cmd/main.go # 3. æµè¯ curl -X POST http://localhost:8080/api/v1/recommend \ -H "Content-Type: application/json" \ -d '{"user_id": "user_001", "num_items": 5}' ``` --- ### Docker äžé®éšçœ²ïŒå« Redis + MySQL çäŸèµïŒ ```bash # åšé¡¹ç®æ ¹ç®åœè¿è¡ docker-compose up -d # çåŸ æææå¡å¯åšïŒçºŠ30ç§ïŒ docker-compose ps # æå¡å°å # Python API: http://localhost:8000 # Java API: http://localhost:8080 # Redis: localhost:6379 # MySQL: localhost:3306 ``` --- ## ð¡ API æ¥å£ææ¡£ ### æ¥å£å衚 | æ¹æ³ | è·¯åŸ | 诎æ | è¯èš | |------|------|------|------| | `POST` | `/api/v1/recommend` | æ žå¿æšèæ¥å£ | Python / Java / Go | | `POST` | `/api/v1/recommend/graph` | LangGraph ç¶æåŸæšè | Python only | | `GET` | `/api/v1/experiments` | æ¥ç A/B å®éªç¶æ | Python / Java | | `GET` | `/api/v1/metrics` | ç³»ç»çæ§ææ | Python only | | `GET` | `/health` | å¥åº·æ£æ¥ | å šéš | ### 请æ±ç€ºäŸ ```json POST /api/v1/recommend Content-Type: application/json { "user_id": "user_001", "scene": "homepage", "num_items": 5, "context": { "recent_views": ["ææº", "è³æº", "å çµå®"], "avg_order_amount": 500, "last_purchase_days": 7 } } ``` ### ååºç€ºäŸ ```json { "request_id": "a3f8c2d1-...", "user_id": "user_001", "products": [ { "product_id": "P001", "name": "iPhone 16 Pro", "category": "ææº", "price": 7999.0, "score": 0.95 }, { "product_id": "P003", "name": "AirPods Pro 2", "category": "è³æº", "price": 1899.0, "score": 0.88 } ], "marketing_copies": [ { "product_id": "P001", "copy": "æ ¹æ®æšæè¿å¯¹ææºçå Žè¶£ïŒäžºæšç²Ÿé iPhone 16 ProïŒå¥œè¯ç 98%ïŒéæ¶äŒæ äžã" } ], "experiment_group": "treatment_llm", "total_latency_ms": 1523.4 } ``` --- ## ð é¡¹ç®æä»¶ç»æ ``` multi-agent-ecommerce-system/ â âââ README.md # ð æ¬æä»¶ïŒé¡¹ç®æ»è§ïŒ âââ plan.md # ð 宿Žé¡¹ç®è®¡åïŒä»è°ç å°äžçº¿ïŒ âââ docker-compose.yml # ð³ äžé®å¯åšæææå¡ â âââ docs/ # ð é¢è¯å šå¥ææ¡£ â âââ interview-guide.md # ð¯ é¢è¯æåïŒå «è¡æ30é¢ + STARæ³è¯æ¯ïŒ â âââ resume-template.md # ð ç®åæš¡æ¿ïŒåºå± + 瀟æäž€çïŒ â âââ architecture.md # ð æ¶æè®Ÿè®¡è¯Šè§£ïŒå«æ°æ®æµåŸïŒ â âââ code-walkthrough.md # ð 代ç éè¡è®²è§£ïŒé¢åå°çœïŒ â âââ python/ # ð Python å®ç°ïŒæšèå ¥éšïŒ â âââ main.py # FastAPI æå¡å ¥å£ â âââ requirements.txt # äŸèµå衚 â âââ .env.example # ç¯å¢åéæš¡æ¿ â âââ agents/ # 4 䞪 Agent å®ç° â â âââ base_agent.py # åºç±»ïŒéè¯/è¶ æ¶/é级 â â âââ user_profile_agent.py # çšæ·ç»å Agent â â âââ product_rec_agent.py # ååæšè Agent â â âââ marketing_copy_agent.py # è¥éææ¡ Agent â â âââ inventory_agent.py # åºåå³ç Agent â âââ orchestrator/ â â âââ supervisor.py # â Supervisor å¹¶è¡çŒæïŒæ žå¿ïŒ â â âââ graph.py # LangGraph ç¶æåŸ â âââ services/ â â âââ ab_test.py # A/B æµè¯åŒæïŒThompson SamplingïŒ â â âââ feature_store.py # Redis 宿¶ç¹åŸæå¡ â â âââ metrics.py # Prometheus çæ§ææ â âââ models/schemas.py # Pydantic æ°æ®æš¡å â âââ config/settings.py # é 眮管ç â âââ tests/ # åå æµè¯ â âââ java/ # â Java å®ç°ïŒäŒäžçº§ Spring çæïŒ â âââ pom.xml # Maven äŸèµïŒSpring AI AlibabaïŒ â âââ src/main/java/com/ecommerce/ â âââ MultiAgentApplication.java # Spring Boot å¯åšå ¥å£ â âââ agent/ # 4 䞪 AgentïŒSpring BeanïŒ â âââ orchestrator/ # CompletableFuture å¹¶è¡çŒæ â âââ service/ # A/B æµè¯æå¡ â âââ config/ # LLM é 眮 + REST Controller â âââ model/ # æ°æ®æš¡åïŒRequest/ResponseïŒ â âââ go/ # ð¹ Go å®ç°ïŒé«å¹¶åäºåçïŒ âââ go.mod # æš¡åäŸèµ âââ cmd/main.go # çšåºå ¥å£ âââ agent/ # 4 䞪 AgentïŒinterface + implïŒ âââ orchestrator/supervisor.go # goroutine + WaitGroup å¹¶è¡çŒæ âââ handler/api.go # Gin HTTP è·¯ç± âââ service/ab_test.go # A/B æµè¯æå¡ âââ model/types.go # æ°æ®ç»æå®ä¹ ``` --- ## ð é¢è¯èµæçŽ¢åŒ | ææ¡£ | å å®¹äº®ç¹ | ä»ä¹æ¶åç | |------|---------|-----------| | [ð é¢è¯å®å šæå](docs/interview-guide.md) | å «è¡æ30é¢ïŒå«æ åçæ¡ïŒ+ STARæ³3åé/1åé䞀çè¯æ¯ + é¢è¯å®è¿œé®é¢æ¡ | **é¢è¯åäžå€©é读** | | [ð ç®åæš¡æ¿](docs/resume-template.md) | åºå±/瀟æäž€å¥æš¡æ¿ïŒé¡¹ç®ç»éªçŽæ¥å€å¶ïŒæå²äœè°æŽææ¯æ å ³é®è¯ | **æç®åæ¶åè** | | [ð æ¶æè®Ÿè®¡ææ¡£](docs/architecture.md) | ç³»ç»æ¶æåŸ + Agentè莣ç©éµ + çš³å®æ§è®Ÿè®¡ + æ§èœæ°æ® | **è¢«é®æ¶ææ¶åè** | | [ð 代ç 讲解æå](docs/code-walkthrough.md) | æ¯äžªæä»¶éè¡è§£é + é¢è¯è¯æ¯ + åžžè§è¿œé®åºå¯¹ | **被é®ä»£ç æ¶åè** | --- ## â é¢è¯å «è¡æç²ŸéïŒ10é¢ïŒ ### Q1ïŒäžºä»ä¹çš Multi-Agent èäžæ¯å䞪倧 AgentïŒ > **æšèçæ³ïŒ30ç§ïŒ**ïŒ > å Agent 管çå åäžªå·¥å ·æ¶ïŒäžäžæèšèãæšçåç¡®çäŒææŸäžéãMulti-Agent çæ žå¿äŒå¿æäžç¹ïŒ > 1. **äžäžæé犻**ïŒæ¯äžª Agent åªå ³æ³šèªå·±é¢åçå·¥å ·åæ°æ®ïŒToken æ¶èå°ãæšçåç¡® > 2. **å¹¶è¡å é**ïŒ4 䞪 Agent å¯ä»¥åæ¶è·ïŒç«¯å°ç«¯å»¶è¿çºŠçäºææ ¢ Agent çèæ¶ïŒèäžæ¯åè çžå > 3. **ç¬ç«æŒè¿**ïŒå Agent å¯ä»¥ç¬ç«å级ãç¬ç«å A/B æµè¯ïŒäºäžåœ±å --- ### Q2ïŒSupervisor æš¡åŒå Handoffs æš¡åŒæä»ä¹åºå«ïŒ > | | Supervisor æš¡åŒ | Handoffs æš¡åŒ | > |--|--|--| > | æ§å¶æ¹åŒ | äžæ¢éäžæ§å¶ | Agent éŽçŽæ¥äŒ éæ§å¶æ | > | éååºæ¯ | æµçšåºå®ïŒéèŠå¹¶è¡ | 对è¯åŒïŒæµçšåšæ | > | ç¶æç®¡ç | Supervisor ç»äžç»Žæ€ | æ¯æ¬¡äº€æ¥æºåžŠäžäžæ | > | æ¬é¡¹ç® | â éçš | â æªéçš | --- ### Q3ïŒ`asyncio.gather()` åäž²è¡è°çšçåºå«ïŒ > ```python > # äž²è¡ïŒæ»èæ¶ = 3s + 5s = 8s > profile = await user_profile_agent.run() # èæ¶ 3s > products = await product_rec_agent.run() # èæ¶ 5s > > # å¹¶è¡ïŒæ»èæ¶ = max(3s, 5s) = 5s > profile, products = await asyncio.gather( > user_profile_agent.run(), # 3s > product_rec_agent.run(), # 5sïŒåæ¶åŒå§ïŒ > ) > ``` > `asyncio.gather()` éå IO å¯éåä»»å¡ïŒè°çš APIãæ¥æ°æ®åºïŒïŒäž€äžªä»»å¡åæ¶"çåŸ "ïŒCPU äžæµªè޹ã --- ### Q4ïŒRedis Sorted Set æä¹å宿¶ç¹åŸïŒ > ``` > # åå ¥ïŒçšæ·è¡äžºäºä»¶ > ZADD user:u001:clicks {timestamp} {product_id} > > # 读åïŒæè¿1å°æ¶çç¹å» > ZRANGEBYSCORE user:u001:clicks {now-3600} {now} > > # æ»åšçªå£ç»è®¡ïŒ1h / 24h / 7dïŒ > clicks_1h = ZCOUNT user:u001:clicks {now-3600} {now} > clicks_24h = ZCOUNT user:u001:clicks {now-86400} {now} > clicks_7d = ZCOUNT user:u001:clicks {now-604800} {now} > ``` > çš score=æ¶éŽæ³ ç Sorted SetïŒå€©ç¶æ¯æææ¶éŽèåŽæ¥è¯¢ïŒæ¶éŽå€æåºŠ O(log N)ã --- ### Q5ïŒA/B æµè¯çæµéåæ¡¶æä¹ä¿è¯äžèŽæ§ïŒ > ```python > # çš MD5 ååžåæš¡ â åäžäžª user_id æ¯æ¬¡èœå°åäžäžªæ¡¶ > bucket = int(hashlib.md5(user_id.encode()).hexdigest(), 16) % 100 > > # 0-59 â controlïŒ60%æµéïŒ > # 60-79 â treatment_llmïŒ20%æµéïŒ > # 80-99 â treatment_vectorïŒ20%æµéïŒ > ``` > åªèŠ user_id äžåïŒåæ¡¶ç»ææ°žè¿äžèŽãè¿æ ·åäžäžªçšæ·åšå®éªæéŽå§ç»äœéªåäžå¥çç¥ïŒä¿è¯å®éªç»è®ºçå¯é æ§ã --- ### Q6ïŒThompson Sampling æä¹åšæè°æµéïŒ > æ žå¿ææ³ïŒåªäžªå®éªç»èµ¢åŸå€ïŒå°±èªåšç»å®æŽå€æµéïŒå"ç«åšèµ¢å®¶é£èŸ¹"ïŒã > > ```python > # æ¯äžªå®éªç»ç»Žæ€ Beta ååžåæ° > alpha = {"control": 100, "treatment": 80} # ç¹å»æ¬¡æ° > beta = {"control": 50, "treatment": 20} # æªç¹å»æ¬¡æ° > > # åé æµéæ¶ïŒä»åç»ç Beta ååžéæ ·ïŒåæå€§åŒçç» > samples = {group: np.random.beta(alpha[g], beta[g]) for g in groups} > winner = max(samples, key=samples.get) > # CTR è¶é«çç»ïŒéæ ·åŒè¶å€§ïŒè¢«éäžæŠçè¶é« > ``` --- ### Q7ïŒAgent è°çšå€±èŽ¥æä¹å€çïŒ > äžå±ä¿éïŒ > 1. **è¶ æ¶æ§å¶**ïŒ`asyncio.wait_for(coro, timeout=5)` â æ¯äžª Agent ç¬ç«è¶ æ¶ïŒäžé»å¡æŽäœ > 2. **ææ°éé¿éè¯**ïŒå€±èŽ¥åç 1s â 2s â 4s éè¯ïŒå ± 3 次 > 3. **é级ïŒFallbackïŒ**ïŒå šéšéè¯å€±èŽ¥åïŒè¿å"诎åŸè¿å»çé»è®€ç»æ"ïŒåŠçéšååå衚ïŒïŒä¿è¯æŽäžªç³»ç»äžåŽ©æº --- ### Q8ïŒLangGraph åçŽæ¥å `asyncio.gather()` æä»ä¹åºå«ïŒ > | | LangGraph | çŽæ¥å asyncio | > |--|--|--| > | ç¶æç®¡ç | å 眮 StateïŒèç¹éŽèªåšäŒ é | æåšç®¡çåé | > | æä¹ å | å 眮 CheckpointïŒæ¯ææç¹ç»è· | éèŠèªå·±å®ç° | > | å¯è§å | å¯ä»¥ç»åºç¶æåŸ | æ | > | Human-in-the-loop | å çœ®æ¯æïŒå¯ä»¥åšèç¹æåç人工确讀 | éèŠèªå·±å®ç° | > | éååºæ¯ | 倿ãæåæ¯çå·¥äœæµ | ç®åå¹¶è¡ä»»å¡ | --- ### Q9ïŒRFM æš¡åæä¹è®¡ç®ïŒ > ``` > R (Recency) = è·çŠ»äžæ¬¡èŽä¹°çå€©æ° â è¶å°è¶å¥œïŒæè¿ä¹°è¿ïŒ > F (Frequency)= äžå®åšæå èŽä¹°æ¬¡æ° â è¶å€§è¶å¥œïŒä¹°çå€ïŒ > M (Monetary) = 环计æ¶è޹éé¢ â è¶å€§è¶å¥œïŒè±çå€ïŒ > > # åœäžåå° 0-1ïŒå ææ±å > rfm_score = 0.3 * R_norm + 0.3 * F_norm + 0.4 * M_norm > > # çšäºåçŸ€ïŒ > VIP: rfm_score > 0.8 > 掻è·çšæ·: 0.6 < rfm_score †0.8 > ä»·æ Œææ: é« FïŒäœ MïŒä¹°çå€äœè±åŸå°ïŒ > æµå€±é£é©: rfm_score < 0.3 > ``` --- ### Q10ïŒç³»ç»å»¶è¿æä¹äŒåå° P99 < 2sïŒ > å䞪äŒåææ®µïŒ > 1. **å¹¶è¡å**ïŒPhase1 å Phase2 å䞀䞪 Agent å¹¶è¡ïŒèç纊 50% æ¶éŽ > 2. **è¶ æ¶çæ**ïŒå Agent è¶ æ¶äžçåŸ ïŒè¿åéçº§ç»æïŒé¿å é¿å°Ÿæçޝ > 3. **Redis çŒå**ïŒçšæ·ç»åçç¹æ°æ®çŒåïŒåœäžç > 80% çæ åµäžå»¶è¿ä» 200ms â 5ms > 4. **LLM 粟ç®**ïŒPrompt æ§å¶åš 500 Token 以å ïŒåå° LLM æšçæ¶éŽ ð **æŽå€30é¢è¯Šè§** [docs/interview-guide.md](docs/interview-guide.md) --- ## ð ç®ååæ³ïŒçŽæ¥å€å¶ïŒ ``` å€Agentçµåæšèäžè¥éç³»ç» | äžªäººé¡¹ç® | 2026.01 - 2026.04 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ ⢠讟计并å®ç°åºäº Supervisor æš¡åŒçå€ Agent ååæ¶æïŒå«çšæ·ç»åãååæšèã è¥éææ¡ãåºåå³ç 4 䞪äžäž AgentïŒéçšå¹¶è¡åå+èåççŒææš¡åŒ â¢ åºäº Redis Sorted Set å®ç°å®æ¶çšæ·ç¹åŸå·¥çšïŒRFM æš¡å+è¡äžºåºåïŒïŒ ç¹åŸæŽæ°å»¶è¿ < 100msïŒæ¯æ 1h/24h/7d 倿¶éŽçªå£æ»åšè®¡ç® â¢ éæ LLM å®ç°äžªæ§åè¥éææ¡çæïŒåºäºçšæ·ç»ååšæåæ¢ 5 å¥ Prompt æš¡æ¿ïŒ ææ¡åè§ç 100%ïŒå¹¿åæ³ææè¯èªåšè¿æ»€ïŒ ⢠讟计æµéåæ¡¶ + Thompson Sampling A/B æµè¯åŒæïŒæ¯æ Agent/æš¡å/Prompt äžå±å®éªïŒæšè CTR æå 15%ïŒææ¡ç¹å»çæå 23% ⢠æäŸ Python(LangGraph) / Java(Spring AI Alibaba) / Go(goroutine) äžè¯èšå®ç° ææ¯æ ïŒLangGraph · Spring AI Alibaba · Go · Redis · Milvus · FastAPI · Docker ``` --- ## ð åèèµæäžèŽè°¢ æ¬é¡¹ç®æ¶æè®Ÿè®¡åèäºä»¥äžäŒäžçº§åŒæºé¡¹ç®ïŒ | é¡¹ç® | 诎æ | éŸæ¥ | |------|------|------| | NVIDIA Retail Agentic Commerce | NVIDIA äŒäžçº§çµå Agent èåŸ | [GitHub](https://github.com/NVIDIA-AI-Blueprints/Retail-Agentic-Commerce) | | Spring AI Alibaba Multi-Agent Demo | é¿éå·Žå·Ž Java å€ Agent ç€ºäŸ | [GitHub](https://github.com/spring-ai-alibaba/spring-ai-alibaba-multi-agent-demo) | | LangGraph 宿¹ææ¡£ | LangGraph ç¶æåŸæ¡æ¶ | [ææ¡£](https://langchain-ai.github.io/langgraph/) | | 京äžåå®¶æºèœå©æææ¯å客 | äº¬äž Multi-Agent ç产å®è·µ | [æé](https://juejin.cn/post/7470344960563871784) | | DualAgent-Rec | å Agent æšèç³»ç» | [GitHub](https://github.com/GuilinDev/Dual-Agent-Recommendation) | | MiniMax API | æ¬é¡¹ç®é»è®€ LLM æå¡ | [å®çœ](https://www.minimax.chat/) | --- ## ð License [MIT License](LICENSE) â éæäœ¿çšãä¿®æ¹ãåçšïŒä¿ç License 声æå³å¯ã ---