AzureOpenAiを使った新旧対比表の作成

2024/04/28

AI 開発試行

AzureOpenAiを使った新旧対比表の作成について、まとめてみました。
社内文書は新旧対比表を作成して説明していることが少なくありません。情報漏洩防止の観点から社内向けGPTを利用する際にはこんな感じで作れるという試行になります。


AzureOpenAiの基本

AzureOpenAiとは

Azure OpenAI Serviceは、Microsoft Azureのクラウドプラットフォーム上で提供される、OpenAI社の人工知能(AI)サービスです。OpenAI社が開発したGPT-4やChatGPTなど、自然言語処理モデルを使用できます1。Azure OpenAI Serviceは、ビジネスのあらゆる側面を効果的にサポートする革新的なサービスであり、高度な言語モデルをREST APIとして利用できます。

AzureOpenAiを利用するには

Azure上でサービスを構成するところから始めますが、以下のサイトが参考になります。非常にわかりやすいです。


Pythonでの実装方法

GoogleColabo上でライブラリをインストールし、処理を実行していきます。

pipでインストール


  import os
  import sys
  from openai import AzureOpenAI
  from docx import Document
  import PyPDF2
  import fitz  # PyMuPDF
  from google.colab import userdata
  

Azure OpenAI ServiceのAPIキーを環境変数から設定


  client = AzureOpenAI(
    azure_endpoint = os.environ["OPENAI_API_BASE"],
    api_key=os.environ["OPENAI_API_KEY"],
    api_version=os.environ["OPENAI_API_VERSION"]
  )
    

ファイルの読み込み関数の定義


  def read_docx(file_path):
      doc = Document(file_path)
      full_text = []
      for para in doc.paragraphs:
          full_text.append(para.text)
      return "\n".join(full_text)

  def read_pdf(file_path):
      pdf_document = fitz.open(file_path)
      full_text = ""
      for page_num in range(pdf_document.page_count):
          page = pdf_document.load_page(page_num)
          full_text += page.get_text("text")
      return full_text

  # def ファイルよりテキスト抽出する
  def create_doctext(file_path,docname):
      if file_path.endswith(".docx"):
          text = read_docx(file_path)
      elif file_path.endswith(".pdf"):
          text = read_pdf(file_path)
      else:
          raise ValueError("Unsupported file format. Please provide a .docx or .pdf file.")
      return f"\n### {docname} \n {text} \n"

  # def Azure OpenAI Serviceのモデル定義
  def generate_response(messages):
      response = client.chat.completions.create(
          model="", # model = "deployment_name"
          messages = messages,
          temperature=0.7,
          max_tokens=4096,
          top_p=0.95,
          frequency_penalty=0,
          presence_penalty=0,
          stop=None
      )
      return response
  

事前準備

ファイル 入力

  
  file_path1="old.docx"
  file_path2="new.docx"

  doc = ""
  if file_path1 != "" :
      doc += create_doctext(file_path1,"ファイル1")
  if file_path2 != "" :
      doc += create_doctext(file_path2,"ファイル2")
  

プロンプト 入力

  
  messages = [
      {"role": "system", "content": "You are a helpful assistant in Japanese."}
  ]
  user_input = """入力ファイル1と2の違いについて、対比表を作成してください。
                  文章の相違箇所を並べて出力してください。
                  単語の相違箇所も出力してください。
                  対比した中で、存在しない場合は、「対象なし」と表示してください。
                  出力はHTMLとしてください。\n"""

  if doc == "":
      user_message = {"role": "user", "content": f"{user_input}"}
  else:
      user_message = {"role": "user", "content": f"{user_input} \n {doc} \n "}

  print(f"{user_input} \"\"\" {doc} \"\"\"")
  

GPT 呼び出し

  
  # GPT 呼び出し
  messages.append(user_message)
  response = generate_response(messages)
  
  # 回答を表示
  from IPython.display import HTML
  HTML(response.choices[0].message.content)  
  

結果としては以下の通りになります。


まとめ

非常に簡単に作成できますね。今回利用したプロンプトはBingChatなどでも利用できますので、ご活用ください。

QooQ