Azure OpenAI Service ã® Assistants API ãçè§£ãã
ã¯ããã«
OpenAI DevDay ã«ãŠæ¬å®¶ OpenAI 㮠β çæ©èœãšããŠçºè¡šããã Assistants API ã Azure OpenAI Service (AOAI) ã§ã Assistants API (ãã¬ãã¥ãŒ) ãšããŠå©çšå¯èœã«ãªããŸãããããã§ãèªåèªèº«ã®çè§£ãèšèªåãå ŒããŠæ å ±ããŸãšããŸããã
ãªããæ¬èšäºã¯ AOAI ã®åºæ¬çãªéšåãããçšåºŠçè§£ã§ããŠããéçºè ãæ³å®ããŠæžãããŠããŸãã
ã远èšãAPI ã®æ£åŒå称㯠Assistants API ã§ããã®ã§å šè¬çã«ä¿®æ£ãè¡ããŸããã
Assistants API
Assistants API ãšã¯äœã
Assistants API 㯠éçºè ã«ããç¬èªã®ã¢ã·ã¹ã¿ã³ã (Microsoft çãªè¡šçŸããããš Copilot) ã¢ããªã±ãŒã·ã§ã³ã®éçºãå¹çåããããšãã§ãã API ã§ãã以åããååšããŠãã Chat Completions API ã¯ã¹ããŒãã¬ã¹ãª API ã§ãããããCopilot stack ã® "ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã¬ã€ã€ãŒ" ã®å šãŠãéçºè ãæ°ã«ããªããã°ãªããŸããã§ãããå ·äœçã«ã¯ä»¥äžã®ãããªåŠçã§ãã
- ã¢ã·ã¹ã¿ã³ããšå©çšè ã®éã®ã¡ãã»ãŒãžå±¥æŽã®ç®¡ç
- ã¢ãã«ã®æå€§ããŒã¯ã³ã«åãããã¡ãã»ãŒãžã®åãæšãŠ
- å®è¡ãã¹ãããŒã« (Code interpreter çã®ãã«ãã€ã³æ©èœã Function calling ã§å®çŸ©ãããå€éš API) ã®æšè«ããã³å®è¡å¶åŸ¡ (Reasoning and Acting; ReAct)
Assistants API ã¯ããããåŠçãæœè±¡åããŠãããŸããããã«ãããéçºè ã¯ä»¥äžã®ãããªããéãããæ å ±ã API ã«æž¡ãã ãã§ã¹ããŒããã«ãªåŠçãç°¡åã«å®è£ ããããšãã§ããããã«ãªããŸããã
- ã¢ã·ã¹ã¿ã³ãã®åå
- ã¢ã·ã¹ã¿ã³ããžã®æç€º (ã¢ã·ã¹ã¿ã³ãã®å®çŸ©ãç®çãªã©ãChat completions API ã® system message ã®ãããªãã®ã)
- ã¢ã·ã¹ã¿ã³ãã䜿çšå¯èœãªããŒã«ã®ãªã¹ã
- ã¢ã·ã¹ã¿ã³ãã䜿çšããã¢ãã« (AOAI ã®ãããã€ãæå®)
å³å¯ã«ã¯ç°ãªããããããŸããããAssistants API 㯠OSS ã©ã€ãã©ãªã§ãã LangChain ã§ãããšããã® Agent ã Semanic Kernel ã§ãããšããã® Planner ãšè¿ãç«ã¡äœçœ®ã® OpenAI ãã€ãã£ãçæ©èœãšèãããšã€ã¡ãŒãžããããããããããŸããã
ã€ã¡ãŒãžå³

