ChatGPTにキャラクター設定を追加して、ちょっとだけ記憶を保持するAPIを作る
タイトルの通り。
ChatGPTおもしろいけど、以下の2点があるともっといいなと思ったのでちょっとだけ実装。
・口調を好きなキャラクターとかにしたい
・記憶が保持されなさすぎるのは会話としては楽しくない
あまり記憶を保持しすぎるとどんどん処理が遅くなるので、直近10件のやりとりのみ記憶する形にしています。
将来もっと速く安くなればずっと会話を記憶してくれる身近な会話相手になって楽しいなぁ。
それにキャラクターづけが出来れば、理想のアシスタント…!
以下ざっと技術スタック。
フロントエンド
React
Viteでビルド。S3とかにデプロイ。
バックエンド
Python(FastAPI)
Dockerで作成。AWS lightsailにデプロイ。
とりいそぎバックエンドのプログラム。
# ライブラリ読み込む
import os
import openai
import uvicorn
from typing import Union
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
# サーバcreate
app = FastAPI()
# cors対策
origins = [
"http://localhost:8080", # フロント開発サーバー
"http://127.0.0.1:8443", # FastAPI開発サーバー
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 設定
openai.api_key = "ご自身のopen aiのAPI Key"
# 新しくリストを定義する
messages = []
# 最大メッセージ数を定義する
max_messages = 10
# キャラクター設定
settei = f"あなたは【作品名】に登場する【キャラクター名】としてロールプレイを行います。以下の制約条件を厳密に守ってロールプレイを行ってください。\
\
制約条件:\
* Chatbotの名前は、【キャラクター名】です。\
* Userを示す二人称は、君、またはあなたです。\
\
音無響子の行動指針:\
* ヤキモチ焼きです。\
* 犬を飼っています。\
* 飼っている犬の名前は総一朗さんです。\
* 結婚していた旦那さんとは死別しています。\
* 基本的には優しいです。\
* 22歳の女性です。\
* 回答は補足説明などを多用します。\
* 回答は比喩表現も上手です。\
* アパートの管理人です。\
* 実は五代さんが好きですが、なかなか素直になれません。\
"
# キャラ設定を追加
messages.append({"role": "system", "content": settei})
# Chatエンドポイント
@app.get("/chat")
def read_chat(q: str = None):
# 質問を追加
messages.append({"role": "user", "content": q})
# open ai apiを実行
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages
)
# APIから返ってきた回答
response_msg = response['choices'][0]['message']['content']
# 改行を消去
response_msg = response_msg.replace("\n", "")
# 返答をデータに追加する
messages.append({"role": "assistant", "content": response_msg})
# メッセージの保持がMAXを超えた場合、古いものを削除
if len(messages) > max_messages * 2 + 1:
# キャラクター設定の次を削除
messages.pop(1)
# その次の回答を削除
messages.pop(1)
result = {
"質問": q,
"回答": response_msg,
"これまでの回答": messages,
"設定": settei
}
return result
上記コードを `server.py` とかにして保存。
以下コマンドで開発サーバ起動。
uvicorn main:app --reload --port 8443
Dockerでバックエンド作成
ssh対応。
Keyの作成など別途必要。
docker-compose.ymlの中身
version: "3.0"
services:
api:
container_name: "api"
volumes:
- ./app:/app
build:
context: "./app"
dockerfile: "Dockerfile"
platform: linux/x86_64
ports:
- 443:443
Dockerfileの中身
FROM python:3.9-slim
COPY . ./app
WORKDIR /app
RUN pip3 install --upgrade pip
RUN pip3 install fastapi
RUN pip3 install "uvicorn[standard]"
RUN pip3 install requests
RUN pip3 install openai
EXPOSE 443:443
RUN chmod 755 ./cert/mycert.crt
RUN chmod 755 ./cert/mykey.key
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "443", "--ssl-certfile", "./cert/mycert.crt", "--ssl-keyfile", "./cert/mykey.key"]
フロント、インフラまわりも追記していきます。
(現在:2023年3月24日 01:00)