NEWS & BLOG

テック

2024.8.7

生成AIで受注業務自働化アシスタント 〜実装編 FunctionCallingの場合〜

こんにちは、ファイマテクノロジーの佐藤です。

前回のブログでは生成AIを活用した受注業務自働化アシスタントについてご紹介しました。今回からは実際に生成AIを使って、受注業務自動化をFunctionCallingやReActで実装していきたいと思います。

今回実現する概要

LLMに代表されるような生成AIは状況に応じた柔軟な対応ができます。どういったことかといいますと、従来システムであれば、条件に合致(例えば”発注依頼”という文字がメール本文にあったら)したら処理内容を分岐して特定の処理を実行するという処理が可能でした。

従来システムに対して生成AIシステムの場合、発注依頼をメールの本文から柔軟に判断して、発注処理の実行や数量や発注に関わる情報を文章から理解して、処理システムに渡すことができます。
このため、しっかりとしたメールフォーマットが定まっていないような依頼にも柔軟に対応することができるといった利点があります。

今回はOpenAI社のFunctionCallingについて図のような受注自動化を実現していきます。https://platform.openai.com/docs/guides/function-calling

それでは実装していきましょう。

仕様の決定

今回はおおまかに下記の3つを仕様として実装しました。

  1. 顧客からくるメールが何らかの発注依頼かどうかを判断する。
  2. 発注依頼メール(テキスト)に対して、品番と納期の情報を取り込んで、function call(受発注システムに品番情報と納期の2変数を引き渡す)を呼び出す。
  3. 納期もしくは品番の情報が取れない場合は顧客に情報が足りていない旨のメールを送り、情報が充足するまで不足した情報を要求する。

関数一覧

system関数:品番情報と納期を受け取り何らかのシステムを稼働させる関数。

def system(number, date):
pass

send_mail関数:gmailで送信を行う関数。2,3行目でパスワードを読み込みます。7~10行目で送信元、宛先、タイトル、本文を渡します。13~23行目でSMTPメールサーバーに接続し、メールを送信します。

def send_gmail(mail_from, mail_to, mail_subject, mail_body):
settings_file = open('settings.json','r')
settings_data = json.load(settings_file)

""" メッセージのオブジェクト """
msg = MIMEText(mail_body, "plain", "utf-8")
msg['Subject'] = mail_subject
msg['From'] = mail_from
msg['To'] = mail_to

# エラーキャッチ
try:
""" SMTPメールサーバーに接続 """
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
gmail_addr = settings_data['gmail_addr']
app_passwd = settings_data['app_passwd']
smtpobj.login(gmail_addr, app_passwd)

""" メール送信 """
smtpobj.sendmail(mail_from, mail_to, msg.as_string())

""" SMTPサーバーとの接続解除 """
smtpobj.quit()

except Exception as e:
print(e)

print("メール送信完了")

ここまでがToolに該当します。以降はfunction_callを呼ぶ関数です。

chat_gpt_with_function関数:GPT-4を用いてfunction_callでメールを受信した場合の一連の動作を行います。3~24行目ではGPT-4やfunctionの設定を行っています。funcitonが呼び起こされる条件としては下記期のとおりです。

“発注情報に対して、品番の情報と納期の情報の両方が記載されている場合にシステムを実行する。片方でも欠けていたら実行しない。”

26行目以降では、呼び起こされていない場合はGPTの出力をそのまま出力しています。その後、情報が不足しているという旨のメールを送信します。呼び起こされた場合は品番と納期の情報を抽出し、上記で定義したsystem関数・send_mail関数を呼び出し、システム処理、メール送信を行う。