åè
- Azure OpenAI Service announces Assistants API, New Models for Finetuning, Text-to-Speech and more
- Azure OpenAI Assistants API (ãã¬ãã¥ãŒ)
- Assistants API (æ¬å®¶ OpenAI)
- How Assistants work (æ¬å®¶ OpenAI)
- Microsoft ã® Copilot stack ãšã¯äœã
[è£è¶³] Reasoning and Acting (ReAct)
èšèªã¢ãã«ã«ãŠãŒã¶ãŒããã®ãªã¯ãšã¹ãã«å¿ããããã«å¿ èŠãªã¹ããããæšè«ãã (Reasoning)ãäžããããããŒã«ãå®è¡ã㊠(Acting) ãã®çµæãããšã«åçãçæããããã³ããã£ã³ã°ææ³ã¯ Reasoning and Acting (ReAct) ãšåŒã°ããŠããŸãã詳现ã¯ä»¥äžã®ãªã³ã¯å ãåç §ããŠãã ããã
åè
- ReAct: Synergizing Reasoning and Acting in Language Models
- ReAct Prompting
- ChatGPT - Azure OpenAI å€§å š
ãªããžã§ã¯ã
Assistants API ã¯ãªããžã§ã¯ãæåã§ããAssistants API ã«ã¯äžèšã®ãªããžã§ã¯ããååšããŠããããããã Python ã REST API ãä»ããŠæ±ããŸããå ·äœçãªäœ¿ãæ¹ã«é¢ããŠã¯åŸè¿°ããŸãã
| ãªããžã§ã¯ã | 説æ |
|---|---|
|
Assistant (ã¢ã·ã¹ã¿ã³ã) |
Azure OpenAI ã¢ãã«ãããŒã«ãšçµã¿åãããŠäœ¿ãã«ã¹ã¿ã AI ã®ãªããžã§ã¯ãã§ããinstruction (Chat completions API ã® system message ã®ãããªãã®)ãmodel (ã¢ã·ã¹ã¿ã³ãã䜿çšãã AOAI ã¢ãã«ã®ãããã€)ãtools (ã¢ã·ã¹ã¿ã³ãã䜿çšã§ããããŒã«ã®ãªã¹ã)ãfile_ids (ã¢ã·ã¹ã¿ã³ããã«äœ¿çšããããã«ã¢ããããŒãããããã¡ã€ã«) ãªã©ã®æ§ææ
å ±ãæ ŒçŽããŸãã |
|
Thread (ã¹ã¬ãã) |
ã¢ã·ã¹ã¿ã³ããšãŠãŒã¶ãŒã®éã®äŒè©±ã»ãã·ã§ã³ã®ãªããžã§ã¯ãã§ããã¹ã¬ããã¯ã¡ãã»ãŒãžãæ ŒçŽããã¹ã¬ããé·ãã¢ãã«ã®æå€§ããŒã¯ã³ã«åãããããã«èªåçã«ã¡ãã»ãŒãžã®åãæšãŠãè¡ããŸãã |
|
Message (ã¡ãã»ãŒãž) |
ã¢ã·ã¹ã¿ã³ããŸãã¯ãŠãŒã¶ãŒã«ãã£ãŠäœæãããã¡ãã»ãŒãžã®ãªããžã§ã¯ãã§ããã¡ãã»ãŒãžã«ã¯ããã¹ããç»åããã®ä»ã®ãã¡ã€ã«ãå«ããããšãã§ããŸããã¡ãã»ãŒãžã¯ã¹ã¬ããã«ãªã¹ããšããŠæ ŒçŽãããŸãã |
|
Run (å®è¡) |
ã¹ã¬ããäžã§ã®ã¢ã·ã¹ã¿ã³ãã®åŒã³åºãã®ãªããžã§ã¯ãã§ããã¢ã·ã¹ã¿ã³ãã¯ãã®æ§ææ å ±ãšã¹ã¬ããã®ã¡ãã»ãŒãžã䜿ã£ãŠãã¢ãã«ãšããŒã«ãåŒã³åºããŠã¿ã¹ã¯ãå®è¡ããŸããå®è¡ã®äžéšãšããŠãã¢ã·ã¹ã¿ã³ãã¯ã¹ã¬ããã«ã¡ãã»ãŒãžã远å ããŸãã |
|
Run Step (å®è¡ã¹ããã) |
ã¢ã·ã¹ã¿ã³ããå®è¡ã®äžéšãšããŠå®è¡ããã¹ãããã®è©³çްãªãªã¹ãã®ãªããžã§ã¯ãã§ããã¢ã·ã¹ã¿ã³ãã¯å®è¡äžã«ããŒã«ãåŒã³åºãããã¡ãã»ãŒãžãäœæãããããŸããå®è¡ã¹ãããã調ã¹ããšã¢ã·ã¹ã¿ã³ããã©ã®ããã«æçµçµæã«å°éãããã調ã¹ãããšãã§ããŸãã |
åè
- ã¢ã·ã¹ã¿ã³ãã®ã³ã³ããŒãã³ã
- How Assistants work (æ¬å®¶ OpenAI)
- Code Interpreter åŒã³åºãã®ä»çµã¿ãçè§£ãã
ããŒã«
Assistants API ã«ãŠéçºè ãã¢ã·ã¹ã¿ã³ãã«äžããããšãã§ããããŒã«ã«ã¯å€§ããåã㊠2 çš®é¡ããããŸãã
- AOAI ã«ãã£ãŠãã¹ããããŠããããŒã«
- å€éš API (ãŠãŒã¶ãŒããã¹ãããŠããç¬èª API ãªã©)
å·çæç¹ã§ãåäžã®ã¢ã·ã¹ã¿ã³ãã«æå®ããããšãã§ããããŒã«ã®ä»æ§äžã®æå€§æ°ã¯ 128 ã§ãããã ããããŒã«ã®éžæè¢ãå¢ããã»ã©ãŠãŒã¶ãŒã®æå³ãšéãããŒã«ãéžæãããå¯èœæ§ãé«ãŸããããéé²ã«ããŒã«ã远å ããã®ã§ã¯ãªãç®çã«å¿ããæäœéã®ããŒã«ãæå®ããæ¹ãè¯ããšæãããŸãã
åè
1. AOAI ã«ãã£ãŠãã¹ããããŠããããŒã«
1.1. Code interpreter
Code interpreter ã¯ãã®åã®ãšãã AOAI ã«ãã£ãŠãã¹ãããããµã³ãããã¯ã¹ç°å¢ã§ Python ã³ãŒããå®è¡ããããšãã§ããæ©èœã§ããã¢ã·ã¹ã¿ã³ãã®ããŒã«ãšã㊠Code interpreter ãæå¹åãããšãã¢ã·ã¹ã¿ã³ãã¯ç®çãéæããããã«å®è¡ã§ããã³ãŒããçæããããŸã§è©Šè¡é¯èª€ãç¹°ãè¿ããçµæãè¿ããŸãã
ãŸããCode interpreter ã¯ã¢ã·ã¹ã¿ã³ãã«å¯ŸããŠã¢ããããŒãããããã¡ã€ã«ãæ±ãããšãã§ããŸãããã®ããããŠãŒã¶ãŒã«ãã£ãŠã¢ããããŒããããããŒã¿ãã¡ã€ã«ãåæããŠããããããããããªäœ¿ãæ¹ãããããšãã§ããŸãã
ãªããCode interpreter ããµããŒããããŠããã¢ãã«ãAPI ããŒãžã§ã³ãæ±ãããã¡ã€ã«ã®æ¡åŒµåã«ã¯æå®ããããŸãã詳现ã«é¢ããŠã¯äžèšãªã³ã¯å ãåç §ããŠãã ããã
åè
- Azure OpenAI ã¢ã·ã¹ã¿ã³ã ã³ãŒã ã€ã³ã¿ãŒããªã¿ãŒ (ãã¬ãã¥ãŒ)
- ã¢ã·ã¹ã¿ã³ãã®ãµããŒã
- ãµããŒããããŠãããã¡ã€ã«ã®çš®é¡
[è£è¶³] 1.2. Knowledge retrieval
æ¬å®¶ OpenAI ã§æå®ã§ããããŒã«ã®ãã¡ Knowledge retrieval 㯠å·çæç¹ã§ AOAI ã® Assistants API ã§ã¯ãŸã coming soon ãšãããŠããŸããã
Support for new features, including an improved knowledge retrieval tool, is coming soon.
ãã® Knowledge retrieval ã¯ã¢ã·ã¹ã¿ã³ãã«ã¢ããããŒããããã¡ã€ã«ã®æ å ±ã«åºã¥ããŠãŠãŒã¶ãŒãžã®è³ªåã«åçãã Retrieval Augmented Generation (RAG) ãè¡ãæ©èœã§ããAOAI ã«ã¯ Azure AI Search ãããã¯ãšã³ãã§äœ¿çšãã On your data ãšããç¬èªæ©èœãæ¢ã«ååšããŠããŸãã®ã§ãRAG ãè¡ãããç¶æ³ã§ã¯ãã¡ãããæ€èšŒããæ¹ãè¯ããããããŸããã
åè
- Azure OpenAI Service announces Assistants API, New Models for Finetuning, Text-to-Speech and more
- Knowledge Retrieval (æ¬å®¶ OpenAI)
- Azure OpenAI On Your Data
- Retrieval Augmented Generation: Streamlining the creation of intelligent natural language processing models
- Retrieval Augmented Generation (RAG)
- Azure OpenAI Service On Your Data ã®ä»çµã¿ãšäœ¿ãäžã§æ°ãä»ããã¹ããã€ã³ã
2. å€éš API
2.1. Function calling
Function calling 㯠ReAct ã® Reasoning ã®éšåãè¡ã£ãŠãããããŒã«ã§ããå ·äœçã«ã¯ãããŒã«ã§æå®ããå€éš API ã®ãªã¹ãã®äžããã©ãã䜿ããšãŠãŒã¶ãŒã®ç®çãéæã§ãããã©ããã®æšè«ãéžæãããã³å€éš API ã«äžããåŒæ°ã®æœåºãè¡ã£ãŠãããŸãã
ããããããã€ã³ããšããŠã¯ãFunction calling 㯠AOAI ã«ãã£ãŠãã¹ããããŠãã Code interpreter ãšã¯ç°ãªããAssistants API ã¯èªåã§å€éš API ã® "å®è¡" ãããããšãã§ããŸããã(ã©ã®å€éš API ã䜿ãã¹ãããšãã "éžæ" ã ããè¡ã) ãã®ãããRun Steps ã«ãããå€éš API å®è¡ã®ã¹ãããã§ã¯ãAssistants API ã¯ã¢ããªã±ãŒã·ã§ã³ãå€éš API ãå®è¡ããŠçµæãéã£ãŠããããŸã§åŸ ã€æåãããŸãã
ã€ã¡ãŒãžå³

