AI で 4D Write Pro文書の「適切な場所」を見つける

4Dアプリケーションでは、財務報告書、社内ガイドライン、技術マニュアルなど、大規模な文書が一般的です。完全一致のキーワードで検索するだけでは不十分な場合が多く、特定の段落を見つけるために 30ページのレポートをスクロールするのは、時間がかかるだけでなく、間違いも起こりがちです。ここで AI が役立ちます。

4D 20 R10 で導入されたベクトルに基づいたセマンティックなアプローチは、異なる表現が使われている場合でも (たとえば、”画像を挿入する” と “写真を追加する”)、関連性の高い 4D Write Pro文書を見つけることを既に可能にしています。

しかし、文書が複数ページにわたり、さまざまなサブトピックをカバーしている場合はどうでしょうか? テキスト全体を 1つのベクトルに変換できるとしても、より細かいスケールで作業する方が結果が良くなることは、よくあります。これがチャンク化 (Chunking) の背後にある考え方です。文書をセグメントに分割し、それぞれを独自のベクトルで表現するのです。

これにより、さらに踏み込んだことが可能になります。適切な文書だけでなく、検索に一致する段落を取得できるのです。

HDI: 4D Write Pro: チャンクで文書を検索する

より良い検索のための分割: チャンク化戦略

文書全体を 1つのベクトルとしてインデックス化する代わりに、段落や400~800文字のブロックといったまとまりのあるセグメント (チャンク) に文書を分割します。

各チャンクは以下の情報とともに保存されます:

  • 一意のチャンク識別子
  • 文書識別子
  • 正確なハイライト表示に使用されるテキスト内の位置 (startOffset、endOffset)
  • ベクトルエンベディング
  • そしてオプションとして、素早い確認のための短いテキスト抜粋

 

この粒度のレベルは、新たな可能性を解き放ちます:

  • より正確な検索
  • 該当箇所の選択
  • 4D Write Pro での文脈に合わせたハイライト表示

図解ワークフロー: 検索から自動ハイライトまで

ユーザーから見て、検索プロセスがどのように展開するかを説明します:

1. ユーザーによるクエリ
ユーザーが何らかのテキスト (例: プロフェッショナル・トレーニング) を入力し、文書の検索をトリガーします。

2. ベクトル検索
クエリテキストはベクトル化され、保存されているエンベディングと比較されます。システムは最も近い k個のチャンクを返します (例: docID=42, chunkID=3, startOffset=1200, endOffset=1600)。

3. 関連する段落の表示
アプリケーションは、文書名と抜粋テキストとともに、関連する段落のリストを表示します。

4. 自動表示と段落の選択
リスト内の抜粋テキストをクリックすることで、ユーザーは文書の全文へリダイレクトされ、当該段落がハイライト表示され、前後の段落に囲まれた形で表示されます。保存されているテキストオフセットのおかげで、文書の正確な部分を選択することができます。

このアプローチが効果的な理由

  • パフォーマンス: エンべディングは、テキスト全体よりも、短い断片に対しての方が正確です。
  • ユーザー体験: ユーザーは関心のある段落に直接移動できるので、時間を節約でき、何十ページもスクロールする手間が省けます。
  • 柔軟性: チャンク化は調整可能 (固定サイズ、段落ごと、10~15%のオーバーラップの有無)。
  • スケーラビリティ: この方法は、数百、数千の文書に対しても効率的に機能します。

技術的な詳細

デモデータベースでは、いくつかの 4D Write Pro 文書を使用して、この機能を紹介しています。

1. 文書をチャンクに分割

各チャンクは、文書内のテキスト区間に対応します。

各チャンクに対して、以下を保存します:

  • ベクトルエンべディング: embedding
  • 文書の参照: ID_Document
  • 一意の識別子: ID
  • テキストの範囲: startOffset, endOffset

 

Show the database structure for splitting a 4D Write Pro document into chunks.

4D Write Pro 文書を保存する際、4D は当該文書を構成するさまざまなベクトルを計算します:

$colRange:=WP Get elements($doc.WP; wk type paragraph)
// 各段落に対して、チャンクを作成します
For each ($paragraph; $colRange)
 $chunk:=ds.Chunk.new()
 $chunk.ID_Document:=$doc.ID
 $chunk.startOffset:=WP Paragraph range($paragraph).start
 $chunk.endOffset:=WP Paragraph range($paragraph).end
 $chunk.textExtract:=WP Get text($paragraph)
 // AIManagementクラスを使用してベクトルエンベディングを生成します
 $chunk.embedding:=cs.AIManagement.new($apiKey).generateVector($chunk.textExtract)
 $chunk.save()
End for each

2. チャンク内でのベクトル検索

ユーザープロンプトをチャンクテーブル内のすべてのベクトルと比較します:

// AIManagementクラスを使用して、カスタムプロンプトからベクトルを生成します
var $vector:=cs.AIManagement.new($apiKey).generateVector($prompt)
// コサイン類似度でエンティティをソートします
return ds.Chunk.all().orderByFormula(Formula(This.embedding.cosineSimilarity($vector)); dk descending).slice(0; 5)

最も関連性の高い上位 5つの段落に結果を限定します。

3. 見つかった段落を 4D Write Proで選択

ユーザーがリストボックスで文章を選択すると、4D は 4D Write Pro エリアに文書を表示し、対応する段落をハイライトします:

Case of
: (Form event code=On Selection Change)
 // 選択されたドキュメントを 4D Write Proエリアに読み込みます
 WParea:=WP New(Form.currentItem.document.WP)
 GOTO OBJECT(WParea)
 // startOffset と endOffset によって定義されたテキスト範囲を選択します
 WP SELECT(WParea; Form.currentItem.startOffset; Form.currentItem.endOffset)
End case

まとめ

このアプローチは、セマンティック検索が関連文書を特定し、チャンクの粒度が正確な段落をピンポイントで特定するという、両方の長所を兼ね備えています。その結果、単に “良いドキュメント” を見つけるだけでなく、必要としている回答にユーザーを直接導く 4D Write Pro検索アシスタントが実現します。

関連する文章に直接直接ジャンプできるようになったとき、どれほどの時間が節約され、ユーザー体験が向上するか想像してみてください。このレベルの精度は、ユーザーがコンテンツを探索し、操作する方法をどのように変えるでしょうか? あなたの考えを 4Dフォーラムで共有してください!

Vanessa Talbot
- プロダクトオーナー - Vanessa Talbotは、2014年6月に4Dプログラムチームに参加しました。プロダクトオーナーとして、彼女はユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換する役割を担っています。また彼女の役割は、実装された機能が顧客のニーズを満たしているかどうかを確認することでもあります。入社以来、4Dにおける主要機能の定義に関わってきました。プリエンプティブ/マルチスレッドの新機能の大部分と、非常に複雑なテーマである組み込みアプリケーションの新アーキテクチャに取り組んできました。VanessaはTelecom Saint-Etienneで学位を取得後、Criminal Research Institute でオーディオビジュアル部門の開発者としてキャリアをスタートさせました。また、メディアや医療の分野でも、技術サポートやプロダクションの分野で働いてきました。