ChatGPTがあなた専属のAIコンサルタントに！膨大な文書でもスマートに要約

https://azure-recipe.kc-cloud.jp/azure_openai_word-pdf/

前回の記事「<a href="https://azure-recipe.kc-cloud.jp/azure_openai_word-pdf/">セキュリティと効率を両立：Azure OpenAI Serviceを活用したWordとPDFレポート要約</a>」では１つのファイルから要約や重要なキーワードを抽出する方法を紹介しました。

<span>この記事では、複数のドキュメントを1つにまとめて要約する方法を紹介します。情報過多の現代社会では、効率的に情報を整理し理解することが重要です。本記事を読むことで、GPT-3.5-turbo/GPT-4を活用した複数ドキュメントの一括要約手法の基本的な使い方や、その実装方法について学び、情報を効率的に整理できるようになります。</span>

<span>複数ドキュメントを効率的に要約するための3つの手法と、セキュリティを考慮したAzure OpenAI Serviceの利用方法を紹介します。</span><span>1つ目は、複数のファイルをループで一度に要約する方法。2つ目は、複数のファイルを1つにまとめて要約する方法。3つ目は、大きすぎるファイルをセクションごとに要約する方法です。これらの手法を学ぶことで、情報を短時間で把握し、迅速な意思決定が可能となります。また、Azure OpenAI Serviceを利用することで、セキュリティ対策を確保しながら情報整理が可能です。</span>
<ol>
 	<li>複数のファイルを個別に要約
1つのフォルダにある全てのファイルを１つづつ要約します。</li>
 	<li>複数のファイルを1つに要約
1つのフォルダにある複数のファイルをまとめて１つのファイルにします。</li>
 	<li>大きい複数のWord/PDFファイルを1つに要約
OpenAIの制限を超えるようなサイズに対する処理をします。</li>
</ol>
&nbsp;

特に2つ目・3つ目の複数ファイルから1つの要約を作ることで以下のようなことが実現できます。
<h2>複数のファイルを使ったGPTの活用法</h2>
<ol>
 	<li><strong>トピックの概要:</strong>
複数の関連文書から主要なトピックやキーワードを抽出し、それらについての概要を提供します。
<ul>
 	<li><strong>文書例</strong>　<span>複数のレポートや記事があり、それらは同じ業界や技術に関連していますが、異なる視点や側面を扱っています。たとえば、AI業界に関する以下のような文書があるとします。
</span>
<ul>
 	<li>AI技術の最新動向に関するレポート</li>
 	<li>AI業界の主要企業と製品の分析</li>
 	<li>AI技術がもたらす社会的影響に関する記事</li>
 	<li>AIの倫理的問題や規制に関する論文</li>
</ul>
<span> </span></li>
 	<li><span></span><strong>プロンプト例</strong>　複数の文書が提供するAI業界に関する情報をまとめて、主要なトピックとキーワードに焦点を当てた概要を提供してください。このプロンプトでは、AI業界に関する情報をまとめ、主要なトピックとキーワードに焦点を当てることを要求しています。このプロンプトを使用して生成された要約では、AI業界の全体像や主要なトピックが抽出され、複数の文書からの情報を効果的に統合できるでしょう。</li>
</ul>
</li>
 	<li><strong>クロスリファレンス:</strong>
複数の文書で共有されている情報や、それぞれの文書が補完し合う情報を明らかにします。
<ul>
 	<li><strong>文書例</strong>　複数の研究論文やレポートがあり、それらは同じ研究分野やプロジェクトに関連していますが、異なる視点や側面を扱っています。たとえば、気候変動に関する以下のような文書があるとします
<ul>
 	<li>温室効果ガスの排出量に関する統計データ</li>
 	<li>再生可能エネルギー技術の最新動向に関するレポート</li>
 	<li>気候変動が農業や生態系に与える影響に関する研究論文</li>
 	<li>国際的な気候変動対策に関する政策分析</li>
