ð2023.3.2ã«ChatGPTã®APIãå ¬éããããããã¿ã€ãã«ã𿬿ã®äžéšãä¿®æ£ããŸããïŒãã£ããïŒ
話é¡ã®ChatGPTã¯è¶
ããããæ¥œããã®ã§ãããAPIçµç±ã§äœ¿ããªãããç§ãã¡éçºè
ãããããšã¡ãã£ãšãã®è¶³ããŸããïŒãŸããªãAPIãå
¬éããããšãã話ãïŒ ãããŸããïŒïŒ2023.3.2ïŒã
ãšã¯ããããã£ã©èšå®ãäŒè©±ã®åæãäŒè©±ã®éœåºŠå
¥åããã®ã¯é¢åã ã£ããããŸãã®ãšãChatGPTãšåãOpenAIããæäŸãããŠããGPT-3ã¢ãã«ãtext-davinci-003ãã¯ãããã1å1çã§ãåã話é¡ãè€æ°ã¿ãŒã³ã«æž¡ã£ãŠç¶ç¶ããããšãã§ããŸããã
ããã§ãOpenAIã®å€åŽã§å·¥å€«ããŠãã£ã©èšå®ãåæãæèãç¶æããäŒè©±ãå®çŸããããšããã®ããã¡ãã®èšäºã«ãªããŸãã
èŠçŽ
- äŒè©±ã®å±¥æŽãå«ããŠãªã¯ãšã¹ãããããšã§æèãæèãããããšãã§ããããã«ãªãïŒChatGPTã§ã¯å±¥æŽããšåãä»ããã€ã³ã¿ãŒãã§ã€ã¹ã«ãªã£ãŠããïŒ
- å±¥æŽããã¯èªã¿ãšãããšã®é£ãããèæ¯ããå«ããšããã«æåŸ ã«æ²¿ã£ãåçãšãªãã»ããããããã¿ã¹ã¯ã«å¯Ÿå¿ã§ããããã«ãªã
èãæ¹ã»ä»çµã¿
åé ã§ã¯ChatGPT/GPT-3ã®REST APIã¿ããã«é©åœã«åŒã³ãŸããããããå°ãæ£ç¢ºã«èšããšCompletionãã€ãŸãããã¹ãã®è£å®ã¿ã¹ã¯ãè¡ãAPIã§ããã€ãŸãããæã ããããšããã«ããšäŒããããšã§ãããã«ç¶ããã£ãšãããããã¬ãŒãºãšããŠã®ãããããããšãã°ããããããŸããããæããŠãããAPIããšãããã®ã§ããæ£ç¢ºãããªããããããªãã§ããå€åã ããããããªæãã§ãã
ãã®ç¹æ§ãèæ
®ããŠãæåŸ
ããåçïŒè£å®ïŒãAIããåŸãããã«ã以äžã®ãããªãè³ç«ãŠãå«ããŠAPIãžã®ãªã¯ãšã¹ããšããŠéä¿¡ãããšè¯ãã§ãããã

