chatGPTのチャットツールを作ってみた

chatGPTが発表されてから1年ほど経って、かなり浸透してきたと思います。実は、興味があったんだけど、使い方がよくわからないので疎遠になっていました。で、新しい年が始まったので、openAIのchatGPTのサブスクリプションを使ってみました。使ってみると、GPT3.5とGPT4.0ではかなり、精度が異なることも分かったし、毎月3,000円がちょっと高いとも感じました。正直、そこまで使用できないのもあるんですけどね。で、安く使える方法はないかと考えていくと、結果だけほしいならば、apiを使用するのが一番だと思ったので、調べてみた。apiを使った場合、GPT4.0でだいたいブログの要約で1回10円くらいだったので3000円分だと300日分くらいだと考えると経済的ってことで、チャットツールにしてみた。

参考にしたサイトは以下のとおり。ほぼこれをそのままつかっているかも。改めて、良い時代です。あとはやる気だけの問題ですけどね。ここが一番大変なのですが。

https://qiita.com/utanesuke/items/15a02993dbaff6d3658a

で使ったのが、これ。

使用したのは、streamlit。簡単にwebアプリを使用できるライブラリです。最近、NTTでも記事がありましたライブラリです。

https://it.impress.co.jp/articles/-/25986

streamlitはクラウドサーバーもあって、webアプリの公開もすることができます。2日ほど使用しないと停止するんですけどね。そういえば、前回も銘柄抽出ツールで使っていました。

クラウドサーバーを使うときは、githubと連携する必要がありますが。githubもよくわからなかったので、調べるためにちょうど良かったです。

今回のツールでは、基本的なアシスタント機能、ブログの要約機能、googleカレンダー登録支援機能をとりあえず載せてみました。ここでGPT3.5とGPT4.0を切り替えることができるようにしました。本当は、回答の傾向を買えるパラメーターをつけても良かったのですが、とりあえず基本的な係数に設定しています。

で、作ったコードが下記のもの。

import datetime
from google.oauth2 import service_account
from googleapiclient.errors import HttpError
from googleapiclient.discovery import build

import streamlit as st
import requests
import json

import math
import time

st.set_page_config(page_title="AI_assistant【ChatGPT】")
st.title("**AI_assistant【ChatGPT】**")

if "label" not in st.session_state:
st.session_state.label = 0

#================================================================================
#sideber
with st.sidebar:
add_radio = st.radio(
"種類",
("基本", "ブログ","カレンダー")
)

add_radio_model = st.radio(
"model",
("GPT-3", "GPT-4"),
horizontal=True
)

# チャットボットとやりとりする関数 ===================================================
def communicate():
if st.session_state.label == 1:
messages = st.session_state["messages_basic"]
elif st.session_state.label == 2:
messages = st.session_state["messages_blog"]
else:
messages = st.session_state["messages"]

user_message = {"role": "user", "content": st.session_state["user_input"]}
messages.append(user_message)

api_key = st.secrets["openai_api_key"]

if st.session_state.label==4:
google_message = {"role": "system", "content": '私はgoogleカレンダーを操作できます'}
messages.append(google_message)


payload = {
"model": st.session_state["model"],
"messages": messages,
"max_tokens": 3000,
"temperature": 0,
"top_p": 0.1,
}

response = requests.post("https://api.openai.com/v1/chat/completions",
headers = {"Content-Type":"application/json","Authorization":"Bearer "+ api_key } ,
json = payload,stream=True
)

bot_message = json.loads(response.text)["choices"][0]["message"]

messages.append(bot_message)

with open("log.json", mode='a') as flog:
for i in messages:
json.dump(i,flog)

st.session_state["user_input"] = "" # 入力欄を消去

#基本====================================================================
if add_radio =="基本":
st.header('【基本】')
st.subheader('', divider='blue')
st.session_state.label = 1

# st.session_stateを使いメッセージのやりとりを保存
if "messages_basic" not in st.session_state:
st.session_state["messages_basic"] = [
{"role": "system", "content": "あなたは優秀なアシスタントAIです。"},
]

# ユーザーインターフェイスの構築
st.write("ChatGPT_API(GPT-3,GPT-4)を使ったチャットボットです。")

user_input = st.text_area("メッセージを入力してください。", key="user_input", on_change=communicate)

if st.session_state["messages_basic"]:
messages = st.session_state["messages_basic"]

for message in reversed(messages[0:]): # 直近のメッセージを上に
speaker = "🙂"
if message["role"]=="system":
speaker="💻"
if message["role"]=="assistant":
speaker=f'🤖{st.session_state["model"]}'

st.write(speaker + ": " + message["content"])


#その他====================================================================
with open("blog.txt",newline='\n') as f:
blog = f.read()
with open("cal.txt",newline='\n') as f:
cal = f.read()
dt_now = datetime.datetime.now()
dt_now=(dt_now.strftime('%Y/%m/%d %H:%M:%S'))
#blog==========================================================================
if add_radio =="ブログ":
st.header('【ブログ】')
st.subheader('', divider='blue')
st.session_state.label = 2

# st.session_stateを使いメッセージのやりとりを保存
if "messages_blog" not in st.session_state:
st.session_state["messages_blog"] = [
{"role": "system", "content": "あなたは優秀な執筆者です。"},
{"role": "system", "content": blog}]

# ユーザーインターフェイスの構築
st.write("ChatGPT_API(GPT-3,GPT-4)を使ったチャットボットです。")

user_input = st.text_area("メッセージを入力してください。", key="user_input", on_change=communicate)

if st.session_state["messages_blog"]:
messages = st.session_state["messages_blog"]

for message in reversed(messages[0:]): # 直近のメッセージを上に
speaker = "🙂"
if message["role"]=="system":
speaker="💻"
if message["role"]=="assistant":
speaker=f'🤖{st.session_state["model"]}'

st.write(speaker + ": " + message["content"])

#カレンダー===============================================================
if add_radio =="カレンダー":
st.header('カレンダー')
st.subheader('', divider='blue')
st.session_state.label = 3

# st.session_stateを使いメッセージのやりとりを保存
if "messages" not in st.session_state:
st.session_state["messages"] = [
{"role": "system", "content": "あなたは優秀なアシスタントです。"},{"role": "system", "content":"現在時刻は"+dt_now},{"role": "system", "content": cal}]

# ユーザーインターフェイスの構築
st.write("ChatGPT_API(GPT-3,GPT-4)を使ったチャットボットです。")

user_input = st.text_area("メッセージを入力してください。", key="user_input", on_change=communicate)

if st.session_state["messages"]:
messages = st.session_state["messages"]

for message in reversed(messages[0:]): # 直近のメッセージを上に
speaker = "🙂"
if message["role"]=="system":
speaker="💻"
if "APIKEY" in message["content"]:
continue

if message["role"]=="assistant":
speaker=f'🤖{st.session_state["model"]}'

st.write(speaker + ": " + message["content"])


for i in range(20):
st.write("")

st.write("copylight@skamp931")

#======================================================
if add_radio_model == "GPT-3":
st.session_state["model"]="gpt-3.5-turbo"
if add_radio_model == "GPT-4":
st.session_state["model"]="gpt-4-0125-preview"

とりあえず、これを使ってみて、色々勉強してみたいと思います。

他の勉強もしないといけないのに、時間がないですね。。。。

最近、プラナリア?を捕まえてきました。こいつ、半分にすると、分裂するんですって。不思議な生き物もいるもんですね。

Comments

No comments yet. Why don’t you start the discussion?

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です