ãŸããããã²ãšã€ããããããã€ã³ããšããŠã¯ãå·çæç¹ã§ Code interpreter ãš Function calling ã®äž¡æ¹ã«å¯Ÿå¿ããŠããã¢ãã«ããŒãžã§ã³ãå®å
šã«äžèŽããŠããŸããã®ã§ãããŒã«ã« Code interpreter ãš Function calling ã®äž¡æ¹ãæå®ãããå Žåã¯äžå³ã®èµ€ç·ã§å²ã£ãã¢ãã«ããŒãžã§ã³ã䜿ãå¿
èŠããããŸãã

åè
- Azure OpenAI Assistants 颿°åŒã³åºã
- Azure OpenAI Service ã§é¢æ°åŒã³åºãã䜿çšããæ¹æ³
- 颿°åŒã³åºãã®ãµããŒã
- Azure OpenAI Service ã¢ãã«
- å®è¡ç¶æ ã®å®çŸ©
- Run lifecycle (æ¬å®¶ OpenAI)
å©çšå¯èœãªãªãŒãžã§ã³
å·çæç¹ã§ Assistants API 㯠Sweden CentralãEast US 2ãAustralia East ãªãŒãžã§ã³ã§å©çšå¯èœã§ãããã ããåè¿°ã®ãšãã䜿çšãããããŒã«ã«ãã£ãŠã¢ãã«ã®å¯Ÿå¿ç¶æ³ãç°ãªãããæ³šæãå¿
èŠã§ãã
åè
æé
Assistants API ã®å©çšæã«ã¯éåžžã®ã¢ãã«å©çšæã®å
¥åºåããŒã¯ã³ã«å¿ãã課éã«å ããŠãCode interpreter ã®æéãã»ãã·ã§ã³åäœã§å ç®ãããŸãã

â» Sweden Central ãªãŒãžã§ã³ã®å Žå

