ããã«ã¡ã¯ãLayerX Ai Workforceäºæ¥é¨ã§SWEã¨ãã¦ã¤ã³ã¿ã¼ã³ããã¦ããYuã§ãã
æ¬è¨äºã§ã¯ãAIã®ææ¡ããã®ã¾ã¾å®è£ ãã¦ãã¾ããããªãã£ãçµé¨ãããã¬ã¼ã ã¯ã¼ã¯ã®ã½ã¼ã¹ã³ã¼ããèªãã§è§£æ±ºã«è³ã£ãããã»ã¹ãããã¦ãã®éç¨ã§æãããã¨ã«ã¤ãã¦ã話ããã¾ãã
ã¯ããã«
ã¿ãªããã¯ãæ®æ®µéçºãããã¨ãã«ãCoding Agentã使ã£ã¦ãã¾ããï¼ Claude Codeããªãªã¼ã¹ããã¦ãããCoding Agentã®æµããå éããããã«æãã¦ãããæè¿ã§ã¯èªåèªèº«ã§ã³ã¼ããæ¸ããã¨ãããªãæ¸ã£ã¦ãã¦ãã¾ããèªåã¯ã½ããã¦ã§ã¢éçºãå§ãã¦2å¹´ã»ã©ãªã®ã§ãããèªåã®æé·ã¹ãã¼ããé¥ãã«è¶ ããé度ã§é²åããCoding Agentãè¦ã¦ããã¨ãèªåãå¦ã¶æå³ã¨ã¯ï¼ã¨æã£ã¦ãã¾ããã¨ãæã ããã¾ãã ãããªä¸ãèªåãªãã«å¦ã¶ãã¨ã®æ¥½ãããéè¦æ§ãæããã¿ã¹ã¯ãããã®ã§ããã®ã話ã«ã¤ãã¦æ¸ãããã¨æãã¾ãã
çºçãã¦ããåé¡
Ai Workforceäºæ¥é¨ã§ã¯ãããã¯ã¨ã³ãã¨ãã¦Pythonã®FastAPIã使ç¨ãã¦ãã¾ãã
ããæããããã¼ã«ã«ã§ã®éçºä¸ã«ããããªãã¼ãããµã¼ãã¼ã·ã£ãããã¦ã³ã確ççã«ãã¾ããããªãã¨ããç¾è±¡ãçãã¾ãããåãæä½ã§ãæåããã失æããããããããåç¾æ§ããªãåå ã®ç¹å®ãé£ããç¶æ ã§ããã
æ¬çªç°å¢ã§ã®å½±é¿ã¯ç¹ã«ãªãã£ãã®ã§ãããéçºæã«ããããªãã¼ãããã¾ããããªãã¨ããã®ã¯å°å³ã«ä¸ä¾¿ã§ãéçºçç£æ§ã«å½±é¿ãåºã¦ãããããæ¹åãããã¨ãããã¨ã«ãªãèªåãåãçµããã¨ã«ãªãã¾ããã
ã¾ãAIã«èãã¦ã¿ã
ã¿ã¹ã¯ã«çæããç´å¾ã¯ãSSEï¼Server-Sent Eventsï¼å¨ããåå ã«ãªã£ã¦ãããã ãªã¨ããªãã¨ãªãäºæ³ãã¦ãã¾ããããã ããSSEãæªããã以ä¸ã®ä»®èª¬ãç«ã¦ãããç¶æ ã§ã¯ãªããã¾ãã¦ãããããªãã¼ããã·ã£ãããã¦ã³ã®ä»çµã¿èªä½ãæ£ç¢ºã«ã¯çè§£ãã¦ãã¾ããã§ããã
ããã§ãæ®æ®µãã使ã£ã¦ããã³ã¼ãã£ã³ã°ã¨ã¼ã¸ã§ã³ãã«èãã¦ã¿ãã¨ãããon_event("shutdown") ã§SSEæ¥ç¶ãæ¢ããã¨ããææ¡ããã¦ãããã¾ããã
on_event("shutdown") ã«ã¤ãã¦ç°¡åã«èª¬æããã¨ãFastAPIãæä¾ãããã¢ããªçµäºæã«å¼ã°ããããã¯ãã§ãã
ã¤ã¾ããææ¡ãããæ¹éã¯ãã·ã£ãããã¦ã³æã«ãã®ããã¯ã®ä¸ã§ãã©ã°ãç«ã¦ãSSEã®ã«ã¼ããçµäºãããã¨ããæ¹éã§ãã
ããã£ã½ãæ¹éã ã£ãã®ã§å®è£ ãã¦ã¿ãã®ã§ããããããã¾ãããã¾ããã§ããã
ãªããã¾ããããªãã£ãã®ãããã®æç¹ã®èªåã«ã¯ãããã¾ããã§ãããAIã®ææ¡ãããã£ã¨ããããã£ãããããããä½ãééã£ã¦ããã®ãã®è¦å½ãã¤ããªãã£ãã®ã§ãã
FastAPIã®ã·ã£ãããã¦ã³ã®ä»çµã¿ãçè§£ãã
AIã®ææ¡ã§è§£æ±ºã§ããªãã£ããã¨ã§ãããããèªåãã·ã£ãããã¦ã³ã®ä»çµã¿ãçè§£ãã¦ããªããã¨ãåé¡ãªã®ã§ã¯ãªããã¨æãã¾ããã ããã§ã¾ãã¯ãã½ã¼ã¹ã³ã¼ããèªãã§ãä»çµã¿ãçè§£ãããã¨ã«ãã¾ããã
FastAPIã¯å
é¨çã«ã¯ uvicorn ã¨ããASGIãµã¼ãã¼ã®ä¸ã§åãã¦ãã¾ãã
ä»åã®åé¡ã¯ã·ã£ãããã¦ã³å¦çã«é¢ãããã®ã ã£ããããuvicorn ã®ã½ã¼ã¹ã³ã¼ããèªããã¨ã«ãã¾ããã
ã³ã¼ãã追ã£ã¦ããã¨ãã·ã£ãããã¦ã³ã¯ããããæ¬¡ã®é çªã§è¡ããã¦ãããã¨ããããã¾ããã
- SIGTERM / SIGINTã®åä¿¡
- æ°è¦ãªã¯ã¨ã¹ãã®åä»åæ¢
- ã¢ã¯ãã£ããªæ¥ç¶ãéããã®ãå¾ ã¤ï¼ããã«SSEã®ãããªé·å¯¿å½æ¥ç¶ãå«ã¾ããï¼
- lifespanã®shutdownï¼
on_event("shutdown")ãªã©ï¼
å®éã®å¦çãããã£ããããã¨ãã®é çªã§å®è¡ããã¦ãã¾ãã
# uvicorn/server.pyï¼ç°¡ç¥åã»æç²ï¼ async def shutdown(...): # æ°è¦æ¥ç¶ã®åä»ã忢 server.close() # æ¢åã®æ¥ç¶ãçµããã®ãå¾ ã¤ await self._wait_tasks_to_complete() # ã¢ããªã±ã¼ã·ã§ã³ã®shutdownå¦ç await self.lifespan.shutdown()
â»ãã詳細ãªå®è£ ã¯ãã¡ããã覧ãã ãã
ãã¤ã³ãã¯ãlifespanã®shutdownãå¼ã°ããã®ã¯ä¸çªæå¾ã¨ããç¹ã§ãã
ã¾ããããããªãã¼ãæã®æåã«ã¤ãã¦ã確èªãã¾ããã
uvicornã®ãªãã¼ãæ©è½ã§ã¯ããµã¼ãã¼ã¯ãµãããã»ã¹ã¨ãã¦èµ·åããã¦ããããã¡ã¤ã«å¤æ´ãæ¤ç¥ãããã¨ãã®ããã»ã¹ã«å¯¾ã㦠SIGTERM ãéããã¾ãã
ã¤ã¾ããããããªãã¼ãã®å®ä½ã¯ãããã»ã¹ã®åèµ·åãã§ãã
åå ã®ç¹å®ã¨ããªãAIã®ææ¡ã§ã¯ãã¾ããããªãã£ãã®ã
ã·ã£ãããã¦ã³ã®ä»çµã¿ãçè§£ããä¸ã§æ¹ãã¦åé¡ãæ´çããã¨ãåå ã¯æç¢ºã§ããã
- SIGTERM / SIGINTã®åä¿¡
- æ°è¦ãªã¯ã¨ã¹ãã®åä»åæ¢
- ã¢ã¯ãã£ããªæ¥ç¶ãéããã®ãå¾ ã¤ â SSEæ¥ç¶ãç¡éã«ã¼ãã§çãç¶ãã¦ãããããããã§æ¢ã¾ã
- lifespanã®shutdown â ããã«å°éããªã
AIãææ¡ãã on_event("shutdown") ã¯ãã¹ããã4ã§å®è¡ãããå¦çã§ããããããåé¡ã¯ã¹ããã3ã§çºçãã¦ãã¾ãããSSEæ¥ç¶ãéããªãããã¹ããã4ã«é²ããªããã¹ããã4ã§SSEãæ¢ãããã¨ãã¦ããããããããã«è¾¿ãçããªãã®ã§ãã
ã¾ã確ççã«ã·ã£ãããã¦ã³ããã¾ããããªãåå ãããã§å¤æãã¾ãããSSEæ¥ç¶ãå¿ è¦ãªç»é¢ãéãã¦ããªãå ´åã«ã¯ãSSEæ¥ç¶ãéããå¿ è¦ããªããããåé¡ãªãã¹ããã4ã«é²ããã¨ãã§ããã
ã¤ã¾ããåé¡ãªãã·ã£ãããã¦ã³ã§ãããã©ããã¯ãSSEæ¥ç¶ã®æç¡æ¬¡ç¬¬ãªããã確ççãªæåã«è¦ãã¦ãã¾ããã
ãã®ãé çªããããã£ãç¬éã解決çãè¦ãã¾ããã
ã¹ããã4ã® on_event("shutdown") ã§å¯¾å¿ããã®ã§ã¯ãªãããã£ã¨æåãã·ã°ãã«ãåãåã£ãæç¹ã§SSEæ¥ç¶ã«çµäºãéç¥ããå¿
è¦ãããã¾ãã
å
·ä½çã«ã¯ãSIGTERM / SIGINT ãåããã¿ã¤ãã³ã°ã§ãSSEã®ã«ã¼ããèªçºçã«çµäºã§ããããã«ãã©ã°ãç«ã¦ãæ¹éã«ãã¾ãããããã¾ã§è§£å度ãä¸ãã£ã¦ããã¨ãAIã«å¯¾ãã¦å
·ä½çãªæç¤ºãåºããã¨ãã§ããä¸çºã§ä¿®æ£ããããã¨ãã§ãã¾ããã
å®è£
ã¨ãã¦ã¯ãuvicornãå
é¨ã§ç»é²ãã¦ããã·ã°ãã«ãã³ãã©ããã®ã¾ã¾ç½®ãæããã®ã§ã¯ãªãããã®å段ã§å°ãã ãå¦çãæãå½¢ã«ãã¦ãã¾ãã
ã·ã°ãã«ãåãããã¾ãSSEå´ã«çµäºéç¥ãéãããã®å¾ã§å
ã®ãã³ãã©ã«å¦çãå§è²ãããã¨ããæµãã§ãã
ããã«ãã£ã¦ãã¢ã¯ãã£ããªSSEæ¥ç¶ãçµäºå¾
ã¡ã§è©°ã¾ãåã«ã«ã¼ããæããããã«ãªãããã®å¾ã®é常ã®ã·ã£ãããã¦ã³å¦çã lifespan ã«ããã¯ãªã¼ã³ã¢ããããããã¾ã§éãæ£ããå®è¡ãããããã«ãªãã¾ããã
ä¿®æ£èªä½ã¯æ°åè¡ç¨åº¦ã§ãä»çµã¿ããçè§£ãã¦ãã¾ãã°ã·ã³ãã«ãªãã®ã§ããã
ã¾ã¨ã
Coding Agentã¯ãããã¹ãã¼ãã§é²åãã¦ãã¦ãéçºã¹ã¿ã¤ã«ã大ããå¤ãã¤ã¤ããã¾ããããè¨ãèªåèªèº«ãæ¥ã å©ãããã¦ããããã§ã«Coding Agentãªãã§ã®éçºã¯æ³åãã§ãã¾ããã
ãã ä»åãAIã®ææ¡ããã®ã¾ã¾å®è£ ãã¦ãã¾ãããããã½ã¼ã¹ã³ã¼ããèªãã§è§£æ±ºããã¨ããçµé¨ãéãã¦ããåçãçè§£ãããã¨ãã®å¤§åããæ¹ãã¦å®æãããã¨ãã§ãã¾ãããã·ã£ãããã¦ã³ã®é çªã¨ããããã£ãä¸ã¤ã®ç¥èãããããªããã§ãAIã®ææ¡ãæ£ãããã©ããã®å¤æããæ£ãã解決çãå°ãããã®AIã¸ã®æç¤ºã®åºãæ¹ããå ¨ã¦ãå¤ãã£ã¦ãã¾ãã
ã³ã¼ããèªåã§æ¸ãæ©ä¼ã¯æ¸ã£ã¦ããããããã¾ããããæè¡ãçè§£ãããã¨ããå§¿å¢ã¯ãããããæã¡ç¶ãããã¨æãã¾ããããã¦å¹¸ããªãã¨ã«ãçè§£ããããã®ãã¼ãã«ãAIã«ãã£ã¦ä¸ãã£ã¦ãã¾ããä»åã®uvicornã®ã½ã¼ã¹ã³ã¼ãããåºæ¬çã«ã¯AIã¨ä¸¦èµ°ããªããçè§£ãé²ãã¾ããã
ã¾ããã·ã³ãã«ã«èªåã®ç¥ããªããã¨ãçè§£ããã¨ããã®ã¯éå¸¸ã«æ¥½ãããã¨ã ã¨ãããåå¿ãæãåºããã¨ãã§ãã¾ããã
AIãªã©ã®ãã¼ã«ããã¾ãæ´»ç¨ãã¦ãèªåèªèº«ã®æé·ã«ç¹ãã¦ããããã§ãã
ãããã«
LayerXã§ã¯ãBet AIããæ²ããå ¨ç¤¾ã§AIã®æ´»ç¨ã¨æ°ããéçºã¹ã¿ã¤ã«ã®æ¨¡ç´¢ãæ¨é²ãã¦ãã¾ããå§åçãªã¹ãã¼ãã§é²åããAIãæ¥½ãã¿ãªãããèªãã®æè¡åãã¢ãããã¼ããç¶ãããã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³ãçµ¶è³åéä¸ã§ãï¼
â¼ æè¡ã楽ãã¿ãªãã確ããªæé·ãç®æãã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³ã«èå³ã®ããæ¹ã¯ãã¡ã
â¼ ãBet AIããæ²ããã¨ã³ã¸ãã¢çµç¹ã®è£å´ããã£ã¨ç¥ãããæ¹ã¯ãã¡ã
æè¡ã¸ã®ç¥ç好å¥å¿ãçµ¶ããããAIã¨å ±ã«æ°ããéçºã®å½¢ã模索ãããæ¹ãã¾ãã¯ã«ã¸ã¥ã¢ã«ã«ã話ãã§ããã®ã楽ãã¿ã«ãã¦ãã¾ãï¼