「OpenAIとLangchainを使用した言語的なメール作成Webアプリケーション」

Language Email Web App using OpenAI and Langchain

はじめに

この記事では、Langchainの助けを借りてOpenAIを使用してウェブアプリケーションを構築する方法について説明します。このウェブアプリは、ユーザーが非構造化のメールを正しくフォーマットされた英語に変換することができます。ユーザーはメールのテキストを入力し、希望するトーンと方言(フォーマル/インフォーマルおよびアメリカン/ブリティッシュイングリッシュ)を指定することができます。アプリは選択したスタイルで美しくフォーマットされたメールを提供します。私たちは毎回スケールアプリケーションを構築することはできません。クエリとともにプロンプトをコピーして貼り付けるだけではありません。代わりに、さあ始めましょう、そしてこの素晴らしい「Professional Email Writer」ツールを構築しましょう。

学習目標

  • Streamlitを使用して美しいウェブアプリケーションを構築する方法を学ぶ。
  • プロンプトエンジニアリングとは何か、メールの生成に効果的なプロンプトを作成する方法を理解する。
  • LangchainのPromptTemplateを使用してOpenAI LLMをクエリする方法を学ぶ。
  • Streamlitを使用してPythonアプリケーションをデプロイする方法を学ぶ。

この記事はData Science Blogathonの一部として公開されました。

Streamlitのセットアップ

まず、Streamlitが何であるか、どのように機能するか、そしてユースケースに設定する方法を理解する必要があります。Streamlitを使用すると、Pythonでウェブアプリケーションを作成し、ローカルおよびWeb上でホストすることができます。まず、ターミナルに移動し、以下のコマンドを使用してStreamlitをインストールします。

pip install streamlit

スクリプト用の空のPythonファイルを作成し、以下のコマンドを使用してファイルを実行します。

python -m streamlit run [your_file_name.py]

これにより、アドレスlocalhost:8501で空のStreamlitアプリが開始されます。ブラウザを開き、このアドレスを検索してアプリを視覚化できます。このアプリの素晴らしい点の1つは、コードベースを編集しても、ブラウザのアプリが自動的に更新されることです。

フロントエンドの構築

アプリケーションにヘッダーとページタイトルを追加することからコードを開始しましょう。私はそれを「Professional Email Writer」と名付けます。

# Streamlitライブラリのインポート
import streamlit as st
# ヘッダーとタイトルを設定するStreamlitアプリのセットアップ
st.set_page_config(page_title="Professional Email Writer", page_icon=":robot:")
st.header("Professional Email Writer")

出力:

次に、ユーザーからの入力を取得してユーザーがどのメールを希望しているのかを確認する必要があります。そのために、streamlitが提供するtext_area関数を使用します。

# ユーザーの入力メールテキストを取得する
def getEmail():
    input_text = st.text_area(label="Email Input", label_visibility='collapsed',
                              placeholder="Your Email...", key="input_text")
    return input_text

input_text = getEmail()

出力:

次に、ユーザーにどのトーン(フォーマルまたはインフォーマル)とどの英語方言(アメリカンイングリッシュまたはブリティッシュイングリッシュ)を希望するかを尋ねるために、2つのドロップダウンが必要です。

# トーンと方言を選択するためのドロップダウンを表示する
column1, column2 = st.columns(2)
with column1:
    tone_drop_down = st.selectbox(
        'メールにどのトーンを希望しますか?',
        ('フォーマル', 'インフォーマル'))

with column2:
    dialect_drop_down = st.selectbox(
        'どの英語方言を希望しますか?',
        ('アメリカン', 'ブリティッシュ'))

上記のコードは、selectbox()関数を使用してドロップダウンを含む2つの列を作成します。

出力:

これらの選択肢を更新するたびに、アプリ全体が再実行されるようにする必要があります。ドロップダウンで何かをトグルするたびに、大きなリフレッシュのようなものと考えてください。

プロンプトエンジニアリング

今、ユーザーから入力された電子メールを取得し、ドロップダウンでユーザーが選択した設定と共にプロンプトテンプレートを使用してLangchainを介して渡す必要があります。その後、OpenAIから適切にフォーマットされた出力を取得する必要があります。