ãªããå·çæç¹ã§ã¯ Assistants API å©çšæã®ãã®ä»ã®èª²éèŠçŽ (e.g. ã¢ããããŒããããã¡ã€ã«ãåãªããžã§ã¯ãã®ã¹ãã¬ãŒãžè²»çš) ã¯èŠã€ãããŸããã§ããã
åè
- Azure OpenAI Service ã®äŸ¡æ Œ
- Azure OpenAI ã¢ã·ã¹ã¿ã³ã ã³ãŒã ã€ã³ã¿ãŒããªã¿ãŒ (ãã¬ãã¥ãŒ)
[è£è¶³] å¶é
å·çæç¹ã§ã¯ Assistants API ã«é¢é£ããå¶éãšããŠä»¥äžã® 3 ã€ãèšèŒãããŠããŸããã
| å¶éå | å¶éå€ | ã³ã¡ã³ã |
|---|---|---|
| Max files per Assistant/thread | 20 | äŸãã°ãã¢ã·ã¹ã¿ã³ãã« 5 ã€ã®ãã¡ã€ã«ãã¢ããããŒãããå Žåããã®ã¢ã·ã¹ã¿ã³ããæ±ãã¹ã¬ããã§ã¯æ®ã 15 ã®ãã¡ã€ã«ãã¢ããããŒãã§ãã |
| Max file size for Assistants | 512 MB | ãããã¢ã·ã¹ã¿ã³ã + ã¹ã¬ããã®åèšïŒ |
| Assistants token limit | 2,000,000 token limit | Assitants token ãäœã®åèšãªã®ãïŒ |
åè
äœ¿ãæ¹
å ¬åŒã¯ã€ãã¯ã¹ã¿ãŒãããµã³ãã«ã³ãŒããããŒã¹ã«ããŠãPython ã«ããäœ¿ãæ¹ã確èªããŠãããŸãã
åè
- ã¯ã€ã㯠ã¹ã¿ãŒã: Azure OpenAI Assistants (ãã¬ãã¥ãŒ) ã®äœ¿çšãéå§ãã
- Azure OpenAI ã¢ã·ã¹ã¿ã³ã ã³ãŒã ã€ã³ã¿ãŒããªã¿ãŒ (ãã¬ãã¥ãŒ)
- Azure OpenAI Assistants 颿°åŒã³åºã
- ãµã³ãã«ã³ãŒã
- Assistants (æ¬å®¶ OpenAI)
1. äºåæºå
1.1. Azure OpenAI Service ãªãœãŒã¹äœæ
Assistants API ãå©çšå¯èœãªä»»æã®ãªãŒãžã§ã³ãéžæã㊠AOAI ã®ãªãœãŒã¹ãäœæããŸãããªããAOAI ã䜿ãããã«ã¯å©çšç³è«ãæ¿èªãããŠããå¿ èŠããããŸãã
Sweden CentralEast US 2Australia East
åè
1.2. ã¢ãã«ãããã€
ã¯ã€ãã¯ã¹ã¿ãŒãã®åææ¡ä»¶ãšåã gpt-4ãã¢ãã«ããŒãžã§ã³ 1106-Preview ãéžæããŠãããã€ãè¡ããŸãããããã€å (ä»»æ) ã¯åŸã»ã©äœ¿çšããŸãã®ã§æ§ããŠãããŸãã

