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

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フォーラムで共有してください!
