クエリベースのドキュメント概要作成

このガイドでは、Azure OpenAI GPT-3 モデルを使用して、ドキュメント概要作成の実行方法について説明します。 ドキュメント概要作成プロセスに関連する概念、プロセスへのアプローチ、特定のユース ケースに使用するモデルに関する推奨事項について説明します。 最後に、主要な概念を理解するのに役立つ 2 つのユース ケースとサンプル コード スニペットを示します。

アーキテクチャ

次の図は、ユーザー クエリが関連するデータをフェッチする方法を示しています。 サマライザーでは、GPT-3 を使用して、最も関連性の高いドキュメントのテキスト概要を生成します。 このアーキテクチャでは、GPT-3 エンドポイントを使用してテキストを要約します。

ユーザー検索と、GPT-3 を使用する概要プロセスを示した図。

このアーキテクチャの PowerPoint ファイル をダウンロードします。

ワークフロー

このワークフローは、ほぼリアルタイムで発生します。

  1. ユーザーがクエリを送信します。 たとえば、製造会社の従業員は、会社のポータルでマシン パーツに関する特定の情報を検索します。 クエリは、まず、 会話言語理解などの意図認識エンジンによって処理されます。 ユーザー クエリの関連エンティティまたは概念は、オフラインで入力されたナレッジ ベース (この場合は会社のナレッジ ベース データベース) からドキュメントのサブセットを選択して表示するために使用されます。 出力は Azure Elastic Search などの検索および分析エンジンに送られ、ここで、関連するドキュメントがフィルター処理され、数千または数万ではなく数百のドキュメント セットが返されます。
  2. ユーザー クエリは、 Azure Cognitive Search などの検索エンドポイントに再度適用され、取得されたドキュメント セットを関連性の順にランク付けします (ページのランク付け)。 最高ランクのドキュメントが選択されます。
  3. 関連性のある文について、選択したドキュメントがスキャンされます。 このスキャン プロセスでは、ユーザー クエリを含むすべての文の抽出などの粗い方法か、GPT-3 の埋め込みなどのより高度な方法のどちらかを使用して、意味的に類似したデータをドキュメント内で検索します。
  4. 関連するテキストが抽出されると、GPT-3 Completions エンドポイントとサマライザーによって、抽出されたコンテンツが要約されます。 この例では、従業員がクエリで指定したパーツに関する重要な詳細の概要が返されます。

この記事では、アーキテクチャのサマライザー コンポーネントに焦点を当てています。

シナリオの詳細

企業は、ビジネス プロセス、顧客、製品、情報に関するナレッジ ベースを頻繁に作成して維持します。 ただし、大規模なデータセットのユーザー クエリに基づいて関連するコンテンツを返すことは、多くの場合、困難です。 ユーザーは、ページ ランクなどのメソッドを使用して、ナレッジ ベースに対してクエリを実行し、該当するドキュメントを見つけますが、ドキュメントをさらに詳しく調べて関連情報を検索する作業は、通常時間がかかる手動タスクになります。 ただし、OpenAI が開発したものなどの基盤トランスフォーマー モデルの最近の進歩に伴い、クエリ メカニズムは、埋め込みなどのエンコード情報を使用して関連情報を検索するセマンティック検索メソッドによって改良されています。 これらの開発により、コンテンツを要約し、簡潔で簡明な方法でユーザーに提示することができます。

"ドキュメント要約" とは、重要な情報要素とコンテンツ値を維持しながら、大量のデータから概要を作成するプロセスです。 この記事では、特定のユース ケースに対して、 Azure OpenAI Service GPT-3 機能を使用する方法について説明します。 GPT-3 は、言語翻訳、チャットボット、テキスト要約、コンテンツ作成など、さまざまな自然言語処理タスクに使用できる強力なツールです。 ここで説明する方法とアーキテクチャはカスタマイズ可能であり、多くのデータセットに適用できます。

考えられるユース ケース

ドキュメント概要作成は、ユーザーが大量の参照データを検索し、関連情報を簡潔に記述する概要を生成する必要がある組織ドメインに適用されます。 一般的なドメインには、法律、財務、ニュース、医療、学術組織が含まれます。 概要作成の可能性のあるユース ケースは次のとおりです。

  • ニュースや財務レポートなどの主要な分析情報を強調表示するための概要の生成。
  • 法的手続きでの弁論などをサポートするためのクイック参照の作成。
  • 学術的設定における論文の論題の文脈の提供。
  • 文献のレビューの作成。
  • 文献目録への注釈付け。