åè
- Azure OpenAI Service ãªãœãŒã¹ãäœæããŠãããã€ãã
- Azure OpenAI Service ã¢ãã«
- ã¯ã€ã㯠ã¹ã¿ãŒã: Azure OpenAI Assistants (ãã¬ãã¥ãŒ) ã®äœ¿çšãéå§ãã
1.3. Python å®è¡ç°å¢
以äžã® Python å®è¡ç°å¢ãæºåããŸãã
- Python 3.7.1 以éã®ããŒãžã§ã³
- Python ã©ã€ãã©ãª: openai (ããŒãžã§ã³ 1.x ãå¿ èŠ)
åè
1.4. ç°å¢å€æ°ã®èšå®
AOAI ã®ããŒãšãšã³ããã€ã³ãã確èªã㊠Python å®è¡ç°å¢ã®ç°å¢å€æ°ã«ç»é²ããŠãããŸãã
import os
os.environ["AZURE_OPENAI_ENDPOINT"] = "<your-aoai-endpoint>"
os.environ["AZURE_OPENAI_KEY"] = "<your-aoai-key>"
åè
2. Code interpreter 䜿ãã®æ°åŠå®¶åºæåž«ã¢ã·ã¹ã¿ã³ã
ããããã¯ãããŒã«ãšã㊠Code interpreter ã䜿ãã¢ã·ã¹ã¿ã³ããå®éã«äœæããŠãããŸããæµãã¯ä»¥äžã®ãšããã§ãã
- AOAI ã«æ¥ç¶ããã¯ã©ã€ã¢ã³ãã€ã³ã¹ã¿ã³ã¹ãäœæãã
- ã©ã®ãããªã¢ã·ã¹ã¿ã³ãããå®çŸ©ãã
Assistantã€ã³ã¹ã¿ã³ã¹ãäœæãã - ãŠãŒã¶ãŒãšã¢ã·ã¹ã¿ã³ãéã®ã¡ãã»ãŒãžãä¿æãã
Threadã€ã³ã¹ã¿ã³ã¹ãäœæãã - ãŠãŒã¶ãŒããã®åãããã®
Messageã€ã³ã¹ã¿ã³ã¹ãäœæããŠThreadã«è¿œå ãã -
Threadãå®è¡ããŠRunã€ã³ã¹ã¿ã³ã¹ãäœæãã - Assistants API ã¯
Threadã®æèã«å¿ããŠããŒã« (ä»å㯠Code interpreter) ãå©çšãã€ã€åçã®Messageã€ã³ã¹ã¿ã³ã¹ãäœæããŠThreadã«è¿œå ãã -
Runã®ã¹ããŒã¿ã¹ã確èªããŠå®äºãããThreadã確èªãã - ãŠãŒã¶ãŒããã®è¿œå ã®åããããè¡ã
2.1. AOAI ã¯ã©ã€ã¢ã³ãäœæ
ã³ãŒã
import os
import time
import json
from openai import AzureOpenAI
client = AzureOpenAI(
api_key=os.getenv("AZURE_OPENAI_KEY"),
api_version="2024-02-15-preview", # å·çæç¹ã§ã¯ãã®ããŒãžã§ã³ã®ã¿å¯Ÿå¿
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)
2.2. Assistant äœæ
ã³ãŒã
# ã¢ã·ã¹ã¿ã³ãã®äœæ
assistant_1 = client.beta.assistants.create(
name="Sugaku-no-sensei", # ã¢ã·ã¹ã¿ã³ãå
instructions="ããªãã¯æ°åŠã®å®¶åºæåž«ã§ããã³ãŒããæžããŠå®è¡ããæ°åŠã®è³ªåã«çããŠãã ããã", # æç€º (ã¢ã·ã¹ã¿ã³ãã®å®çŸ©ãç®çãªã©)
tools=[{"type": "code_interpreter"}] # ã¢ã·ã¹ã¿ã³ãã䜿çšã§ããããŒã«ã®ãªã¹ã (ããã§ã¯ Code interpreter ã®ã¿)
model="<your-model-deployment-name>" # ã¢ãã«ã®ãããã€å
)
ã³ãŒã
# 確èª
for k,v in dict(assistant_1).items():
print(k + ": ", v)
åºåäŸ
id: asst_7gZPjuHKgZJCBWW4tmNj5mhG
created_at: 1707886161
description: None
file_ids: []
instructions: ããªãã¯æ°åŠã®å®¶åºæåž«ã§ããã³ãŒããæžããŠå®è¡ããæ°åŠã®è³ªåã«çããŠãã ããã
metadata: {}
model: gpt-4-1106
name: Sugaku-no-sensei
object: assistant
tools: [ToolCodeInterpreter(type='code_interpreter')]
2.3. Thread äœæ
ã³ãŒã
# ã¹ã¬ããã®äœæ
thread_1 = client.beta.threads.create()
2.4. Message 远å
ã³ãŒã
# ãŠãŒã¶ãŒããã®ã¡ãã»ãŒãžãã¹ã¬ããã«è¿œå
message_1_1 = client.beta.threads.messages.create(
thread_id=thread_1.id, # äºåäœæããã¹ã¬ãã
role="user", # ãŠãŒã¶ãŒããã®åããã
content="æ¹çšåŒ `3x + 11 = 14` ãè§£ãããã§ããå©ããŠãããŸããïŒ" # åãããã®å
容
)
2.5. Thread å®è¡
ã³ãŒã
# ã¹ã¬ããã®å®è¡
run_1_1 = client.beta.threads.runs.create(
thread_id=thread_1.id,
assistant_id=assistant_1.id
)
2.6. çµæåŸ ã¡
ã³ãŒã
# ã¢ã·ã¹ã¿ã³ããåçã®ã¡ãã»ãŒãžãè¿ããŸã§åŸ
ã€é¢æ°
def wait_for_assistant_response(thread_id, run_id):
while True:
time.sleep(5)
# å®è¡ã¹ããŒã¿ã¹ã®ååŸ
run = client.beta.threads.runs.retrieve(
thread_id=thread_id,
run_id=run_id
)
status = run.status
if status in ["completed", "cancelled", "expired", "failed"]:
print(status)
break
# ã¢ã·ã¹ã¿ã³ããåçã®ã¡ãã»ãŒãžãè¿ããŸã§åŸ
ã€
wait_for_assistant_response(thread_1.id, run_1_1.id)
åºåäŸ
completed
åè
2.7. çµæç¢ºèª
ã³ãŒã
# ã¹ã¬ããã®ã¡ãã»ãŒãžã確èªãã颿°
def print_thread_messages(thread_id):
msgs = client.beta.threads.messages.list(thread_id=thread_id)
for m in msgs:
assert m.content[0].type == "text"
print({"role": m.role, "message": m.content[0].text.value})
# ã¹ã¬ããã®ã¡ãã»ãŒãžã確èª
print_thread_messages(thread_1.id)
åºåäŸ
{'role': 'assistant', 'message': 'æ¹çšåŒ `3x + 11 = 14` ã®è§£ã¯ `x = 1` ã§ãã'}
{'role': 'user', 'message': 'æ¹çšåŒ `3x + 11 = 14` ãè§£ãããã§ããå©ããŠãããŸããïŒ'}
â» ã¡ãã»ãŒãžã¯æ°ãããã®ããé ã«æ ŒçŽããã
[è£è¶³] 2.7.1. JSON ãã©ãŒãããã§ã®ç¢ºèª
ã³ãŒã
# ã¹ã¬ããã®ã¡ãã»ãŒãžãJSONãã©ãŒãããã§ç¢ºèªãã颿°
def print_thread_messages_with_json(thread_id):
msgs = client.beta.threads.messages.list(thread_id=thread_id)
print(msgs.model_dump_json(indent=2))
print_thread_messages_with_json(thread_1.id)
åºåäŸ
{
"data": [
{
"id": "msg_VWLczojSp5dADposhMrr0lle",
"assistant_id": "asst_7gZPjuHKgZJCBWW4tmNj5mhG",
"content": [
{
"text": {
"annotations": [],
"value": "æ¹çšåŒ `3x + 11 = 14` ã®è§£ã¯ `x = 1` ã§ãã"
},
"type": "text"
}
],
"created_at": 1707886169,
"file_ids": [],
"metadata": {},
"object": "thread.message",
"role": "assistant",
"run_id": "run_MiG1SF2IBFrSZ2plJtER6XQz",
"thread_id": "thread_6uwifReRlbkEJcBJxtJWWsib"
},
{
"id": "msg_gNY7n2DdMB2Id3MMRhLbagQg",
"assistant_id": null,
"content": [
{
"text": {
"annotations": [],
"value": "æ¹çšåŒ `3x + 11 = 14` ãè§£ãããã§ããå©ããŠãããŸããïŒ"
},
"type": "text"
}
],
"created_at": 1707886162,
"file_ids": [],
"metadata": {},
"object": "thread.message",
"role": "user",
"run_id": null,
"thread_id": "thread_6uwifReRlbkEJcBJxtJWWsib"
}
],
"object": "list",
"first_id": "msg_VWLczojSp5dADposhMrr0lle",
"last_id": "msg_gNY7n2DdMB2Id3MMRhLbagQg",
"has_more": false
}
2.8. 远å 質å
ã³ãŒã
# 远å ã®è³ªåãè¡ã
message_1_2 = client.beta.threads.messages.create(
thread_id=thread_1.id, # æ¢åã®ã¹ã¬ããã«ããã«ã¡ãã»ãŒãžã远å
role="user",
content="ãã®åé¡ãè§£ãããã«çæããã³ãŒããæããŠãã ããã"
)
# ã¹ã¬ããã®å®è¡
run_1_2 = client.beta.threads.runs.create(
thread_id=thread_1.id,
assistant_id=assistant_1.id,
)
# ã¢ã·ã¹ã¿ã³ããåçã®ã¡ãã»ãŒãžãè¿ããŸã§åŸ
ã€
wait_for_assistant_response(thread_1.id, run_1_2.id)
ã³ãŒã
# ã¹ã¬ããã®ã¡ãã»ãŒãžã確èªãã
print_thread_messages(thread_1.id)
åºåäŸ
{'role': 'assistant', 'message': "ãã¡ããã§ãã以äžãåé¡ `3x + 11 = 14` ãè§£ãããã«äœ¿çšããã³ãŒãã§ãïŒ\n\n```python\nfrom sympy import symbols, Eq, solve\n\n# Create the symbol\nx = symbols('x')\n\n# Define the equation\nequation = Eq(3*x + 11, 14)\n\n# Solve the equation for x\nsolution = solve(equation, x)\n```\n\nãã®ã³ãŒãã§ã¯ããŸã sympy ã©ã€ãã©ãªãçšããŠå€æ° `x` ãã·ã³ãã«ãšããŠå®çŸ©ããŸãããæ¬¡ã«ãäžããããæ¹çšåŒ `3x + 11 = 14` ã `Eq` 颿°ãçšããŠå®çŸ©ããŸãããæåŸã«ã`solve` 颿°ã§æ¹çšåŒãè§£ãããã®è§£ã `solution` ã«æ ŒçŽããŸããããããŠããã®çµæãšã㊠`x = 1` ãåŸãŸããã"}
{'role': 'user', 'message': 'ãã®åé¡ãè§£ãããã«çæããã³ãŒããæããŠãã ããã'}
{'role': 'assistant', 'message': 'æ¹çšåŒ `3x + 11 = 14` ã®è§£ã¯ `x = 1` ã§ãã'}
{'role': 'user', 'message': 'æ¹çšåŒ `3x + 11 = 14` ãè§£ãããã§ããå©ããŠãããŸããïŒ'}
â» ã¡ãã»ãŒãžã¯æ°ãããã®ããé ã«æ ŒçŽããã
äžèšåºåã®ã³ãŒãéšåã ããæœåº
from sympy import symbols, Eq, solve
# Create the symbol
x = symbols('x')
# Define the equation
equation = Eq(3*x + 11, 14)
# Solve the equation for x
solution = solve(equation, x)
3. Function calling 䜿ãã®ã倩æ°ã¢ã·ã¹ã¿ã³ã
ããããã¯ãããŒã«ãšã㊠Function calling ã䜿ãã¢ã·ã¹ã¿ã³ããäœæããŠãããŸããæµãã¯ä»¥äžã®ãšããã§ãã5 ãŸã§ã¯ Code interpreter ã䜿ãå Žåãšã»ãŒåãæµãã§ãã
- AOAI ã«æ¥ç¶ããã¯ã©ã€ã¢ã³ãã€ã³ã¹ã¿ã³ã¹ãäœæãã (çç¥)
- ã©ã®ãããªã¢ã·ã¹ã¿ã³ãããå®çŸ©ãã
Assistantã€ã³ã¹ã¿ã³ã¹ãäœæãã - ãŠãŒã¶ãŒãšã¢ã·ã¹ã¿ã³ãéã®ã¡ãã»ãŒãžãä¿æãã
Threadã€ã³ã¹ã¿ã³ã¹ãäœæãã - ãŠãŒã¶ãŒããã®åãããã®
Messageã€ã³ã¹ã¿ã³ã¹ãäœæããŠThreadã«è¿œå ãã -
Threadãå®è¡ããŠRunã€ã³ã¹ã¿ã³ã¹ãäœæãã - Assistants API ã¯
Threadã®æèã«å¿ããŠããŒã« (ä»å㯠Function calling ã«ããäžããããå€éš API ã®ãªã¹ã) ãå©çšãã¹ããã©ãããå€å®ããããšåŸ ã¡ç¶æ ã®ã¹ããŒã¿ã¹ (requires_action) ã«ãªã - ã¢ããªã±ãŒã·ã§ã³åŽã§ Assistants API ãéžæããå€éš API ãå®éã«å®è¡ããŠçµæãååŸã㊠Assistants API ã«æž¡ããšãAssistants API ã¯åŠçãç¶è¡ããŠåçã®
Messageã€ã³ã¹ã¿ã³ã¹ãäœæããŠThreadã«è¿œå ãã -
Runã®ã¹ããŒã¿ã¹ã確èªããŠå®äºãããThread(çµæ) ã確èªãã
3.1. AOAI ã¯ã©ã€ã¢ã³ãäœæ
çç¥
3.2. Assistant äœæ
ã³ãŒã
assistant_2 = client.beta.assistants.create(
name="Otenki-assistant", # ã¢ã·ã¹ã¿ã³ãå
instructions="ããªãã¯ã倩æ°ã¢ã·ã¹ã¿ã³ãã§ããäžããããæ©èœã䜿ã£ãŠè³ªåã«çããŠãã ããã", # æç€º (ã¢ã·ã¹ã¿ã³ãã®å®çŸ©ãç®çãªã©)
model="<your-model-deployment-name>", # ã¢ãã«ã®ãããã€å
# ã¢ã·ã¹ã¿ã³ãã䜿çšã§ããããŒã«ã®ãªã¹ã (ããã§ã¯Function callingã§1ã€ã®å€éšAPIãæå®)
tools=[{
"type": "function",
"function": {
"name": "getCurrentWeather",
"description": "Get the current weather in location", # æå®ããå°ç¹ã®çŸåšã®å€©æ°ãååŸãã
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "The prefecture and city e.g. æ±äº¬éœåå·åº"}, # éœéåºçãšçº
"unit": {"type": "string", "enum": ["c", "f"]} # åäœ (ææ° or è¯æ°)
},
"required": ["location"] # å¿
é ãã£ãŒã«ã
}
}
}]
)
ã³ãŒã
# 確èª
for k,v in dict(assistant_2).items():
print(k + ": ", v)
åºåäŸ
id: asst_2PfpqeMhIMyFNOXoE3BCyueY
created_at: 1707886191
description: None
file_ids: []
instructions: ããªãã¯ã倩æ°ã¢ã·ã¹ã¿ã³ãã§ããäžããããæ©èœã䜿ã£ãŠè³ªåã«çããŠãã ããã
metadata: {}
model: gpt-4-1106
name: Otenki-assistant
object: assistant
tools: [ToolFunction(function=FunctionDefinition(name='getCurrentWeather', description='Get the current weather in location', parameters={'type': 'object', 'properties': {'location': {'type': 'string', 'description': 'The prefecture and city e.g. æ±äº¬éœåå·åº'}, 'unit': {'type': 'string', 'enum': ['c', 'f']}}, 'required': ['location']}), type='function')]
3.3. Thread äœæ
ã³ãŒã
# ã¹ã¬ããã®äœæ
thread_2 = client.beta.threads.create()
3.4. Message 远å
ã³ãŒã
# ãŠãŒã¶ãŒããã®ãªã¯ãšã¹ããã¹ã¬ããã«è¿œå
message_2_1 = client.beta.threads.messages.create(
thread_id=thread_2.id,
role="user",
content="åå·ã®å€©æ°ãæããŠ"
)
ã³ãŒã
# ã¹ã¬ããã®ã¡ãã»ãŒãžã確èª
print_thread_messages(thread_2.id)
åºåäŸ
{'role': 'user', 'message': 'åå·ã®å€©æ°ãæããŠ'}
3.5. Thread å®è¡
ã³ãŒã
# ã¹ã¬ããã®å®è¡
run_2 = client.beta.threads.runs.create(
thread_id=thread_2.id,
assistant_id=assistant_2.id,
)
3.6. Run ã¹ããŒã¿ã¹ç¢ºèª
ã³ãŒã
# å®è¡ã¹ããŒã¿ã¹ã確èªãã颿°
def check_run_status(thread_id, run_id):
r = client.beta.threads.runs.retrieve(
thread_id=thread_id,
run_id=run_id
)
status = r.status
print(status)
# å®è¡ã¹ããŒã¿ã¹ã®ç¢ºèª
check_run_status(thread_2.id, run_2.id)
åºåäŸ
requires_action
ã³ãŒã
# å®è¡ã®è©³çްã確èª
print(run_2.model_dump_json(indent=2))
åºåäŸ
{
"id": "run_I2Pail7I9T4xt1jGuBnS2e1r",
"assistant_id": "asst_2PfpqeMhIMyFNOXoE3BCyueY",
"cancelled_at": null,
"completed_at": null,
"created_at": 1707886791,
"expires_at": 1707887391,
"failed_at": null,
"file_ids": [],
"instructions": "ããªãã¯ã倩æ°ã¢ã·ã¹ã¿ã³ãã§ããäžããããæ©èœã䜿ã£ãŠè³ªåã«çããŠãã ããã",
"last_error": null,
"metadata": {},
"model": "gpt-4-1106",
"object": "thread.run",
"required_action": {
"submit_tool_outputs": {
"tool_calls": [
{
"id": "call_KCrKrVmGMZ9g0Cm1pJYi8j4z",
"function": {
"arguments": "{\"location\":\"æ±äº¬éœåå·åº\"}",
"name": "getCurrentWeather"
},
"type": "function"
}
]
},
"type": "submit_tool_outputs"
},
"started_at": 1707886792,
"status": "requires_action",
"thread_id": "thread_duYvDhzNS6y7SF6y8O0EDaDC",
"tools": [
{
"function": {
"name": "getCurrentWeather",
"description": "Get the current weather in location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The prefecture and city e.g. æ±äº¬éœåå·åº"
},
"unit": {
"type": "string",
"enum": [
"c",
"f"
]
}
},
"required": [
"location"
]
}
},
"type": "function"
}
],
"usage": null
}
åè
3.7. å€éš API å®è¡çµæã®éä¿¡
ã³ãŒã
# å€éšAPIã®ãããŒ
def getCurrentWeather(location, unit="c"):
# å®éã¯ããã§å€éšAPIãåŒã³åºããŠçµæãååŸãã
current_weather = "æŽ17â"
return current_weather
# Assistants APIã«éãè¿ãçµææ ŒçŽçšã®ãªã¹ã
tool_outputs = []
# tool_callsããšã«æå®ãããå€éšAPIãå®è¡ããŠçµæãäœæããŠãã(ä»åã¯1åŒã³åºãã®ã¿)
for tc in run_2.required_action.submit_tool_outputs.tool_calls:
if tc.function.name == "getCurrentWeather":
# JSON圢åŒã®åŒæ°æ
å ±ãèŸæžã«å€æ
arg = json.loads(tc.function.arguments)
# å¿
é åŒæ°ãååŸ
location = arg["location"]
# å€éšAPIãå®è¡
weather = getCurrentWeather(location)
# çµæãtool_callããšã«äœæ
output = {
"tool_call_id": tc.id,
"output": weather,
}
tool_outputs.append(output)
elif tc.function.name == "foo":
# Function callingã§è€æ°ã®å€éšAPIãåè£ãšããŠæç€ºããå Žåã¯ãã®ããã«ããŠå®è¡ããŠãã
pass
elif tc.function.name == "bar":
# Function callingã§è€æ°ã®å€éšAPIãåè£ãšããŠæç€ºããå Žåã¯ãã®ããã«ããŠå®è¡ããŠãã
pass
print(tool_outputs)
åºåäŸ
[{'tool_call_id': 'call_KCrKrVmGMZ9g0Cm1pJYi8j4z', 'output': 'æŽ17â'}]
ã³ãŒã
# Assistants APIã«å€éšAPIã®åºåçµæãéä¿¡ãã
run_2 = client.beta.threads.runs.submit_tool_outputs(
thread_id=thread_2.id,
run_id=run_2.id,
tool_outputs=tool_outputs # çµææ ŒçŽãªã¹ã
)
åè
3.8. çµæç¢ºèª
ã³ãŒã
# ã¢ã·ã¹ã¿ã³ããåçã®ã¡ãã»ãŒãžãè¿ããŸã§åŸ
ã€
wait_for_assistant_response(thread_2.id, run_2.id)
åºåäŸ
completed
ã³ãŒã
# ã¹ã¬ããã®ã¡ãã»ãŒãžã確èª
print_thread_messages(thread_2.id)
{'role': 'assistant', 'message': 'çŸåšãæ±äº¬éœåå·åºã®å€©æ°ã¯æŽãã§ãæ°æž©ã¯17âã§ãã'}
{'role': 'user', 'message': 'åå·ã®å€©æ°ãæããŠ'}
â» ã¡ãã»ãŒãžã¯æ°ãããã®ããé ã«æ ŒçŽããã
4. [è£è¶³] Thread ã Assistant ã®åé€
4.1. Thread ã® ID ãæå®ããŠåé€
ã³ãŒã
# ã¹ã¬ããã®åé€
client.beta.threads.delete("<thread-id>")
4.2. Assistant ã®ãªã¹ãã¢ãã
ã³ãŒã
# ãã¹ãŠã®ã¢ã·ã¹ã¿ã³ãã®ãªã¹ã
for a in client.beta.assistants.list():
print(a.id, a.name)
åºåäŸ
asst_2PfpqeMhIMyFNOXoE3BCyueY Otenki-assistant
asst_7gZPjuHKgZJCBWW4tmNj5mhG Sugaku-no-sensei
â» ã¯ã©ã€ã¢ã³ããæ¥ç¶ããŠãã AOAI ãªãœãŒã¹å ã®ã¢ã·ã¹ã¿ã³ãããªã¹ãã¢ããããã
4.3. Assistant ã® ID ãæå®ããŠåé€
ã³ãŒã
# ã¢ã·ã¹ã¿ã³ãã®åé€
client.beta.assistants.delete("<assistant-id>")
4.4. ãã¹ãŠã® Assistant ã®åé€
ã³ãŒã
# ãã¹ãŠã®ã¢ã·ã¹ã¿ã³ãã®åé€
for a in client.beta.assistants.list():
client.beta.assistants.delete(a.id)
â» AOAI ãªãœãŒã¹ãå ±æãããã¹ãŠã®ãŠãŒã¶ãŒã«åœ±é¿ãåãŒãããå®è¡æã«ã¯æ³šæãã
5. [è£è¶³] Azure OpenAI Studio ããã®æäœ
Azure OpenAI Studio ããã§ã Assistants API ã®æäœãè¡ãããšãã§ããŸããStudio ã® Assistants (Preview) ã¿ãããã¢ã¯ã»ã¹ã§ããŸãã