</ul>
</li>
 	<li><strong>プロンプト例</strong>　複数の文書が提供する気候変動に関する情報を比較・照らし合わせて、共通点や相互補完する情報を明らかにしてください。<span><span><span>このプロンプトでは、気候変動に関する情報を比較・照らし合わせることを要求しています。このプロンプトを使用して生成された要約では、複数の文書で共有されている情報やそれぞれの文書が補完し合う情報が抽出され、それらの情報を効果的に統合できるでしょう。</span></span></span>&nbsp;</li>
</ul>
</li>
 	<li><strong>タイムラインの作成: </strong>
複数の文書に記載されたイベントや情報を時系列に沿ってまとめ、全体像を把握しやすくします。
<ul>
 	<li><strong>文書例</strong>　歴史的な出来事、プロジェクトの進捗報告、または製品開発の過程に関する情報が含まれている複数の文書があるとします。例として、ある企業の製品開発プロセスに関する以下のような文書がある場合を考えます。<ul>
 	<li>製品アイデアの提案と市場調査に関する報告書</li>
 	<li>プロトタイプ開発の進捗状況に関する報告書</li>
 	<li>製品テストとフィードバックの収集に関する報告書</li>
 	<li>製品ローンチと初期のマーケティング活動に関する報告書</li>
</ul>
</li>
 	<li><strong>プロンプト例</strong>　複数の文書に記載された製品開発プロセスのイベントや情報を時系列に沿ってまとめて、タイムラインを作成してください。このプロンプトでは、製品開発プロセスに関する情報を時系列に沿ってまとめることを要求しています。このプロンプトを使用して生成された要約では、各文書で述べられているイベントや情報が時系列順に整理され、タイムラインが作成されます。</li>
</ul>
</li>
 	<li><strong>重要な報告事項やインシデントの抽出:</strong>
複数の文書に記載された内容から、特に注意が必要な事項や発生したインシデントを効率的に抽出します。<strong></strong>
<ul>
 	<li><strong>文書例</strong>　このタスクでは、特に注意が必要な事項やインシデントが記載されている可能性のある複数の文書を用意します。例えば、企業内の各部署からの週報、プロジェクト進捗報告、またはシステムのメンテナンスログなどが含まれる場合があります。</li>
 	<li><strong>プロンプト例</strong>　複数の文書に記載された内容から、特に注意が必要な報告事項や発生したインシデントを効率的に抽出してください。このプロンプトは、各文書から注意事項やインシデントに関連する情報を効率的に抽出することを求めています。</li>
</ul>
</li>
 	<li><strong>データの集約:</strong>　複数の文書から関連するデータや統計情報を抽出し、要約にまとめることで、効果的な分析や比較が可能になります。
<ul>
 	<li><b>文書例</b><br />このタスクでは、関連するデータや統計情報が含まれる複数の文書を用意します。例えば、市場調査報告書、企業の販売データ、業界レポート、または経済指標の統計データなどが含まれる場合があります。</li>
 	<li><strong>プロンプト例</strong>　複数の文書から関連するデータや統計情報を抽出し、効果的な分析や比較が可能になるように要約を作成してください。このプロンプトは、各文書から関連するデータや統計情報を抽出し、要約にまとめることを求めています。生成された要約を確認し、データや統計情報が適切に抽出されていることを確認することが重要です。また、関連性のあるデータや統計情報を比較・分析するために、AIによって生成された要約を適切な形式で整理することも必要です。</li>
</ul>
</li>
</ol>
これらの手法を利用することで、複数のファイルから重要な情報を効率的に抽出し、関連する内容を網羅的に理解することが容易になります。生成された要約を確認し、適切な情報が抽出されていることを確認することが重要です。

&nbsp;

ここからは実際のスクリプトを紹介します。
<h2>複数のファイルを個別に要約</h2>
前回のスクリプトの「def main(file_path):」から下の部分を以下に変更することで<br />
<strong>folder_path = "path/to/your/files_folder"</strong><br />
に指定したフォルダ内にあるword(docx)とpdfを要約することが出来ます。