それを行うには、プロンプトテンプレートを設定する必要があります。このプロンプトテンプレートで最適な出力を得るために、プロンプトエンジニアリングを行う必要があります。プロンプトエンジニアリングとは、言語モデルにクエリを投げて正確な結果を取得するために、プロンプトを構築するプロセスです。必要に応じてこのテンプレートを変更することができます。

1. プロンプトはユーザーが入力している内容を明確に説明する必要があります。たとえば、以下は構造化されていないか、語句が不適切な可能性のある電子メールです。

2. プロンプトは言語モデルが出力する内容を明確に説明する必要があります。たとえば、以下のような目標を持っています。

    – 電子メールを適切にフォーマットする

    – 入力された電子メールを波括弧で指定されたトーンに変換する

    – 入力された電子メールを波括弧で指定された方言に変換する

    – もし必要なら、電子メールを温かい挨拶で始めてください。挨拶が必要な場合は、挨拶を追加してください。

3. プロンプトには、モデルが出力の期待値を認識するための例が含まれている必要があります。

4. 最後に、プロンプトはユーザー入力が何であり、各入力が何を指しているかを明確に示す必要があります。

以下は、上記のルールに従って作成したプロンプトです。

# Define the template for the email conversion task
template = """
    以下は構造化されていないか、語句が不適切な可能性のある電子メールです。
    次の目標を持っています:
    - 電子メールを適切にフォーマットする
    - 入力された電子メールを波括弧で指定されたトーンに変換する
    - 入力された電子メールを波括弧で指定された方言に変換する

    これらの異なるトーンの例を参考にしてください:
    - フォーマル:週末にハイデラバードに行きました。伝えるべきことがたくさんあります。
    - インフォーマル:週末にハイデラバードに行きました。伝えるべきことがたくさんあります。

    以下は、異なる方言の単語の例です:
    - アメリカ英語:ゴミ、クッキー、緑の指、駐車場、パンツ、フロントガラス、フレンチフライ、綿あめ、アパート
    - イギリス英語:庭師、駐車場、ズボン、フロントガラス、ポテトチップス、キャンディフロス、旗、ゴミ、ビスケット

    各方言の例文:
    - アメリカ英語:彼らが色鮮やかな近所を散歩している間、サラは彼女の友人に近くのカフェでコーヒーを飲みたいか尋ねました。秋の紅葉は息をのむほど美しく、彼らは週末の計画についておしゃべりを楽しんでいました。
    - イギリス英語:サラが彼女の友人に近くのカフェでコーヒーを飲みたいか尋ねたとき、彼らは美しい秋の葉っぱを愛でながら、快適な天候を楽しみながら週末の計画についておしゃべりしました。

    もし必要なら、電子メールを温かい挨拶で始めてください。挨拶が必要な場合は、挨拶を追加してください。

    以下は、電子メール、トーン、方言です:
    トーン:{tone}
    方言:{dialect}
    電子メール:{email}

    あなたの{dialect}の返答:
"""

次に、PromptTemplateクラスを使用してプロンプトを作成します。これにより、ユーザーの入力をプロンプトに注入することができます。

#PromptTemplateクラスをインポート
from langchain import PromptTemplate
# 入力変数とテンプレートを管理するPromptTemplateインスタンスを作成する
prompt = PromptTemplate(
    input_variables=["tone", "dialect", "email"],
    template=query_template,
)

言語モデルの読み込み

OpenAIのAPIキーが利用可能であることを確認してください。利用できない場合は、以下の手順に従ってください。

  • ’https://openai.com/’にアクセスし、アカウントを作成します。
  • アカウントにログインし、ダッシュボードで「API」を選択します。
  • プロフィールアイコンをクリックし、「APIキーを表示」を選択します。
  • 「新しいシークレットキーを作成」を選択し、キーをコピーして保存します。

OpenAI APIキーのコード

以下は、text_input()関数を使用してユーザーからOpenAI APIキーを入力し、サンプルAPIキーをプレースホルダーとして表示する関数のコードです。

# OpenAI APIキーのテキスト入力を表示する
def fetchAPIKey():
    input_text = st.text_input(
        label="OpenAI APIキー", placeholder="例:vk-Cb8un42twmA8tf...", key="openai_api_key_input")
    return input_text

