はじめに
DNP(大日本印刷)では、PDFやWordなどで作成されたさまざまな形式の文書ファイルを、生成AIが参照しやすいよう構造化・整形して出力する「DNPドキュメント構造化AI」を開発しています。
非構造データを価値化する!DNPの構造化AI × RAG 体験デモアプリを作ってみた
DNPドキュメント構造化AIを用いると、データ構造が整理された状態でRAG(Retrieval-Augmented Generation)に自前のデータを登録できるため、RAG+生成AIからの応答精度を高めることができます。
しかしながら、最近はわざわざデータ構造化の一手間を加えずとも、元データの文書ドキュメントを渡すだけでも、生成AIはそれなりの精度で応答してくれるようになってきました。
では、「わざわざデータを構造化する意味」ってなんなのでしょうか?
データを構造化することが役に立つシーンを明確化すべく、今回はAmazon Bedrock環境でいろいろなデータを使って実験してみました。
検証方法
検証の着目点
今回は主に下記項目を着眼点として、応答の精度を検証しています。
- ①キーワード検索性
- ドキュメント中にあるキーワードで検索ができるか。 ナレッジベース化するにあたり最低限の機能の評価です。
- ②表中の数字の読み込みと計算
- 表(テーブル)形式のデータの中から入力に応じた数値を解釈・抽出し、それを使った計算が可能かの評価です。
- ③解釈が必要になる指示を与えた場合の挙動
- 「月に23日」といった入力があった際にそれを「月20日以上」と同じ条件として判定できるか、といった、 自然言語的な解釈が必要になる設問を投げかけたときの応答性を評価します。
- ④複数の検索条件をつなぎ合わせる必要がある場合の挙動
- ドキュメント内の別の場所に記載されている情報に関連性を見出し、そこから正確な情報を複合的に抽出できるかの評価です。
①は最低限できてほしいこととして、②の精度が高ければデータ活用と意思決定をより高精度で行うことができるようになりますし、③④の精度が高ければより自然なコミュニケーションで情報を引き出せ、かつ複雑な問い合わせにも対応できるようになります。
環境構成
検証はAmazon Bedrockのナレッジベースを利用して行います。
処理としては、
①:EC2上に配置されたDNPドキュメント構造化AIにナレッジのもととなるPDFファイルをアップロードし、構造化データ(XML形式)に変換する
②:①で作成したXMLファイルをS3にアップロード
③:Bedrockで②を参照先としたナレッジベースを作成(詳細は次節)
④:③のナレッジベースに対し各種検証を実施
という流れになります。
ナレッジベースに登録→動作検証する際の設定
各データファイルをナレッジベースに登録し、動作検証する際の設定は下記のとおりです。
- 埋め込みモデル:Amazon Titan Text Embedding V2
- ベクトルストアの作成方法:新しいベクトルストアをクイック作成
- ベクトルストア(新規):Amazon OpenSearch Serverless
- 解析戦略:Amazon Bedrock デフォルトパーサー
- チャンキング戦略:デフォルトチャンキング
- 検証環境:「取得と応答生成」にて実施
- 使用モデル:Anthropic Claude 3.7 Sonnet
検証データ
検証データには、PDF形式で公開されている非構造化元データ(以降「非構造化」と表記)、それをDNPのドキュメント構造化AIで構造化したデータ(以降「構造化(DNP)」と表記)の2種類を用います。
非構造化データ:元データのPDFファイル
このようなよくあるタイプのPDFファイルです。文章と表で構成されています。
構造化(DNP):DNPドキュメント構造化AIで整形した構造化データ(XML)
元データのPDFファイルをDNPドキュメント構造化AIで処理すると、下記のようなXMLに整形されます。
<text>当連結会計年度の部門別の状況は、以下のとおりです。</text>
<section>【印刷事業】</section>
<section>・情報コミュニケーション部門</section>
(省略)
<text>出版関連事業は、雑誌等の紙媒体の市場縮小にともなう印刷受注減に加え、紙と電子の両方に対応したハイブリッド型総合書店「honto」が前年の巣ごもり需要からの反動の影響を受け、減収となりました。</text>
(省略)
なお、DNPドキュメント構造化AIは構造化したデータをXMLやJSON形式で出力するのですが、XML・JSON形式のファイルは2025/7/4現在Amazon Bedrockのナレッジベースに登録できないため、今回は出力されたXMLファイルをデータ構造を維持しながらHTML形式に変換して実験を行いました(この変換はGeminiで実施)。
<p>当連結会計年度の部門別の状況は、以下のとおりです。</p>
<section>
<h2>【印刷事業】</h2>
</section>
<section>
<h2>・情報コミュニケーション部門</h2>
</section>
(省略)
<p>出版関連事業は、雑誌等の紙媒体の市場縮小にともなう印刷受注減に加え、紙と電子の両方に対応したハイブリッド型総合書店「honto」が前年の巣ごもり需要からの反動の影響を受け、減収となりました。</p>
(省略)
今回はこのデータを構造化(DNP)として検証に使います。
性能比較評価① DNP決算短信
質問1
「ハイブリッド型総合書店「honto」の減収の原因として推測されることはなんですか」
正答例
「前年の巣ごもり需要からの反動の影響」
本質問は文書内記載通りの文言で適切な検索・応答が行えるかの確認を目的としています。それぞれの回答はこちら。
- 構造化(DNP):
- 「DNPのハイブリッド型総合書店「honto」の減収の原因は、前年の巣ごもり需要からの反動の影響を受けたことによるものです。これは出版関連事業全体の減収要因の一つとなっています。 また、出版関連事業全体としては、雑誌等の紙媒体の市場縮小にともなう印刷受注減も減収の要因となっています。これらの結果、原材料・エネルギー・物流関連のコスト上昇の影響も受け、営業利益は267億円(前期比3.2%減)となりました。」
- 非構造化:
- 「ハイブリッド型総合書店「honto」の減収の原因として、「前年の巣ごもり需要からの反動の影響」が挙げられています。これは出版関連事業の減収要因の一つとして記載されています。」
結果として、構造化・非構造化ともに正しい答えを返しました。
当然ですが、文書内にそのまま書いてあることはそのまま読み取れるようです。
質問2
「2023年3月期の個別業績(2022年4月1日~2023年3月31日)において、2023年3月期と2022年3月期の1株当たり当期純利益を比較した際、1株当たり当期純利益が高かったのはどちらですか。差額も提示してください。」
正答例
2023年3月期 306.16円、 2022年3月期 318.65円=「2022年3月期のほうが12.49円高い」
この質問は基本的な表の読み取り、及び表内の数値の比較、計算ができるかを検証すべく設定しました。それぞれの回答はこちら。
- 構造化(DNP):
- 「DNPの個別業績における1株当たり当期純利益は、2023年3月期が306.16円、2022年3月期が318.65円でした。両者の差額は12.49円の減少となっています。」
- 非構造化:
- 「2023年3月期の1株当たり当期純利益は321.32円、2022年3月期は355.84円でした。比較すると、2023年3月期は2022年3月期に比べて34.52円減少しています。」
構造化は正解のデータを拾ってきました。
一方で非構造化は当期純利益ではあるのですが、個別業績ではなく連結のデータを拾ってきてしまったようで不正解となっています。
より深い意図理解という観点だと、構造化することに意味がありそうです。
質問3
「自己資本比率の年度ごとの推移を教えてください。」
正答例
- 2019年3月期: 56.1%
- 2020年3月期: 53.2%
- 2021年3月期: 57.2%
- 2022年3月期: 58.2%
- 2023年3月期: 59.4%
文書表内および質問文内に提示された数値を自然言語的に処理し、大小関係を把握できるかの検証です。
- 構造化(DNP):
-
「DNPグループの自己資本比率の年度別推移は以下のとおりです:
- 56.1%
- 53.2%
- 57.2%
- 58.2%
- 59.4%
- 非構造化:
-
「自己資本比率の年度推移については、以下のように記載されています:
- 2023年3月期: 59.4%
- 2022年3月期: 58.2%
構造化は記載のあった5年分すべてを回答しました(年度の記載がないのが少し残念ですが・・・)。非構造化も途中までは正解のデータを提示したのですが、なぜか途中で省略してしまいました。
性能比較評価② 保育園入園マニュアル
続いては某自治体が公表している、保育園の入園申し込みのマニュアルのPDFを利用した検証になります。このマニュアルには非定型のテーブルデータが多く記載されており、その読み取りがどの程度可能なのか?が検証の焦点になります。
また、保育園の入園手続きは親の状況、兄弟の状況、勤務先の状況など、さまざまな複合要因を勘案して行う必要があるタスクです。
自治体職員の業務QAタスクの代替が可能になる精度が出せるかも焦点のひとつになりますね。
質問1
「居宅外労働月20日以上の場合の指数は?」
正答例
「(月160時間以上(1日8時間以上)の就労を常態とする場合)20」
文書内記載通りの文言で適切な検索・応答が行えるかの検証になります。
それぞれの回答はこちら。
- 構造化(DNP):
- 「居宅外労働で月20日以上の場合、就労時間によって指数が異なります:
- 月160時間以上(1日8時間以上)の就労を常態とする場合:20指数
- 月120時間以上160時間未満(1日6時間以上8時間未満)の就労を常態とする場合:18指数
- 月80時間以上120時間未満(1日4時間以上6時間未満)の就労を常態とする場合:16指数 」
- 非構造化:
- 「居宅外労働で月20日以上、月160時間以上(1日8時間以上)の就労を常態とする場合の指数は20です。」
構造化、非構造化ともに正答しました。ただ、構造化の場合は就労形態に応じた指数の提示まで行ってくれました。
正直そこまでの対応を想定していなかったので驚いたのですが、確かに入力設問にユーザ側の就労形態の指定がない以上、すべてのパターンについて想定して網羅した返答を返したほうが正確といえます。
質問2
「居宅外労働を月23日している場合の指数は?」
正答例
「(月160時間以上(1日8時間以上)の就労を常態とする場合)20」
文書内の文言を言い換えた場合の汎用性検証になります。「月20日以上」を「月23日」という具体的な表現に変更しただけで、内容自体は質問1と同じことを聞いています。
問い合わせ関連を生成AIに担当させたい場合、こういった表記ゆれは必ず出てくるものなので、どのくらいの対応力があるのか確認しておきたいところです。
それぞれの回答はこちら。
- 構造化(DNP):
- 「居宅外労働で月20日以上かつ月160時間以上(1日8時間以上)の就労を常態とする場合、基準指数は20となります。 また、居宅外労働で月16日以上かつ月128時間以上(1日8時間以上)の就労を常態とする場合、基準指数は18となります。 月23日の場合は月20日以上の区分に該当するため、1日の労働時間によって指数が20または18になると考えられます。」
- 非構造化:
- 「保育園入園に関する情報をお伝えします。〇〇市では毎月1日入園の申請を受け付けていますが、月途中からの入園はできません。また、2月と3月の入園申請は受け付けていません。入園が決定すると「保育料に関する案内文書」にて保育の実施期間や保育料などが通知されます。入園後は、お子さんの集団生活への適応を目的として、一定期間の短時間保育(慣れ保育)があります。[1] 保育時間については、標準時間認定の世帯では11時間保育が提供されており、開所時間によって◯時〜●時、△時〜▲時、□時〜■時などの時間帯があります。保育園によっては延長保育も利用可能です。また、保育時間の確認のため、就労証明書等を保育園に提出することが必要な場合があります。[2][3] なお、ご質問の「居宅外労働 月23日 指数」に関する具体的な情報は提供された検索結果には含まれていませんでした。保育園入園の審査や指数に関する詳細情報については、追加の情報が必要です。[4][5][6][7][8]」
大きな差が出た回答だと思います。構造化は「月23日=月20日以上」という認識の上で正答を返してくれました。
一方で非構造化は「月23日」という固定キーワードに引っ張られてしまったため検索ができず、回答不可になってしまいました。
幅広い表現での入力が想定される場合、構造化する意義があるのかもしれません。
質問3
「XXXXX保育園(※実際に存在する私立保育園の名称)の保育料の支払い方法を教えて下さい」
正答例
「口座振替または納付書にて納付」
こちらも意図解釈すべき質問をした場合の挙動調査です。
マニュアルの中には「XXXXX保育園が私立保育園に区分されるという旨の記載」と「私立保育園の保育料の支払い方法は口座振替または納付書にて納付という旨の記載」が全く別の箇所に存在しています。離れた位置に書かれた2つの情報を、「XXXXX保育園は私立保育園である」という判断のもとでつなぎ合わせるという思考プロセスが必要となる問題です。
- 構造化(DNP):
- 「XXXXX保育園は私立保育園に分類されると考えられます。私立保育園の保育料の支払い方法は、口座振替または納付書による納付となっています。 口座振替を希望する場合は、WEBまたはアプリで口座登録ができます。希望の金融機関がWEBまたはアプリでの口座登録に対応していない場合は、「〇〇市子育て支援自動引き落とし申請書」を記入し、利用する金融機関で手続きをする必要があります。この申請書は市区町村の担当窓口または保育施設で入手できます。」
- 非構造化:
- 「「XXXXX保育園」の保育料の支払い方法については、現在具体的な情報がありません。 検索結果によると、認定こども園、小規模保育事業、家庭的保育事業の場合、保育園に直接保育料を支払うことになります。支払い方法などの詳細については、保育園に直接確認するよう案内されています。また、私立保育園の場合も、各園に確認が必要です。 「XXXXX保育園」の具体的な支払い手続きについては、保育園に直接お問い合わせください。 」
やはり、「情報の自然言語的な解釈と拡張」といった部分において、ドキュメントを構造化するメリットがありそうです。
性能比較評価 結果
性能比較評価をした結果は、下記のとおりでした。
- 構造化データ:
-
- 決算短信の表形式データ(数値比較、計算、推移)を正確に読み取り、正しい回答を生成。
- 「月23日の居宅外労働」や「XXXXX保育園(私立保育園)」といった言い換えや文脈を解釈した質問にも対応し、適切な情報を提供できた。
- 関連情報を漏れなく提示する傾向にある。
- 非構造化データ:
-
- 文書内のキーワードと一致する質問には応答できる。
- 表データの数値計算や比較は不正確で、誤った情報を提示するリスクがある。
- 言い換えや意図解釈が必要な質問には対応できず、検索失敗や一般的な回答にとどまる。
- 情報提示が網羅的でない場合がある。
ドキュメント構造化のメリット
以上の結果から、ドキュメントを構造化することには下記のメリットがありそうです:
- 回答の正確性と信頼性の向上:
- 特に数値データや複雑な情報を扱う場合、構造化のほうが正確な回答を導き出しやすく、誤情報のリスクを低減できる。
- 複雑な質問への対応力向上:
- 単純なキーワードマッチングを超え、AIが質問の意図や文脈を深く理解し、より柔軟で高度な応答が可能になる。
- 情報検索の効率性と網羅性:
- データの関連性が明確になることで、AIは必要な情報を効率的に、かつ漏れなく検索できるようになる。
まとめ
「ただキーワード検索に基づいた応答ができれば良い」くらいであれば、下のドキュメントを読ませただけでも十分な応答性能が出るため、ドキュメントを構造化する意義は薄いのかもしれません。
ただ、上記の質問例のように、生成AIに高い回答精度と複雑な質問への対応力を求めるのであれば、ドキュメントの構造化は極めて重要になってくると思われます。特に、保育園入園手続きのように、入力者の各種属性の複合要因で判断する必要がある業務(住宅ローンや保険の審査、採用選考など)に関してはドキュメント構造化が大きく意味を持つのかな、と思いました。
本記事がデータの取扱いや精度に悩む皆様のお役に立てれば幸いです!