def chat_gpt_with_function(text ,mail_from, mail_to, openai_credential_file="openai_api_credkey.txt"):
    # OpenAIーAPI認証
    with open(openai_credential_file, "r") as f:
        os.environ["OPENAI_API_KEY"] = f.read()
        openai.api_key = os.environ["OPENAI_API_KEY"]
    # AIが呼び出せる関数の定義
    functions = [
        # 何をする関数かについて記述
        {
            "name": "PandD",
            "description": "発注情報に対して、品番の情報と納期の情報の両方が記載されている場合にシステムを実行する。片方でも欠けていたら実行しない。"
    }
]

    # ユーザーの入力から、Functions Callingが必要かどうか判断する
    response = openai.chat.completions.create(
        model="gpt-4-0613",
        messages=[
            {"role": "user", "content": text},
        ],
        functions=functions,
        function_call="auto",
        temperature = 0
    )
    
    # Function Callingが必要なければ、そのままAIの回答になる
    message = response.choices[0].message
    print(message)
    # Functions Callingが必要な場合
    if message.function_call:
            query = "Output a comma-separated list of part numbers and delivery dates for the following text: " + text
            completion = openai.chat.completions.create(
                    model="gpt-3.5-turbo-0613",
                    messages=[
                        {"role": "user", "content": query}
                    ],
                    temperature = 0
                )
            extracted_data = completion.choices[0].message.content.split(',')
            number, date = extracted_data[0], extracted_data[1]
            Tool.system(number, date)
            subject = "発注確認メール"
            message = f"以下の発注が完了しました。品番:{number}, 納期: {date}"
            Tool.send_gmail(mail_from, mail_to, subject, message)
    
    # 情報が不足していた場合
    else:
        subject = "発注エラー"
        message = "品番もしくは納期の情報が不足しています。不足している情報がないか確認して、再度送信して下さい。"
        Tool.send_gmail(mail_from, mail_to, subject, message)

main関数:メールの本文と送信元、宛先を定義し、chat_gpt_with_function関数に渡しています。

def main():
    full_text = '''いつもお世話になっております。ファイマテクノロジーの佐藤です。

    この度は、以下の製品について発注を希望いたします。

    製品名: iphone15
    品番: ABC123
    納期: 2024/4/4

    また、発注にあたり必要な手続きや追加情報がございましたら、合わせてご指示いただけますと助かります。

    何卒よろしくお願い申し上げます。

    敬具

    電話: XXX-XXXX-XXXX
    メール: xxxx.xxxx@feynma.com'''
    # 送信元
    mail_from  = "xxxx.xxxx@feynma.com"
    # 宛先
    mail_to = "xxxx.xxxx@xxxxxxxx.com"

    chat_gpt_with_function(full_text, mail_from, mail_to)

実際に動かしてみる

下記のようなテキスト(本文) で動かしてみます。

無事system関数・send_mail関数を呼び出され、メールを受信することができました。

また、情報がない時に情報が不足しているという旨のメールを受信できるか確認しました。確認のために納期を消して実行しました。

所感とまとめ

今回の試みではFuctionCallingを用いてLLMにどんなアクションを取るか、状況から判断させ、実際にアクションを実行させることができました。このような仕組みを構築することで、定型的に処理できるものだけを自動で処理させ、定型では処理できないもののみを事務スタッフの方が対応するということが実現できると思います。

メール本文から条件分岐をLLMに考えさせるのがFunctionCallingでしたが、次回はさらに発展して、人間のような思考プロセスを模倣し、複雑な問題を解決するための方法であるReActという技術を用いた受注業務自動化の検証をやっていきたいと思います。

ReActでは思考→行動→結果を観察→思考→行動→結果を観察・・・ というように循環を繰り返すことでより複雑な問題に対処することができます。良ければそちらもご一読ください!

大規模言語モデルは世界中で日々研究が行われており、ファイマテクノロジーでは、お客様のニーズに合わせて業務効率化や生産性向上のソリューション開発を行っています。AIやソフトウェアを活用した業務効率化や生産性向上をご検討中の方は、ぜひファイマテクノロジーにご相談ください。

一覧に戻る一覧に戻る

CONTACT

まずは気軽にご相談ください

問い合わせはこちら

COMPANY

会社名 株式会社Feynma Technology
所在地 〒461-0005
愛知県名古屋市東区東桜1-1-1
アーバンネット名古屋 ネクスタビル内
LIFORK久屋大通
設立 2020年4月1日
代表者 土屋太助
従業員数 8名
事業内容 AI活用のコンサルティングおよび
分析プラットフォームの開発、販売

TOP