# ユーザーからOpenAI APIキーを取得する
openai_api_key = fetchAPIKey()

出力:

APIキーがスクリプト内にあるか、コードに固定されていないことを確認する必要があります。環境変数に保存することで、コードから取得できるようにすることができます。環境変数を作成する方法として、別の.envファイルを使用する方法があります。

環境変数の手順

以下の手順に従って環境変数を作成します:

1: ターミナルを開き、コマンド「pip install python-dotenv」を使用してpython-dotenvパッケージをインストールします。

2: 「.env」という名前のファイルを作成します。

3: APIキーを以下の形式でファイルに保存します。

API_KEY=ここにAPIキーを入力してください

4: dotenvパッケージを読み込み、そのパッケージを使用して環境変数を取得します。

from dotenv import load_dotenv
import os

# .envファイルから環境変数を読み込む
load_dotenv()

# os.environを使用してAPIキーにアクセスする
openai_api_key = os.environ.get("API_KEY")

この方法により、APIキーがコード内で直接公開されることがなくなります。このファイルを公開せずに安全に保管してください。

ただし、OpenAI APIはAPIリクエストの回数に制限があるため、ユーザーには自分のAPIキーを入力してもらうようにします。この場合、温度が0.7に設定されたOpenAIをロードし、クリエイティブな出力を生成します。以下のコードは、無効なOpenAI APIキーを渡した場合にエラーをスローします。さらに、ユーザーが無効なキーを入力した場合には適切な警告を表示する必要があります。

# OpenAIライブラリのインポート
from langchain.llms import OpenAI
# 言語モデルをロードするための関数
def loadLanguageModel(api_key_openai):
    llm = OpenAI(temperature=.7, openai_api_key=api_key_openai)
    return llm

ユーザーにサンプルの例を提供して、入力と出力のイメージを理解できるようにしましょう。以下の関数は、テキストボックスにサンプルの構造化されていない文と文法の間違った電子メールクエリを更新します。

# サンプルの電子メールでテキストボックスを更新する関数
def textBoxUpdateWithExample():
    print("更新されました")
    st.session_state.input_text = "Vinay I am starts work at yours office from monday"

# 「サンプルを表示」ボタン
st.button("*サンプルを表示*", type='secondary',
          help="変換するメールの例を見るにはクリックしてください。", on_click=textBoxUpdateWithExample)
st.markdown("### あなたのメール:")

出力:

次に、ユーザーがAPIキーを入力し、または言語モデルを呼び出す前にテキストボックスにクエリを入力したことを確認する必要があります。APIキーが提供されず、または無効なAPIキーが提供された場合、正しいシークレットキーを取得するための適切な手順をユーザーに表示する必要があります。

# input_textが提供されている場合、メールの変換を実行する
if input_text:
    if not openai_api_key:
        # APIキーが提供されていない場合、警告を表示する
        st.warning(
            'OpenAI APIキーを挿入してください。[こちらのリンク](https://help.openai.com/en/articles/4936850-where-do-i-find-my-secret-api-key)を参照してください。', icon="⚠️")
        st.stop()
    # 提供されたAPIキーで言語モデルをロードする
    llm = loadLanguageModel(api_key_openai=openai_api_key)
    # PromptTemplateと言語モデルを使用してメールをフォーマットする
    prompt_with_email = prompt.format(
        tone=tone_drop_down, dialect=dialect_drop_down, email=input_text)
    formatted_email = llm(prompt_with_email)
    # フォーマットされたメールを表示する
    st.write(formatted_email)

出力:

ユーザーが正しいAPIキーと適切な電子メールテキストをテキストボックスに入力する場合、ユーザーが入力した電子メールテキストと設定(トーン、方言)を使用してプロンプトをフォーマットし、このプロンプトを言語モデルに渡します。 LLMは、適切にフォーマットされた電子メールとしての応答を提供します。これを「あなたのメール」タブの下に表示するためにstreamlit write()関数を使用します。

アプリケーションのデプロイ

アプリケーションをデプロイするためには、以下の手順に従ってください:

1: 最初に、コードをGitHubリポジトリにプッシュする必要があります。プッシュする前に、コードのすべての依存関係のリストを含むrequirements.txtファイルを作成します。

  • langchain
  • openai
  • streamlit