任意のユース ケースに対して概要作成サービスを使用する利点は次のとおりです。

  • 読み取り時間を短縮する。
  • 大量の異なるデータの検索をより効率的にする。
  • 人間の概要作成手法による偏見の可能性を低減する。 (この利点は、トレーニング データの公平さによって異なります)。
  • 従業員とユーザーがより詳細な分析に集中できるようにする。

コンテキスト内学習

Azure OpenAI Service では、生成的入力候補モデルが使用されます。 このモデルでは、自然言語命令を使用して、要求されたタスクと必要なスキルを識別します ("プロンプト エンジニアリング" と呼ばれるプロセス)。 この方法を使用する場合、プロンプトの最初の部分には、自然言語の指示や、必要なタスクの例が含まれます。 モデルでは、最も可能性の高い次のテキストを予測して、タスクを完了します。 この手法は、"コンテキスト内学習" と呼ばれます。

言語モデルでは、コンテキスト内学習を使用して、わずか数例からタスクを学習できます。 言語モデルには、タスクを示す入力と出力のペアの一覧を含んだプロンプトと、テスト入力が用意されています。 このモデルでは、プロンプトで条件を設定し、次のトークンを予想して予測を行います。

コンテキスト内学習にアプローチするには、主に "ゼロショット学習"、"少数ショット学習"、"微調整" という、出力を変更し改善する 3 つの方法があります。 これらのアプローチは、モデルに与えられるタスク固有のデータの量によって異なります。

ゼロショット: このアプローチでは、モデルに例は提供されません。 タスク要求のみが、入力として提供されます。 ゼロショット学習では、モデルは以前にトレーニングされた概念によって決まります。 トレーニングで使用されたデータのみに基づいて応答します。 セマンティックの意味を必ずしも理解しているわけではなく、次に生成する必要がある対象についてインターネットから学習したすべての内容に基づいて統計的に理解しています。 モデルでは、既に学習した既存のカテゴリに特定のタスクを関連付け、それに応じて応答しようとします。

少数ショット: このアプローチでは、期待される応答形式と内容を示すいくつかの例が通話プロンプトに含まれます。 このモデルには、予測を導くための非常に小さなトレーニング データセットが用意されています。 少数の例を使用したトレーニングでは、モデルを一般化し、関連性はないが以前には気付かれなかったタスクを理解できます。 少数ショットの例の作成は、モデルで実行するタスクを正確に表現する必要があるため、困難な場合があります。 よく見られる問題の 1 つは、トレーニング例で使用される書き方に対し、モデル (特に小規模なモデル) が敏感になるということです。

微調整: 微調整は、独自のデータセットに合わせてモデルを調整するプロセスです。 このカスタマイズ手順では、次のようにしてプロセスを改善できます。

  • より大きなデータ セット (少なくとも 500 個の例) を含める。
  • 従来の最適化手法と逆伝搬法を使用してモデルの重みを再調整する。 これらの手法を使用すると、ゼロショットまたは少数ショットのアプローチ単独でもたらされるよりも高品質の結果が得られます。
  • 特定のプロンプトと特定の構造を使用してモデルの重みをトレーニングすることで、少数ショット アプローチを改善する。 この手法を使用すると、プロンプトで例を示さずに、より多くのタスクでより良い結果を得られます。 結果として、送信されるテキストが減り、トークンが減ります。

GPT-3 ソリューションを作成する場合、主な作業はトレーニング プロンプトの設計と内容になります。

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

"プロンプト エンジニアリング" は、望ましい出力や有用な出力を生成する入力の把握を含んだ、自然言語処理の訓練法です。 ユーザーがシステムに "プロンプトで指示" すると、コンテンツの表現方法により、出力が大幅に変わることがあります。 "プロンプト デザイン" は、コンテキストに応じた望ましい応答が GPT-3 モデルによってもたらされるようにするための最も重要なプロセスです。

この記事で説明するアーキテクチャでは、概要作成の入力候補エンドポイントを使用します。 入力候補エンドポイントは、 部分的なプロンプトまたはコンテキストを入力として受け入れ、入力テキストを継続または補完する1つ以上の出力を返す Azure AI サービス API です。 ユーザーが入力テキストをプロンプトとして提供すると、提供されたコンテキストまたはパターンと照合を試みるテキストがモデルによって生成されます。 プロンプト デザインは、タスクとデータに大きく依存します。 運用環境でシステムを使用する前に、プロンプト エンジニアリングを微調整データセットに組み込んで最適なものを調べるには、かなりの時間と労力が必要になります。

