2024.8.7
こんにちは、ファイマテクノロジーの佐藤です。
前回のブログでは生成AIを活用した受注業務自働化アシスタントについてご紹介しました。今回からは実際に生成AIを使って、受注業務自動化をFunctionCallingやReActで実装していきたいと思います。
LLMに代表されるような生成AIは状況に応じた柔軟な対応ができます。どういったことかといいますと、従来システムであれば、条件に合致(例えば”発注依頼”という文字がメール本文にあったら)したら処理内容を分岐して特定の処理を実行するという処理が可能でした。
従来システムに対して生成AIシステムの場合、発注依頼をメールの本文から柔軟に判断して、発注処理の実行や数量や発注に関わる情報を文章から理解して、処理システムに渡すことができます。
このため、しっかりとしたメールフォーマットが定まっていないような依頼にも柔軟に対応することができるといった利点があります。
今回はOpenAI社のFunctionCallingについて図のような受注自動化を実現していきます。https://platform.openai.com/docs/guides/function-calling
今回はおおまかに下記の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やソフトウェアを活用した業務効率化や生産性向上をご検討中の方は、ぜひファイマテクノロジーにご相談ください。
会社名 | 株式会社Feynma Technology |
---|---|
所在地 | 〒461-0005 愛知県名古屋市東区東桜1-1-1 アーバンネット名古屋 ネクスタビル内 LIFORK久屋大通 |
設立 | 2020年4月1日 |
代表者 | 土屋太助 |
従業員数 | 8名 |
事業内容 | AI活用のコンサルティングおよび 分析プラットフォームの開発、販売 |