2: streamlit.ioにアクセスし、GitHubを承認してアカウントを作成します。

3: streamlitアカウントにログインします。

4: 新しいアプリを作成し、GitHubリポジトリのすべての詳細を渡します。メインファイルパスの下で、Pythonスクリプトを含むファイルの名前を指定します。最後に、デプロイをクリックします。

5: アプリのURLを保存します。数分後、そのURLを使用してWeb上でアプリケーションがライブで表示されます。

完全な実装

# 必要なライブラリをインポートする
from langchain import PromptTemplate
import streamlit as st
from langchain.llms import OpenAI

# 電子メール変換タスクのためのテンプレートを定義する
query_template = query_template = """
以下は形式が不明瞭で言葉遣いが悪い可能性のある電子メールです。
目標は次のとおりです:
- 電子メールを適切にフォーマットする
- 入力された電子メールを波括弧で指定されたトーンに変換する
- 入力された電子メールを波括弧で指定された方言に変換する

異なるトーンの例を以下に示します:
- フォーマル: 私たちは週末のためにハイデラバードに行きました。話すことがたくさんあります。
- インフォーマル: 週末のためにハイデラバードに行った。あなたに話すことがたくさんあります。

異なる方言の単語の例を以下に示します:
- アメリカ: ゴミ、クッキー、緑の指、駐車場、パンツ、フロントガラス、
フレンチフライ、綿菓子、アパート
- イギリス: グリーンフィンガー、カーパーク、ズボン、フロントガラス、チップ、キャンディフロス、
フラッグ、ゴミ、ビスケット

各方言の例文:
- アメリカ: 彼らは色とりどりの近所を散策しながら、サラは友人に近くのカフェでコーヒーを飲みたいかどうか尋ねました。秋の紅葉は息をのむようで、彼らは週末の計画についておしゃべりを楽しんでいました。
- イギリス: 彼らは絵のような近所をさまよいながら、サラは友人に近くのカフェでコーヒーを飲みたいかどうか尋ねました。秋の葉っぱは見事で、彼らは週末の計画についておしゃべりを楽しんでいました。

温かい挨拶で電子メールを始めてください。必要な場合は挨拶を追加してください。

以下は電子メール、トーン、方言です:
トーン: {tone}
方言: {dialect}
電子メール: {email}

あなたの{dialect}の応答:
"""

# 入力変数とテンプレートを管理するPromptTemplateインスタンスを作成する
prompt = PromptTemplate(
input_variables=["tone", "dialect", "email"],
template=query_template,
)

# 言語モデルを読み込むための関数
def loadLanguageModel(api_key_openai):
llm = OpenAI(temperature=.7, openai_api_key=api_key_openai)
return llm

# ヘッダーとタイトルを持つStreamlitアプリをセットアップする
st.set_page_config(page_title="Professional Email Writer", page_icon=":robot:")
st.header("Professional Email Writer")

# Streamlitレイアウトのための列を作成する
column1, column2 = st.columns(2)

# OpenAI APIキーのテキスト入力を表示する
def fetchAPIKey():
input_text = st.text_input(
label="OpenAI APIキー", placeholder="例: vk-Cb8un42twmA8tf...", key="openai_api_key_input")
return input_text

# ユーザーからOpenAI APIキーを取得する
openai_api_key = fetchAPIKey()

# トーンと方言を選択するドロップダウンを表示する
column1, column2 = st.columns(2)
with column1:
tone_drop_down = st.selectbox(
'電子メールのトーンを選択してください',
('フォーマル', 'インフォーマル'))

with column2:
dialect_drop_down = st.selectbox(
'英語の方言を選択してください',
('アメリカ', 'イギリス'))

# ユーザー入力の電子メールテキストを取得する
def getEmail():
input_text = st.text_area(label="電子メール入力", label_visibility='collapsed',
placeholder="あなたの電子メール...", key="input_text")
return input_text

input_text = getEmail()

# 電子メールが単語制限を超えているかどうかをチェックする
if len(input_text.split(" ")) > 700:
st.write("最大制限は700単語です。短い電子メールを入力してください")
st.stop()