プロンプト デザイン

GPT-3 モデルでは複数のタスクを実行できるため、設計の目標をはっきりさせる必要があります。 モデルでは、提供されたプロンプトに基づいて目的の出力を見積もります。

たとえば、「猫の品種のリストを見せてください」という語を入力しても、猫の品種のリストが求められているとモデルが自動で考えることはありません。 最初の語が「猫の品種のリストを見せてください」で、次の語が「そうすれば、どれを好きか教えます」という会話を続けるようにモデルに求めることができます。猫のリストが必要なだけだとモデルが考えているのであれば、コンテンツの作成や分類などのタスクは得意でなくなります。

テキストを生成または操作する方法について学習する」で説明されているように、プロンプトを作成するための 3 つの基本的なガイドラインがあります。

  • ショー アンド テル。 命令、例、または 2 つを組み合わせて提供することで、何を求めているかをさらに明確にします。 モデルが項目のリストをアルファベット順にランク付けしたり、段落をセンチメント別に分類したりすることを求める場合は、必要な内容をモデルに示します。
  • 高品質なデータを提供します。 分類子を構築している場合や、モデルをパターンに従わせる必要がある場合は、必ず十分な例を提供してください。 また、例を校正する必要があります。 通常、このモデルでは、スペル ミスを認識して応答を返すことができますが、スペル ミスが意図的であると想定する場合があり、応答に影響を与える可能性があります。
  • 設定を確認します。 temperaturetop_p の設定は、モデルがどの程度確定的に応答を生成するかを制御します。 正解が 1 つしかない応答を要求する場合は、これらの設定を低いレベルで構成します。 より多様な応答を求める場合は、より高いレベルで設定を構成できます。 一般的な間違いは、これらの設定が "賢さ" や "創造性" のコントロールであると想定することです。

代替

Azure の会話言語理解 は、ここで使用するサマライザーの代替手段になります。 会話言語理解の主な目的は、受信した発話の全体的意図を予測し、そこから貴重な情報を抽出し、トピックに合った応答を生成するモデルを構築することです。 これは、チャットボット アプリケーションで、既存のナレッジ ベースを参照し、受信した発話に最も適した提案を見つけることができる場合に役立ちます。 入力テキストで応答が必要ない場合は、あまり役に立ちません。 このアーキテクチャの意図は、長いテキスト コンテンツの短い概要を生成することです。 コンテンツの骨子は簡潔な方法で記述され、すべての重要な情報が表されます。

シナリオの例

このユース ケースでは、議会を通過した一連の法案がまとめられています。 概要は、人間が生成した概要 ("グランド トゥルース" の概要と呼ばれます) に近づくように微調整されています。

ゼロショット プロンプト エンジニアリングは、法案の概要作成に使用されます。 続いて別の概要出力を生成するためにプロンプトと設定が変更されます。

データセット

最初のデータセットは、米国議会およびカリフォルニア州法案の概要作成用 BillSum データセットです。 この例では、議会法案のみを使用します。 データは、トレーニング用に 18,949 件の法案と、テスト用に 3,269 件の法案に分割されます。 BillSum は、長さ 5,000 文字から 20,000 文字の中編の法案を対象としています。 これはクリーニングされ、前処理されます。

データセットの詳細とダウンロード手順については、GitHub の「FiscalNote/BillSum」を参照してください。

BillSum スキーマ

BillSum データセットのスキーマには、次のものが含まれます。

  • bill_id. 法案の識別子。
  • text. 法案のテキスト。
  • summary. 法案の人が作成した概要。
  • title. 法案の表題。
  • text_len. 法案の文字長。
  • sum_len. 法案概要の文字長。

このユース ケースでは、 text 要素と summary 要素が使用されます。

ゼロショット

ここでの目標は、会話スタイルの入力を学習するように GPT-3 モデルを教えることです。 入力候補エンドポイントは、Azure OpenAI API と、法案の最適な概要を生成するプロンプトを作成するために使用されます。 関連情報を抽出するように、プロンプトを慎重に作成することが重要です。 特定の法案から一般的な概要を抽出するには、次の形式が使用されます。

  • プレフィックス: 実行させる内容。
  • コンテキストの基本: コンテキスト。
  • コンテキスト: 応答を提供するために必要な情報。 この場合は、要約するテキスト。
  • サフィックス: 回答の目的の形式。 たとえば、回答、入力候補、概要などです。
