🔖

RAG機能付きチャットボットを作ろう-3_chat.completionsでチャット

2024/11/26に公開

TL;DR

本稿ではstreamlitでデータのやりとりを行います。

  • プロンプト入力欄に入力されたデータを、代入します。
  • OpenAIのchat.completionsにデータを渡し、生成文書を取得します。

*OpenAIのAPIキーは取得済みの想定です。

実装イメージ

chat.completionsでチャット

前準備

3.1. 環境設定ファイル(.env)の作成

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関数を呼び出して、生成文書を表示しています。
実際に「美味しいおやつを教えて」と入力して、チャットボタンを押すと、以下のような画面が表示されたら成功です。

alt text

リンク

Discussion