# テキストボックスを例の電子メールで更新するための関数
def textBoxUpdateWithExample():
print("in updated")
st.session_state.input_text = "Vinay I am starts work at yours office from monday"

# 例の電子メールを表示するボタン
st.button("*例を表示*", type='secondary',
help="変換する電子メールの例を表示するにはクリックしてください。", on_click=textBoxUpdateWithExample)
st.markdown("### あなたの電子メール:")

# ユーザーがinput_textを提供した場合、電子メールの変換を進める
if input_text:
if not openai_api_key:
# APIキーが提供されていない場合は警告を表示する
st.warning(
'OpenAI APIキーを入力してください。手順は[こちら](https://help.openai.com/en/articles/4936850-where-do-i-find-my-secret-api-key)を参照してください。', icon="⚠️")
st.stop()
# 提供されたAPIキーで言語モデルを読み込む
llm = loadLanguageModel(api_key_openai=openai_api_key)
# PromptTemplateと言語モデルを使用して電子メールをフォーマットする
prompt_with_email = prompt.format(
tone=tone_drop_down, dialect=dialect_drop_down, email=input_text)
formatted_email = llm(prompt_with_email)
# フォーマットされた電子メールを表示する
st.write(formatted_email)
</pre

結論

この記事では、Langchainの助けを借りてOpenAI LLMを使用して美しいWebアプリケーションを作成する方法を見てきました。まず、Streamlitのインストールとセットアップから始めました。次に、ユーザーからのトーン、方言、およびメールテキストなどの入力を受け取るフロントエンドインターフェースを作成しました。その後、これらの入力を使用して言語モデルにクエリを送信するための効果的なプロンプトを作成しました。次に、Langchainを使用して作成したプロンプトを渡すことで、OpenAIモデルをAPIキーを使用して初期化しました。最後に、Streamlitを使用してWebにアプリケーションをデプロイしました。

重要なポイント

  • PythonのStreamlitライブラリを使用すると、インタラクティブなWebアプリケーションを作成できます。
  • 適切な結果を取得するために、プロンプトエンジニアリングは言語モデルからの最適化に重要です。
  • OpenAI LLMは、OpenAIライブラリとそのシークレットキーを使用して、Pythonアプリケーションで簡単に使用できます。
  • Langchainのプロンプトテンプレートを使用することで、ユーザーの入力に基づいてプロンプトを適切にフォーマットし、LLMへのクエリにさらに使用できます。
  • Streamlitの共有機能を使用すると、PythonアプリケーションをライブURLでホストできます。

よくある質問

この記事で表示されているメディアはAnalytics Vidhyaの所有ではなく、著者の裁量によって使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AIニュース

「AIが顧客がAmazonでより良いショッピングをするのを支援している方法」

顧客のレビューは、オンラインショッピングの基盤となり、購入前に貴重なインサイトを提供することで、購入者に力を与えてい...

人工知能

ChatGPTでリードマグネットのアイデアをブレインストームする

バリューパックされたリードマグネットのアイデアを考えるのに苦労している場合、ChatGPTは素晴らしいブレインストーミングツ...

AI研究

「UCLA研究者がGedankenNetを紹介:物理法則や思考実験から学ぶ自己教示AIモデルが計算機画像処理を進化させる」

深層学習の最近の進展は、計算画像処理、顕微鏡、ホログラフィ関連の分野に大きな影響を与えています。これらの技術は、バイ...

AIニュース

このAIニュースレターはあなたが必要なすべてです #72

今週、AIニュースはOpenAIのDevdayと多くの新しいモデルや機能の発売で主導権を握り、それによってエロン・マスクがLLMレース...

機械学習

スカイワーク-13B:3.2Tトークン以上のコーパスから学習された大規模言語モデル(LLM)のファミリーを紹介しますこのコーパスは、英語と中国語のテキストから引用されています

バイリンガルLLMは、言語の多様性が共通の課題となっている相互につながった世界で、ますます重要になっています。彼らは言語...

機械学習

「ディープラーニングを用いたナノアレイの開発:特定の構造色を生み出すことができるナノホールアレイを設計する新しいAI手法」

色の多様性は、2つ以上の色の組み合わせによってさらに増加します。光は微細なナノ構造と相互作用し、複数の色の固有のパター...