API_KEY = # SET YOUR OWN API KEY HERE
RESOURCE_ENDPOINT = " -- # SET A LINK TO YOUR RESOURCE ENDPOINT -- "

openai.api_type = "azure"
openai.api_key = API_KEY
openai.api_base = RESOURCE_ENDPOINT
openai.api_version = "2022-12-01-preview"
prompt_i = 'Summarize the legislative bill given the title and the text.\n\nTitle:\n'+" ".join([normalize_text(bill_title_1)])+ '\n\nText:\n'+ " ".join([normalize_text(bill_text_1)])+'\n\nSummary:\n'
response = openai.Completion.create(
    engine=TEXT_DAVINCI_001
    prompt=prompt_i,
    temperature=0.4,
    max_tokens=500,
    top_p=1.0,
    frequency_penalty=0.5,
    presence_penalty=0.5,
    stop=['\n\n###\n\n'], # The ending token used during inference. Once it reaches this token, GPT-3 knows the completion is over.
    best_of=1
    )
 = 1

グランド トゥルース: 2007 年の国家科学教育の企業税制優遇措置法 - 小中学校への資産またはサービスの寄贈と、科学、技術、工学、または数学における指導を促進するための教員訓練に対する一般事業税控除を認めるように内国歳入法を修正しました。

ゼロショット モデルの概要: 2007 年の国家科学教育の企業税制優遇措置法は、小中学校レベルでの科学、技術、工学、数学 (STEM) 教育に貢献した企業に対して新しい税控除を行います。 この控除は、課税年度の納税者の STEM への適格な貢献の全額に相当します。 STEM への適格な貢献には、STEM 学校への寄贈物、STEM 教員学外研修費、STEM 教員訓練費が含まれます。

観測: ゼロショット モデルでは、ドキュメントの一般化された簡潔な概要が生成されます。 これは、人が作成したグランド トゥルースに似ており、同じ重要なポイントをキャプチャしています。 これは、人が作成した概要のようにまとめられ、引き続きポイントに焦点が当てられます。

微調整

微調整では、プロンプトに含められる数より多くの例でトレーニングすることにより、ゼロショット学習を改良するので、より多くのタスクでより良い結果を得ることができます。 モデルを微調整した後、プロンプトで例を提供する必要はありません。 微調整では、必要なトークンの数を減らすことでコストが削減され、待機時間の短い要求が可能になります。

大まかには、微調整には以下の手順が含まれます。

  • トレーニング データを準備してアップロードする。
  • 新しい微調整モデルをトレーニングする。
  • 微調整モデルを使用する。

詳細については、 Azure OpenAI Service のモデルをカスタマイズする方法に関するページを参照してください。

微調整用にデータを準備する

この手順では、微調整に使用されるプロンプトにプロンプト エンジニアリングを組み込むことで、ゼロショット モデルを改善できます。 これを行うと、プロンプトと入力候補のペアにアプローチする方法について、モデルに指示を与えるのに役立ちます。 微調整モデルでは、プロンプトによって、モデルが学習し、予測を行うために使用できる開始点が提供されます。 このプロセスにより、モデルはデータの基本的な理解から始めることができます。この理解は、モデルがより多くのデータで試されるにつれて、徐々に改善できます。 さらに、プロンプトは、モデルがそれ以外では見落としてしまう可能性のあるデータ内のパターンを識別する場合に役立ちます。

推論中にも同じプロンプト エンジニアリング構造が使用されるため、モデルのトレーニングが完了した後、モデルはトレーニング中に学習した動作を認識し、指示に従って入力候補を生成できます。

#Adding variables used to design prompts consistently across all examples
#You can learn more here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/prepare-dataset

LINE_SEP = " \n "
PROMPT_END = " [end] "
#Injecting the zero-shot prompt into the fine-tune dataset
def stage_examples(proc_df):
    proc_df['prompt'] = proc_df.apply(lambda x:"Summarize the legislative bill. Do not make up facts.\n\nText:\n"+" ".join([normalize_text(x['prompt'])])+'\n\nSummary:', axis=1)
    proc_df['completion'] = proc_df.apply(lambda x:" "+normalize_text(x['completion'])+PROMPT_END, axis=1)

    return proc_df

df_staged_full_train = stage_examples(df_prompt_completion_train)
df_staged_full_val = stage_examples(df_prompt_completion_val)

適切な形式で微調整できるようにデータがステージングされたので、微調整コマンドの実行を開始できます。