Studio ã§ã¯ãåæäœãè¡ã£ãéã«ã©ã®ãããªãªã¯ãšã¹ããæããããŠãããç»é¢å³åŽã® Logs ãã確èªããããšãã§ããŸãããã®ãããæäœãšãªã¯ãšã¹ãã®å¯Ÿå¿é¢ä¿ãçŽæçã«çè§£ãããããªã£ãŠããŸãã

ãŸããStudio ãããæ°èŠã¢ã·ã¹ã¿ã³ãã®äœæãè¡ã£ãããæ¢åã®ã¢ã·ã¹ã¿ã³ããéãããããããšãã§ããŸãã

ãã ãããã®ã¢ã·ã¹ã¿ã³ãã®ãªã¹ã㯠AOAI ã®ãªãœãŒã¹åäœã«ãªã£ãŠããŸãã®ã§ãStudio ã Python ã®ããããã§åé€ãè¡ã£ãå Žåã¯ã仿¹ãããå©çšã§ããªããªããŸãã

åè
ãããã«
Assistants API ã¯ãããŸã§ååšããŠãã Chat Completions API ãšã¯ç°ãªãã¹ããŒããã«ãã€ãªããžã§ã¯ãæåãªãããã¯ããã®ãã¡ã¯ãããšã£ã€ãã«ããæããŸãããããããæ £ããŠãããšçšããæœè±¡åãããã·ã³ãã«ã§äœ¿ãããã API ã§ããããšã«æ°ã¥ããŸããã
æ¬å®¶ OpenAI ã®ããã¥ã¡ã³ãã®äžã§ã "ãŸã β çãªã®ã§æ©èœè¿œå ã«åãçµãã§ãããã£ãŒãããã¯ãããïŒ" ãšãã£ãããšãæžãããŠãããšãããä»åŸããæŽç·ŽãããŠããå¯èœæ§ã¯ãããŸããããã®ã³ã³ã»ããã®å»¶é·ã§çæ AI é¢é£ã®ã¢ããªã±ãŒã·ã§ã³éçºã楜ã«ãªã£ãŠãã£ãŠããããšããããããšæããŸããã
以äžã§ããðµ
ã¡ã³ããŒãéžãã Microsoft補åã®ææ°æè¡æ å ±ã»ç¥èŠããå±ãããŸãã â»ãã®Publicationã¯æ¥æ¬ãã€ã¯ããœãããŸãã¯ç±³Microsoftæå±ç€Ÿå¡ã«ããå人ã®èŠè§£ã§ãããæå±ããçµç¹ã®å ¬åŒèŠè§£ã§ã¯ãããŸããã â»Publicationã«åå åžæã®ç€Ÿå¡ã¯ @07JP27ãŸã§ãé£çµ¡ãã ããã
Discussion