請求書自動化サービスで使われている技術ご紹介(第3回)

今回は少しコードに踏み込んで、特にchatGPTのAPI部分について解説します。

前提として、既にGoogleOCRのAPI で、既に請求書のPDFファイルから請求処理に関連するテキストが取得された状態で、GoogleOCRのAPIで“Text”として読み取られたテキストデータ(改行キーで区切られた文字列の集合)が順番に1列に並んでいる状態です。

下に切れ切れで恐縮ですが、実際に今回のプログラムでchatGPTのAPIの個所についてご説明します。使用言語はpythonです。

私が最も驚いたのが、最後に示したJSON形式の配列functionへのchatGPTからセットされる値です。このような「欲しいデータの入れ物」を用意するだけで、chatGPTが必要なデータを返してくれ、そのデータを取得するためのロジックは書かなくていいのです。

これ本当にすごいと思いました。

from openai import OpenAI
import openai
# 必要なライブラリをインポートします。
 
client = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY'])
# OpenAIに認証を行います。'OPENAI_API_KEY'は、OpenAIのAPIを使用するために必要なプリペイド登録を通じて取得するAPIキーです。ここでは、初期化されたOpenAIクラスのインスタンスを変数clientに格納します。このclientを通じてAPI操作を行います。
 
function_info = functions_mapping['請求書']
 
functions_mapping = {
    "請求書": functions[0],
    "領収書": functions[1]
    # 他のキーワードと関数のマッピングも追加可能です。
}
 
response = client.chat.completions.create(
    model="gpt-4",
    messages=messages,
    max_tokens=2048,
    temperature=0,
    function_call={"name": function_info["name"]},
    functions=[function_info]
)
# ここで、APIに対するリクエストを送信します。
# `model="gpt-4"`: 使用するモデルを指定します。
# `messages=messages`: Google OCRで取得した文字列の配列を指定します。
# `max_tokens=2048`: 生成するテキストの最大トークン数を指定します。
#(色々試してこの値になりました。小さいとよく異常終了します。)
# `temperature=0`: テキスト生成時のランダム性の度合いを0に設定します。
#すいません。この値あまり良く理解できていません。
# `function_call={"name": function_info["name"]}`: 指定された関数を呼び出します。
 
if hasattr(response.choices[0].message, 'function_call'):
    arguments_str = response.choices[0].message.function_call.arguments
# 応答が特定の関数呼び出しに関連する情報を含むかどうかを確認します。
 
# 以下にfunctions APIの構造を示します。
functions = [
    {
        "name": "get_invoice_information",
        "description": "請求書情報の抽出。OCRで得られたテキストから、請求日、請求番号、請求先、請求品目、総額、銀行情報、住所、会社名、連絡先を抽出します。",
        "parameters": {
            "type": "object",
      "properties": {
            "invoice_date": { 
             "type": "string", 
             "description": "請求日" },
            },
                # パラメータの詳細(請求書から取り出したい情報)
            },
            "required": ["invoice_date"]
        }
    }
]

Follow me!