次に、OpenAI CLI を使用して、データ準備手順の一部を支援できます。 OpenAI ツールは、データの検証、提案の提示、データの再フォーマットを行います。

openai tools fine_tunes.prepare_data -f data/billsum_v4_1/prompt_completion_staged_train.csv

openai tools fine_tunes.prepare_data -f data/billsum_v4_1/prompt_completion_staged_val.csv
データセットを微調整する
payload = {
  "model": "curie",
  "training_file": " -- INSERT TRAINING FILE ID -- ",
  "validation_file": "-- INSERT VALIDATION FILE ID --",
  "hyperparams": {
  "n_epochs": 1,
  "batch_size": 200,
  "learning_rate_multiplier": 0.1,
  "prompt_loss_weight": 0.0001    
  }
}

url = RESOURCE_ENDPOINT + "openai/fine-tunes?api-version=2022-12-01-preview"
r = requests.post(url, 
    headers={
    "api-key": API_KEY,
    "Content-Type": "application/json"
    },
    json = payload
)
data = r.json()
print(data)
fine_tune_id = data['id']
print('Endpoint Called: {endpoint}'.format(endpoint = url))
print('Status Code: {status}'.format(status= r.status_code))
print('Fine tuning job ID: {id}'.format(id=fine_tune_id))
print('Response Information \n\n {text}'.format(text=r.text))
微調整モデルを評価する

このセクションでは、微調整モデルを評価する方法について説明します。

#Run this cell to check status
url = RESOURCE_ENDPOINT + "openai/fine-tunes/<--insert fine-tune id-->?api-version=2022-12-01-preview"
r = requests.get(url, 
    headers={
    "api-key": API_KEY,
    "Content-Type": "application/json"
    }
)

data = r.json()
print('Endpoint Called: {endpoint}'.format(endpoint = url))
print('Status Code: {status}'.format(status= r.status_code))
print('Fine tuning ID: {id}'.format(id=fine_tune_id))
print('Status: {status}'.format(status = data['status'])) 
print('Response Information \n\n {text}'.format(text=r.text))

グランド トゥルース: 2007 年の国家科学教育の企業税制優遇措置法 - 小中学校への資産またはサービスの寄贈と、科学、技術、工学、または数学における指導を促進するための教員訓練に対する一般事業税控除を認めるように内国歳入法を修正しました。

微調整モデルの概要: この法案では、科学、技術、工学、数学の教育に役立つ小中学校への貢献に対する税額控除ももたらされます。 この控除は、課税年度中に納税者が行った STEM への適格な貢献の全額に相当します。 STEM への適格な貢献には、(1) STEM 学校への寄贈物、(2) STEM 教員学外研修費、(3) STEM 教員訓練費が含まれます。 この法案では、科学、技術、工学、数学の教育に役立つ小中学校への貢献に対する税額控除ももたらします。 この控除は、課税年度中に納税者が行った適格な STEM サービスへの貢献の全額に相当します。 STEM サービスへの適格な貢献には、(1) 米国内で、または米国外の軍事基地で提供されたサービスに対して課税年度中に支払ったり被ったりした STEM サービスへの貢献、(2) 科学、技術、工学、または数学における K-12 グレードの教育を提供するための、米国内に、または米国外の軍事基地に所在する教育機関で使用される、課税年度中に寄贈された STEM 資産目録が含まれます。

観測: 全体的に、微調整モデルでは法案が適切に要約されています。 ここでは、領域固有の専門用語と、人が作成したグランド トゥルースでは表現されているが説明されていない重要なポイントが捉えられています。 より詳細で包括的な概要を提供するという点で、ゼロショット モデルと区別されます。

ユース ケース: 財務レポート

このユース ケースでは、ゼロショット プロンプト エンジニアリングを使用して、財務レポートの概要を作成します。 その後、複数概要の概要アプローチを使用して、結果を生成します。

複数概要の概要アプローチ

プロンプトを記述する場合、GPT-3 では、プロンプトと結果の入力候補全体でトークンを 4,000 個未満にする必要があるので、概要テキストは数ページに制限されます。 通常、4,000 個を超えるトークン (約 3,000 語) を含むドキュメントの場合、"複数概要の概要" アプローチを使用できます。 このアプローチを使用すると、最初に、トークンの制約を満たすために、テキスト全体が分割されます。 その後、短いテキストの概要が派生されます。 次の手順で、複数概要の概要が作成されます。 このユース ケースでは、ゼロショット モデルを使用した複数概要の概要アプローチを示します。 このソリューションは、長いドキュメントの場合に役立ちます。 さらに、このセクションでは、さまざまなプロンプト エンジニアリング方法により結果がどのように変化するかを説明します。

