🔖
RAG機能付きチャットボットを作ろう-3_chat.completionsでチャット
TL;DR
本稿ではstreamlitでデータのやりとりを行います。
- プロンプト入力欄に入力されたデータを、代入します。
- OpenAIのchat.completionsにデータを渡し、生成文書を取得します。
*OpenAIのAPIキーは取得済みの想定です。
実装イメージ
chat.completionsでチャット
前準備
main.pyと同じ階層に.envファイルを作成し、以下のようなディレクトリ構造にします。
windowsでは.envファイルを作成できない場合があるので、適当.txt
などのファイルを作成したあと、名前の変更で.env
に変更してください。
なお、linuxでは.env
ファイルは隠しファイル扱いなので、フォルダで設定で「隠しファイルを表示」を選択してください。
.
└── streamlit/
├── main.py
└── .env
まずは、.env
ファイルにAPIキーを保存します。
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
主な変更点
main.py
を以下のように編集します。
主な変更点は
- dotenvで
.env
ファイルから環境変数(APIキーなど)を取得 - openaiライブラリからOpenAIクライアントを呼び出して初期化
- クライアントから
.chat.completions.create
でプロンプトを渡し、生成文書を取得する関数を定義(default_chat
) - プロンプト入力欄に入力されたデータを、promptに代入する
- チャットボタンを押すと、
default_chat
関数を読んで、生成文書を作成する - 生成文書を表示する
というところになります。
実際のコード
import streamlit as st
from openai import OpenAI
from dotenv import load_dotenv
import os
load_dotenv(".env")
# OpenAIのAPIクライアントを初期化
# APIキーを環境変数から取得
client = OpenAI(
api_key=os.environ['OPENAI_API_KEY']
)
# プロンプトを入力すると、チャットボットが返答を返す関数を定義
# 入力はOpenAIのAPIクライアントとプロンプト
def default_chat(client, prompt):
response = client.chat.completions.create(
model="gpt-4o-mini", # 好きなモデルを選択
messages=[
{"role": "system", "content": "You are AI assistant."},
{"role": "user", "content": prompt}
]
)
return response.choices[0].message.content
st.title('RAG機能付きチャットボットを作ろう')
st.write('streamlitを使ったUIの作成')
prompt = st.text_area('プロンプト入力欄', )
button1, button2 = st.columns(2)
if button1.button('チャット'):
st.write(default_chat(client, prompt))
if button2.button('RAG'):
st.write('RAGボタンがクリックされました')
いきなり色々と追加しました。ひとつひとつ確認していきましょう。
load_dotenv(".env")
これは、.env
ファイルから環境変数を取得するためのコードです。
プログラム内に直接APIキーを書くのはおすすめできないので、.env
ファイルに書いておきます。
次に、
client = OpenAI(
api_key=os.environ['OPENAI_API_KEY']
)
では、先程取得したAPIキーを使って、OpenAIのAPIクライアントを初期化しています。
def default_chat(client, prompt):
response = client.chat.completions.create(
model="gpt-4o-mini", # 好きなモデルを選択
messages=[
{"role": "system", "content": "You are AI assistant."},
{"role": "user", "content": prompt}
]
)
return response.choices[0].message.content
では、クライアントとプロンプトを指定して、生成文書を取得する関数を定義しています。戻り値response.choices[0].message.content
で生成文書を取得しています。
なお、chat.completions.createとlangchainではプロンプトの入力や戻り値の取得方法が異なるので、注意してください。(私はここでハマりました。)
if button1.button('チャット'):
st.write(default_chat(client, prompt))
では、チャットボタンが押されたときに、default_chat
関数を呼び出して、生成文書を表示しています。
実際に「美味しいおやつを教えて」と入力して、チャットボタンを押すと、以下のような画面が表示されたら成功です。
リンク
- RAG機能付きチャットボットを作ろう-1:
https://zenn.dev/bluetang/articles/chatbot_with_lc_st_chromadb_01 - RAG機能付きチャットボットを作ろう-2:
https://zenn.dev/bluetang/articles/chatbot_with_lc_st_chromadb_02 - RAG機能付きチャットボットを作ろう-3:(本記事)
https://zenn.dev/bluetang/articles/chatbot_with_lc_st_chromadb_03
参考
編集履歴
- 2024/11/24: 初稿
Discussion