```python
import glob
import os

def process_files(folder_path, file_extension, reader_func):
    file_pattern = os.path.join(folder_path, f"*.{file_extension}")
    for file_path in glob.glob(file_pattern):
        text = reader_func(file_path)
        summary = generate_summary(text)
        print(f"Summary for {file_path}:\n{summary}\n")

# ファイルが格納されたフォルダのパス
folder_path = "path/to/your/files_folder"

# フォルダ内のすべてのWordファイルを読み込む
process_files(folder_path, 'docx', read_docx)

# フォルダ内のすべてのPDFファイルを読み込む
process_files(folder_path, 'pdf', read_pdf)
```

続いて複数のファイルからまとめて１つの要約を作る方法です。
<h2>複数のファイルを1つに要約</h2>
<span>上記のスクリプトの「# ファイルが格納されたフォルダのパス」から下の部分を以下のように変更することで</span>
<strong>folder_path = "path/to/your/files_folder"</strong>
に指定したフォルダ内にあるword(docx)とpdfの文章から<span>１つの要約を作成することが出来ます。</span>

「複数のファイルを使ったGPTの活用法」にあるように用意する文書、プロンプトを変えることで様々な用途に使うことが出来ます。

```python
# ファイルが格納されたフォルダのパス
folder_path = "path/to/your/files_folder"

# フォルダ内のすべてのWordファイルのテキストを結合
combined_text = ""
for file_path in glob.glob(folder_path):
<span class="hljs-keyword">    if</span><span> file_path.endswith(</span><span class="hljs-string">".docx"</span><span>): 
        text = read_docx(file_path) 
    </span><span class="hljs-keyword">elif</span><span> file_path.endswith(</span><span class="hljs-string">".pdf"</span><span>): 
        text = read_pdf(file_path)</span>
    combined_text += text + "\n"

# 結合されたテキストの自動要約を生成
summary = generate_summary(combined_text)

print(f"Combined summary:\n{summary}\n")
```

<h2>大きい複数のWord/PDFファイルを1つに要約</h2>
OpenAIはモデルごとにトークン数に制限があります。gpt-3.5-turboであれば 4k、gpt-4であれば32kまでとなっております。
正確にトークン数をカウントするには OpenAI公式が提供する <a href="https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb">tiktoken</a> を使う必要がありますが、だいたい1文字1トークンと考えて問題ありません。

A4 1枚がだいたい1500文字前後なので、gpt-3.5-turboであれば 3枚程度、gpt-4であれば 20枚程度までとなります。
これより大きい文書から要約するには工夫が必要となります。

<span>以下の例では、一定文字数ごとに分割して処理しています。</span>他にも、レポートから同じ章（<span>売上高、利益、商品・サービスの売れ行き、市場動向など）を抽出して利用するといったことも可能です。
ただし、各セクションの要約が個別に生成されるため、全体的な文脈が失われることがある点に注意してください。
</span>

```python
# 結合されたテキストをセクションに分割する関数
def split_text(text, max_length):
    words = text.split()
    sections = []
    current_section = []

    for word in words:
        if len(" ".join(current_section) + " " + word) &gt; max_length:
            sections.append(" ".join(current_section))
            current_section = [word]
        else:
            current_section.append(word)

    if current_section:
        sections.append(" ".join(current_section))

    return sections

# セクションごとに要約を生成し、最後に結合する
max_length = 4096
sections = split_text(combined_text, max_length)
combined_summary = ""

for i, section in enumerate(sections):
    summary = generate_summary(section)
    combined_summary += f"Summary for section {i + 1}:\n{summary}\n"

print(f"Combined summary:\n{combined_summary}\n")
```

<h2>まとめ</h2>
<span>GPTを用いた複数のファイルから1つの要約を作成する画期的な方法を紹介しました。
この手法は、情報が散在する複数の文書を短時間で効率的に理解するための強力なツールとなります。今後の展望として、この技術はビジネスや研究分野での文献解析やレポート作成を大幅に効率化し、時間と労力の節約につながります。さらに、カスタマイズ可能なプロンプトを利用することで、様々な用途や状況に対応できるため、情報の整理や知識の習得を容易にするでしょう。
</span><span>この技術を今後さらに発展させることで、より高度な要約や情報抽出が可能になり、未来の知識管理や情報処理に革命をもたらすことが期待できます。</span>