注意

財務ユース ケースでは、微調整の手順を完了するのに十分なデータがないため、微調整は適用されません。

データセット

このユース ケースのデータセットは人為的なものであり、会社の業績を評価するための主要な定量的メトリックが含まれています。

財務データセットには、次のものが含まれます。

  • url: 財務レポートの URL。
  • pages: 要約する主要情報を含むレポート内のページ (1 インデックス付き)。
  • completion: レポートのグランド トゥルース概要。
  • comments: 必要な追加情報。

このユース ケースでは、データセットからの Rathbones の財務レポートが要約されます。 Rathbones 社は、個人クライアント向けの個人投資および資産管理会社です。 このレポートでは、2020 年の Rathbone の業績が強調され、利益、FUMA、収入などの業績メトリックが記されています。 要約する重要な情報は、PDF の 1 ページにあります。

API_KEY = # SET YOUR OWN API KEY HERE
RESOURCE_ENDPOINT = "# SET A LINK TO YOUR RESOURCE ENDPOINT"

openai.api_type = "azure"
openai.api_key = API_KEY
openai.api_base = RESOURCE_ENDPOINT
openai.api_version = "2022-12-01-preview"
name = os.path.abspath(os.path.join(os.getcwd(), '---INSERT PATH OF LOCALLY DOWNLOADED RATHBONES_2020_PRELIM_RESULTS---')).replace('\\', '/')

pages_to_summarize = [0]
# Using pdfminer.six to extract the text 
# !pip install pdfminer.six
from pdfminer.high_level import extract_text
t = extract_text(name
, page_numbers=pages_to_summarize
)
print("Text extracted from " + name)
t
ゼロショット アプローチ

ゼロショット アプローチを使用する場合、解決済みの例は提供しません。 コマンドと未解決の入力のみを提供します。 この例では、Instruct モデルが使用されています。 このモデルは特に、命令を受け取り、追加のコンテキストなしでそれに対する回答を記録することを目的としており、このことはゼロショット アプローチに最適です。

テキストを抽出した後、さまざまなプロンプトを使用して、概要の品質に与える影響を確認できます。

#Using the text from the Rathbone's report, you can try different prompts to see how they affect the summary

prompt_i = 'Summarize the key financial information in the report using qualitative metrics.\n\nText:\n'+" ".join([normalize_text(t)])+'\n\nKey metrics:\n'

response = openai.Completion.create(
        engine="davinci-instruct",
        prompt=prompt_i,
        temperature=0,
        max_tokens=2048-int(len(prompt_i.split())*1.5),
        top_p=1.0,
        frequency_penalty=0.5,
        presence_penalty=0.5,
        best_of=1
    )
print(response.choices[0].text)
>>>
- Funds under management and administration (FUMA) reached £54.7 billion at 31 December 2020, up 8.5% from £50.4 billion at 31 December 2019
- Operating income totalled £366.1 million, 5.2% ahead of the prior year (2019: £348.1 million)
- Underlying1 profit before tax totalled £92.5 million, an increase of 4.3% (2019: £88.7 million); underlying operating margin of 25.3% (2019: 25.5%)

# Different prompt

prompt_i = 'Extract most significant money related values of financial performance of the business like revenue, profit, etc. from the below text in about two hundred words.\n\nText:\n'+" ".join([normalize_text(t)])+'\n\nKey metrics:\n'

response = openai.Completion.create(
        engine="davinci-instruct",
        prompt=prompt_i,
        temperature=0,
        max_tokens=2048-int(len(prompt_i.split())*1.5),
        top_p=1.0,
        frequency_penalty=0.5,
        presence_penalty=0.5,
        best_of=1
    )
print(response.choices[0].text)
>>>
- Funds under management and administration (FUMA) grew by 8.5% to reach £54.7 billion at 31 December 2020
- Underlying profit before tax increased by 4.3% to £92.5 million, delivering an underlying operating margin of 25.3%
- The board is announcing a final 2020 dividend of 47 pence per share, which brings the total dividend to 72 pence per share, an increase of 2.9% over 2019
課題
  • ご覧のように、モデルによって、元のテキストに記載されていないメトリックが生成される場合があります。

    提案されたソリューション: プロンプトを変更することで、この問題を解決できます。

  • 概要は、記事の 1 つのセクションに焦点を当て、他の重要な情報を無視する可能性があります。

    提案されたソリューション: 複数概要の概要アプローチを試すことができます。 レポートをセクションに分割し、小さな概要を作成し、続いてそれを要約して、出力の概要を作成できます。