å
·äœçãªäŸã¯ä»¥äžã®ãšããã§ãã
ããã¯ä»²ã®è¯ãå
ãšåйã®äŒè©±ã§ãã効ã¯äžå¯§èªã¯äœ¿ããŸããããâðãæ¡ä»¶ãã«è©²åœ
å
:ã寿åžãçŒèè¡ãïŒãâðãããããå±¥æŽãã«è©²åœ
効:ãããïŒã©ã£ã¡ã«ãããïŒ
å
:ããŒããã©ã£ã¡ãããïŒ
効:ãããªãã寿åžã«ãããïŒ
å
:ããïŒäœããæ³šæããïŒãâðãä»åã®å
¥åãã«è©²åœ
効:â â â â â â â â â â â â â â â â â â â âðãããAIã«è£å®ããŠããã
ãããŸã§ãè³ç«ãŠãããŠãããããšã§ãAIã¯ã€ãã€ãããŸããããšãããããããšåçããŠããŸãããšããããã§ããéäžã®ãã寿åžã«ããããããæåã®ã¿ãŒã³ãå«ããŠæž¡ãããããçãããããã®ã§ããã
ãã®ãããã®è©±ã¯ãç§ã¯çµéšããããé°å²æ°ã§æžããŠããŸãããæ°ã«ãªãæ¹ã¯ã¡ãããšè«æãèªãã§ã¿ãŠãã ããããµããªãŒã«ã¯ä»¥äžã®ããã«æžããŠãããŸãã
For all tasks, GPT-3 is applied without any gradient updates or fine-tuning, with tasks and few-shot demonstrations specified purely via text interaction with the model. GPT-3 achieves strong performance on many NLP datasets, including translation, question-answering, and cloze tasks, as well as several tasks that require on-the-fly reasoning or domain adaptation, such as unscrambling words, using a novel word in a sentence, or performing 3-digit arithmetic.
ãŸãã ãããè¯ãç·ãã£ãŠãã®ã§ã¯ãªãã§ãããããé°å²æ°çã«ã
äœãæ¹
ã³ã³ããã¹ããšããŠæãããã¹ãæ å ±ã®çš®é¡ããããŸã§å€ããªããšæããŸãã®ã§ã€ãããäœã£ãŠãè¯ãã®ã§ãããOpenAIã®Completion APIãæèãä¿æãã圢ã§å©çšããããã®OSSãå ¬éãããŠããŸãã®ã§ããã®èšäºã§ã¯ãããåæã«ããŠãããŸãã
ãŸããã¯ãã®OSSã©ã€ãã©ãªãŒã§ããgpt3-contextualãã€ã³ã¹ããŒã«ããŸããPyPIããã³ãã³ã1çºã§ãããŸãã
$ pip install gpt3-contextual
ç¶ããŠããã®ã©ã€ãã©ãªãŒãå©çšããã¿ãŒããã«ããŒã¹ã®ãã£ããã¢ããªãäœã£ãŠã¿ãŸããååã¯äœã§ãè¯ãã®ã§ãããããã§ã¯run.pyãšããŠä¿åããŸãããã
ãŸããããã§OpenAIã®APIããŒãå¿
èŠã«ãªããŸãã®ã§ãäºåã«ãµã€ã³ã¢ããã®äžã¡ã¢ã£ãŠãããŠãã ããã
from gpt3contextual import ContextualChatGPT
cc = ContextualChatGPT("YOUR_OPENAI_APIKEY")
while True:
text = input("Human> ")
resp, prompt, completion = cc.chat_sync("contextkey_1234", text)
print(f"AI> {resp}")
ããã§ã¯å®è¡ããŠã¿ãŸããããHuman> ãšè¡šç€ºãããããç¶ããŠäœãAIãžã®ãªã¯ãšã¹ããå
¥åããŠãšã³ã¿ãŒããŒãæŒäžããŸãããã°ããåŸ
ã£ãŠAIããåçãããã°åäœç¢ºèªå®äºã§ãã
$ python run.py
Human> Hello
AI> Hi there!
ãããChatGPTã§ã¯ãªãGPT-3ã®text-davinci-003ãªã©ãå©çšããå Žåã¯ãContextualChatGPTã®éšåãContextualChatã«æžãæããŠãã ããã
ããŠããããããæ¬çªã§ããããã©ã«ãã§ãHumanãšAIã®äŒè©±ã§ãããšããããšãšçŽè¿6ã¿ãŒã³ã®å±¥æŽãéãããããã«ãªã£ãŠããŸããããããèªå奜ã¿ã«æ¹é ããŠãããŸããããç§ã¯åйã奜ããªã®ã§ããã§ã¯å ãšåйãšã®äŒè©±ã«ããŠã¿ãŸãã
from gpt3contextual import ContextualChatGPT, ContextManager
cm = ContextManager(username="å
", agentname="効", chat_description="仲è¯ãã®å
効ã®äŒè©±ã§ããäžå¯§èªã¯äœ¿ããŸããã")
cc = ContextualChatGPT("YOUR_OPENAI_APIKEY", context_manager=cm)
while True:
text = input(f"{cm.username}> ")
resp, prompt, completion = cc.chat_sync("user1234567890", text)
print(f"{cm.agentname}> {resp}")
ã³ãŒããå°ã解説ããŸããšãèæ¯æ
å ±ã管çããContextManagerãçæããŠããããContextualChatGPTã«æž¡ãããã«ããŸããããŸããContextManagerã«ã¯äººéã®ããŒã«ãšããŠå
ãAIã®ããŒã«ãšããŠåйãäŒè©±å
šäœã®æ¡ä»¶ãchat_descriptionãšããŠèšå®ããŠããŸãããã®å®è¡çµæã¯ä»¥äžã®ããã«ãªãã§ãããã
$ python run.py
å
> ãã¯ããŒããã¯ãã¯ïŒ
効> ç§ãäœããïŒä»æ¥ã¯äœãé£ã¹ããïŒ
å
> ããŒããããŒã¹ããšç®ççŒã
効> ããã£ãïŒç®ççŒããšããŒã¹ãã ãïŒ
å
> ã³ãŒããŒã¯åããããããŒ
効> ããããšãïŒä»æ¥ã¯å
ãããæ
åœããŠããããã ãïŒ
ãŸããããšãªãå
効ã®äŒè©±ã«ãªããŸãããããã§æ¬²ãåºããŠchat_descriptionã以äžã®ããã«ä¿®æ£ããŠã¿ãŸãã
cm = ContextManager(username="å
", agentname="効", chat_description="仲è¯ãã®å
効ã®äŒè©±ã§ããäžå¯§èªã¯äœ¿ããŸããã効ã¯èªå°Ÿã«ããã£ããä»ããŸãã")
ãããšã©ãã§ãããã
$ python run.py
å
> ã³ãŒããŒã§ããã
効> ããããšããã£ïŒããããããã£
å
> ç±ãããæ°ãã€ãããã
効> ããã£ããã£ïŒããããšããã£
å
> ç«èã ã£ãïŒ
効> ããïŒç«èãã£
倧åå©ã§ãããã®ããã«æ¡ä»¶ã倿Žããããšã§AIã«ããåçïŒè£å®ïŒçµæãå€ããããšããåããããã ããããšæããŸãã
éè«ä»¥å€ã®ã¿ã¹ã¯
è¶ å€§èŠæš¡èšèªã¢ãã«ããããã¹ãã ãã®ããã«äœ¿ãã®ã¯ãã£ãããªãã®ã§ãå¥ã®ã¿ã¹ã¯ãããªããããã«ããŠãããŸããåé ã§åŒçšããè«æïŒã®èŠçŽïŒã«ããããã«ãGPT-3ã¯ããããã¿ã¹ã¯ãã¢ãã«ã®æ¹é ãªãããªãããšããç¹åŸŽããããŸãã
ããšãã°æ å ±åéã»èª¿æ»ã¿ã¹ã¯ãå®è¡ããããã«ã¯ã以äžã®ããã«ã³ã³ããã¹ãã調æŽããŸãã
cm = ContextManager(username="質å", agentname="åç", chat_description="質åå
容ã«ã€ããŠèª¿æ»ããåçããŠãã ãã")
ãããšãããªæãã«ãªããŸãããåäŸã«ããããããã«ããçç©åŠäžã®èгç¹ããããªã©chat_descriptionã詳现åããããšã§åçå
容ãæåŸ
ã«è¿ã¥ããããšãã§ããŸãã
â»æ£ç¢ºæ§ã«é¢ããä¿èšŒã¯ãããŸãããåºé±ç®ãèšãããšãïŒãããªãã«ïŒãããŸãã
Human> ããªããšããªãã®éãã«ã€ããŠæããŠãããªãããªïŒ
AI> ããªããšããªãã¯ãäœé·ãäœéãªã©ã®äœåãå€èŠã«ãããŠå€§ããªéãããããŸãããŸããããªãã¯æ°Žäžã§æ®ãããããªãã¯æ°Žé¢ä»è¿ã§æ®ãããŸããçæ
çã«ã¯ãããªãã¯æ·¡æ°Žéã§ãããããªãã¯æµ·æ°Žéã§ãããã®ä»ã®çç©åŠçãªéããšããŠãããªãã¯æŽ»çºãªæé£è
ã§ãããããªãã¯è飿§ã§ããããšãæããããŸãã
次ã«ç¿»èš³ã¿ã¹ã¯ãã¿ãŠãããŸããããã³ã³ããã¹ãã¯ä»¥äžã®ãšããã§ãã
cm = ContextManager(username="æ¥æ¬èª", agentname="è±èª", chat_description="æ¥æ¬èªãè±èªã«ç¿»èš³ããŠãã ããã")
ãããªããŸãã
Human> ææ¥ã¯æææ¥ãªã®ã§ããé
ã飲ãã§çŸå®ãçŽèŠããè§£å床ãèœãšãããšã«ããŸããã
AI> Tomorrow is Monday, so I decided to have a drink and lower the resolution to face reality.
ãã®ã»ãã«ãæŒç®ãããã°ã©ã ã®ã³ãŒãã£ã³ã°ãªã©ãããŸããŸãªã¿ã¹ã¯ãããªãããšãã§ããŸããäžç®äžŠã¹ãã§ããããã§ããã¯ãCompletionãšã¯äœãªã®ããšããæãããããŸãã
ãªãããã®ãããªAIã«æž¡ãã³ã³ããã¹ãïŒã¿ãŒã³ã€ã³ãããã®æ å ±ããŸãšããŠãããã³ããããšåŒã³ãŸããããã³ããã工倫ããŠãããã詊ããŠã¿ãŸãããïŒ
ChatGPTããŒã¹ã®LINE Botã®äœãæ¹
ã³ã³ãœãŒã«ã§ã¯å³æ°ãªãã®ãšããµãšæãã€ããããã³ããã詊ãã®ã«æ¯éããããŸããLINE BotåããŠèªåã ãã®ChatGPTãšãã€ã§ããããã¹ãã§ããããã«ããŠã¿ãŸãããã
äºåæºå
LINE Developersã«ã¢ã¯ã»ã¹ïŒåããŠã®æ¹ã¯ãµã€ã³ã¢ããïŒããŠMessaging APIã®ã¢ããªãäœæããChannelAccessTokenãšChannelSecretãååŸããŸãããã
ããã§ã¯è©³çްã¯çç¥ããŸãã®ã§ãQiitaã®ä»ã®èšäºãå ¬åŒããã¥ã¡ã³ããåèã«ããŠã¿ãŠãã ããããLINE Bot ãããè¿ãããªã©ã§æ€çŽ¢ãããšè¯ãã§ãããã
äŸåã©ã€ãã©ãªãŒã®ã€ã³ã¹ããŒã«
ãã¹ãŠPyPIã§å°å ¥ã§ããŸãã
$ pip install fastapi uvicorn requests aiohttp line-bot-sdk
ããã°ã©ã ã®äœæ
ãªããšãgpt3-contextualã®ãµã³ãã«ã³ãŒãã«LINE Botã®äŸããããŸãã®ã§ãããããã®ãŸãŸå©çšããŸããã³ãŒãã¯ä»¥äžã®ãšããã§ããopenai_apikeyãchannel_access_tokenãchannel_secretã«å€ãå
¥åããã®ãšãContextManagerã®åçš®èšå®å€ã«ã€ããŠã¯ã奜ã¿ã«åãããŠå€æŽããŠãã ããã
ãŸãããã®ãµã³ãã«ã³ãŒãã§ã¯https://ããªãã®ãµãŒããŒ/linebotã§Webhookãåãä»ããããã«ãªã£ãŠããŸããå¿
èŠã«å¿ããŠåœè©²éšåïŒ@app.post("/linebot")ã®ãšããïŒãä¿®æ£ããäžã§ããã®URLãLINE Developersã®Messaging APIã®Webhookå
ãšããŠç»é²ããŸãããã
import aiohttp
import logging
import traceback
from fastapi import FastAPI, Request, BackgroundTasks
from linebot import AsyncLineBotApi, WebhookParser
from linebot.aiohttp_async_http_client import AiohttpAsyncHttpClient
from linebot.models import MessageEvent, TextMessage
from gpt3contextual import ContextualChatGPT, ContextManager
openai_apikey = "SET_YOUR_OPENAI_API_KEY"
channel_access_token = "<YOUR CHANNEL ACCESS TOKEN>"
channel_secret = "<YOUR CHANNEL SECRET>"
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s]: %(message)s"))
logger = logging.Logger(__name__)
logger.addHandler(stream_handler)
session = aiohttp.ClientSession()
client = AiohttpAsyncHttpClient(session)
line_api = AsyncLineBotApi(
channel_access_token=channel_access_token,
async_http_client=client
)
parser = WebhookParser(channel_secret=channel_secret)
context_manager = ContextManager(
username="å
",
agentname="効",
chat_description="仲è¯ããªã®ã§äžå¯§èªã䜿ããã«è©±ããŠãã ããã"
)
contextual_chat = ContextualChatGPT(
openai_apikey,
context_manager=context_manager
)
async def handle_events(events):
for ev in events:
if isinstance(ev, MessageEvent):
try:
resp, _, _ = await contextual_chat.chat(
ev.source.user_id,
ev.message.text
)
except Exception as ex:
logger.error(f"Chat error: {ex}\n{traceback.format_exc()}")
resp = "ð£"
try:
await line_api.reply_message(
ev.reply_token,
TextMessage(text=resp)
)
except Exception as ex:
logger.error(f"LINE error: {ex}\n{traceback.format_exc()}")
app = FastAPI()
@app.on_event("shutdown")
async def app_shutdown():
await session.close()
@app.post("/linebot")
async def handle_request(request: Request, background_tasks: BackgroundTasks):
events = parser.parse(
(await request.body()).decode("utf-8"),
request.headers.get("X-Line-Signature", "")
)
background_tasks.add_task(handle_events, events=events)
return "ok"
皌å確èª
åºæ¥äžãã£ããå®è¡ããŸãã
$ uvicorn linebot:app
ããã©ã«ãã§127.0.0.1:8000çªããŒãã§èµ·åããŸããå€éšå ¬éãµãŒããŒã§IPã¢ãã¬ã¹ãå€ããå ŽåãããŒãçªå·ã倿Žãããå Žåã¯ä»¥äžã®ããã«ãããšå€æŽã§ããŸãã
$ uvicorn linebot:app --host 0.0.0.0 --port 8080
ãŸããæå
ã®PCã§åãããŠããããã°ã©ã ã§LINEããã®Webhookãåããã«ã¯ngrokã®å©çšã䟿å©ã§ãã以äžã®ããã«èµ·åããæãåºãããURLãLINE Developersã§Webhookã®URLãšããŠç»é²ããŸãããã
以äžã®äŸã ãšãhttps://49c85f52adb7.ngrok.io/linebotã«ãªããŸãã
$ ngrok http 8000
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Account XXXX (Plan: Pro)
Update update available (version 2.3.41, Ctrl-U to update)
Version 2.3.35
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://49c85f52adb7.ngrok.io -> http://localhost:8000
Forwarding https://49c85f52adb7.ngrok.io -> http://localhost:8000
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
ããã§LINEããã®ãªã¯ãšã¹ããåãä»ããæºåãæŽããŸããããæå ã®LINEã¢ããªã®ããŒã¯ç»é¢ã§è©±ããããŠã¿ãŸããããã¿ãŒããã«ãšåãããã«äŒè©±ãã§ãããæåã§ãïŒ
ããŸããããã³ããã®é¬æã詊ãããããªããž
ãããã¹ãGPTãšããLINE BotãäœããŸãããããã§ç޹ä»ããContextManagerã®ãã¡usernameãagentnameãchat_descriptionãèªç±ã«èšå®ããããšãã§ããŸããè² è·ãé«ããªã£ãããã®ãã¡èª²éããªããšãããªããªãã®ã§ãæ°ã«ãªãæ¹ã¯ä»ã®ãã¡ã«è©ŠããŠã¿ãŠãïŒ
ããã§ã¯ãEnjoy creating LINE Bot with ChatGPT!