このコードでは、提案されたソリューションを実装します。

# Body of function

from pdfminer.high_level import extract_text

text = extract_text(name
, page_numbers=pages_to_summarize
)

r = splitter(200, text)

tok_l = int(2000/len(r))
tok_l_w = num2words(tok_l)

res_lis = []
# Stage 1: Summaries
for i in range(len(r)):
    prompt_i = f'Extract and summarize the key financial numbers and percentages mentioned in the Text in less than {tok_l_w} 
words.\n\nText:\n'+normalize_text(r[i])+'\n\nSummary in one paragraph:'

    response = openai.Completion.create(
        engine=TEXT_DAVINCI_001,
        prompt=prompt_i,
        temperature=0,
        max_tokens=tok_l,
        top_p=1.0,
        frequency_penalty=0.5,
        presence_penalty=0.5,
        best_of=1
    )
    t = trim_incomplete(response.choices[0].text)
    res_lis.append(t)

# Stage 2: Summary of summaries
prompt_i = 'Summarize the financial performance of the business like revenue, profit, etc. in less than one hundred words. Do not make up values that are not mentioned in the Text.\n\nText:\n'+" ".join([normalize_text(res) for res in res_lis])+'\n\nSummary:\n'

response = openai.Completion.create(
        engine=TEXT_DAVINCI_001,
        prompt=prompt_i,
        temperature=0,
        max_tokens=200,
        top_p=1.0,
        frequency_penalty=0.5,
        presence_penalty=0.5,
        best_of=1
)

print(trim_incomplete(response.choices[0].text))

入力プロンプトには、特定の年の Rathbones 社の財務レポートの元のテキストが含まれます。

グランド トゥルース: Rathbones 社は、2020 年の収益が 3 億 6,610 万ポンドで 2019 年の 3 億 4,810 万ポンドから増加しており、税引き前の営業利益が 8,870 万ポンドから 9,250 万ポンドに増加したと報告しました。 運用資産は 504 億ポンドから 547 億ポンドに 8.5% 上昇し、資産管理における資産は 4.4% 増の 449 億ポンドになりました。 2020 年の純流入は、前年の 6 億ポンドと比較して 21 億ポンドでしたが、主にファンド事業への 15 億ポンドの流入と、Barclays Wealth からの資産移転による 4 億ポンドによるものでした。

複数概要のゼロショット概要の出力: Rathbones 社は、2020 年に大きな業績を達成し、Funds under Management and Administration (FUMA) は 8.5% 成長し、年度末に 547 億 ポンドに達しました。 税引前利益は 4.3% 増えて 9,250 万ポンドとなり、基礎となる営業利益率は 25.3% となりました。 グループ全体の純流入総額は 21 億ポンドで、4.2% の成長率を示しました。 税引前利益は4,380万ポンドで、1株当たり基本利益は49.6ペンスでした。 通期の営業利益は前年比5.2%増の3億6,610万ポンドでした。

観測: 複数概要の概要アプローチでは、より詳細で包括的な概要が提供された場合、最初に発生した課題を解決する優れた結果セットが生成されます。 これは、領域固有の専門用語と、グランド トゥルースで表されているが、十分には説明されていない重要なポイントを捉えるという役割をしっかり果たしています。

ゼロショット モデルは、主流のドキュメントを要約する場合に適しています。 データが業界固有またはトピック固有のものであったり、業界固有の専門用語が含まれていたり、業界固有の知識を必要としたりする場合は、微調整が最適です。 たとえば、このアプローチは、医学雑誌、法令書式、財務諸表に適しています。 ゼロショットではなく、少数ショット アプローチを使用して、概要の作成方法の例をモデルに提供することができるので、提供された概要を模倣できるようになります。 ゼロショット アプローチの場合、このソリューションではモデルは再トレーニングされません。 モデルの知識は GPT-3 トレーニングに基づいています。 GPT-3 は、インターネットから入手できるほぼすべてのデータを使用してトレーニングされています。 これは、特定の知識を必要としないタスクにはうまくいきます。

推奨事項

GPT-3 を使用して概要作成に取り組むには、ゼロショット、少数ショット、微調整などのさまざまな方法があります。 これらのアプローチでは、品質の異なる概要が生成されます。 目的のユース ケースに対して最適な結果を生成する方法を調べることができます。

この記事で示されたテストでの関する観測に基づいて、いくつかの推奨事項を次に示します。

  • ゼロショット は、特定領域の知識を必要としない主流のドキュメントに最適です。 このアプローチでは、人間のような簡潔な方法ですべての大まかな情報を捉えようとし、高品質のベースラインの概要を提供します。 ゼロショットでは、この記事のテストで使用される法的データセットの高品質な概要が作成されます。
  • テキスト例が提供されるとトークンの制限を超えるので、長いドキュメントの要約に少数ショット を使用することは困難です。 代わりに、長いドキュメントには、複数概要のゼロショット概要アプローチを使用するか、データセットを増やして微調整を成功させることができます。 複数概要の概要アプローチでは、これらのテストで使用される財務データセットに対して優れた結果が生成されます。
  • 微調整 は、情報をすぐに入手できない場合に、技術的または領域固有のユース ケースに最も役立ちます。 このアプローチで最適な結果を得るには、数千のサンプルを含むデータセットが必要です。 微調整では、いくつかのテンプレート化された方法で概要がキャプチャされ、データセットで概要を表す方法に準拠しようとします。 法的データセットの場合、このアプローチでは、ゼロショット アプローチによって作成される概要よりも品質の高いものが生成されます。

概要作成の評価

概要作成モデルのパフォーマンスを評価する複数の手法があります。

いくつかの例を次に示します。

ROUGE (Recall-Oriented Understudy for Gisting Evaluation)。 この手法には、人が作成した理想的な概要と比較して、概要の品質を自動的に判別する尺度が含まれます。 この尺度では、評価対象のコンピューター生成の概要と理想的な概要との間で重複する単位 (n-gram、ワード シーケンス、ワード ペアなど) の数をカウントします。

次に例を示します。

reference_summary = "The cat ison porch by the tree"
generated_summary = "The cat is by the tree on the porch"
rouge = Rouge()
rouge.get_scores(generated_summary, reference_summary)
[{'rouge-1': {'r':1.0, 'p': 1.0, 'f': 0.999999995},
  'rouge-2': {'r': 0.5714285714285714, 'p': 0.5, 'f': 0.5333333283555556},
  'rouge-1': {'r': 0.75, 'p': 0.75, 'f': 0.749999995}}]

BERTScore。 この手法では、生成された概要と参照の概要をトークン レベルで整合させることで、類似性スコアを計算します。 トークン アラインメントは、BERT からのコンテキスト化されたトークン埋め込みの間のコサイン類似性を最大化するためにしきりに計算されます。

次に例を示します。

import torchmetrics
from torchmetrics.text.bert import BERTScore
preds = "You should have ice cream in the summer"
target = "Ice creams are great when the weather is hot"
bertscore = BERTScore()
score = bertscore(preds, target)
print(score)

類似性マトリックス。 類似性マトリックスは、概要評価における異なるエンティティ間の類似性を表したものです。 これを使用して、同じテキストのさまざまな概要を比較し、その類似性を測定できます。 これは 2 次元グリッドで表され、各セルには 2 つの概要間の類似性の尺度が含まれます。 コサイン類似性、Jaccard 類似性、編集距離などのさまざまな方法を使用して、類似性を測定できます。 次に、マトリックスを使用して概要を比較し、どの概要が、元のテキストを最も正確に表しているかを決定します。

2 つの類似した文の BERTScore 比較の類似性マトリックスを取得するサンプル コマンドを次に示します。

bert-score-show --lang en -r "The cat is on the porch by the tree"
                          -c "The cat is by the tree on the porch"
                          -f out.png

最初の文「猫は木のそばの玄関にいます」は "候補" と呼ばれます。 2 番目の文は、"参照" と呼ばれます。 このコマンドでは、BERTScore を使用して文を比較し、マトリックスを生成します。

次のマトリックスには、前のコマンドによって生成された出力が表示されます。

類似性マトリックスの例を示す図。

詳細については、 SummEval: 概要評価の再評価に関するページを参照してください。 要約のための PyPI ツールキットについては、 Summ-eval 0.892を参照してください。

共同作成者

この記事は、Microsoft によって保守されています。 当初の寄稿者は以下のとおりです。

プリンシパル作成者:

その他の共同作成者:

パブリックでない LinkedIn プロファイルを表示するには、LinkedIn にサインインします。

次の手順