MENU

Difyで社内文書検索!引用元URLを表示する裏技構築術

当ページのリンクには広告が含まれています。

「社内のドキュメントがConfluenceやGoogleドライブに散らばっていて、検索しても見つからない…」
「Amazon Kendraなどのエンタープライズ検索ツールは高すぎて手が出ない…」

そんな悩みを抱えている企業は多いのではないでしょうか。

今回は、ノーコードAI開発プラットフォーム「Dify」を活用して、低コストかつ高機能な社内文書検索システム(RAG)を構築する方法をご紹介します。

特に、Difyの標準機能だけでは実装が難しい「回答の引用元URLを明示する方法」について、具体的なワークフロー設定を交えて解説します。

目次

なぜDifyで社内検索を作るのか?

社内Wiki(Confluenceなど)の標準検索機能は、キーワードが完全に一致しないとヒットしなかったり、古い情報が上位に来たりと、使い勝手が悪いことが多々あります。

Difyを使ってRAG(検索拡張生成)システムを構築すれば、以下のメリットがあります。

  • 自然言語で検索可能:「〇〇の設定方法は?」のように質問形式で探せる。
  • 安価に構築可能: オープンソース版をセルフホストすれば、ソフトウェア費用は無料(LLMのAPI利用料のみ)。
  • カスタマイズ性: 自社の業務フローに合わせて調整が可能。

課題:引用元URLが表示されない問題

社内検索において「情報のソース(URL)がどこか」は非常に重要です。AIが嘘をつく可能性(ハルシネーション)がある以上、人間が一次情報を確認する導線は必須だからです。

しかし、現在のDify(v0.13.1時点)の標準機能では、検索結果に引用元のURLをうまく表示させる機能が十分ではありません。

そこで今回は、「ドキュメントのタイトルにURLを埋め込む」という工夫でこれを解決します。

引用元URLを表示させるワークフロー構築手順

以下の4つのステップでワークフローを構築します。

スタジオ.png
  • ドキュメントタイトルに引用元URLを設定
  • retrieval結果のデータ構造にURL情報を付加
  • (2) を社内文書としてテキスト形式で再フォーマット
  • (3) を質問とともにユーザプロンプトとしてLLMに入力
  • LLMからのGenerationの結果に、引用元URLが含まれる

STEP 1:ナレッジ登録時の工夫

Difyのナレッジ(知識庫)にドキュメントを登録する際、「ドキュメント名(タイトル)」にそのドキュメントのURLを設定します。

これにより、検索結果(Retrieval)のタイトル情報としてURLを取得できるようになります。

具体的な実装

1. ドキュメントタイトルに引用元URLを設定

ナレッジのドキュメントタイトルには引用元URLを設定します。
タイトルはretrieval結果に含まれるので、アクセス可能な情報です。

retrieval結果の構造は以下の通り。

{
  "result": [
    {
      "metadata": {
        "_source": "knowledge",
        "dataset_id": "002b1390-10ad-41ca-a0a2-dd93c7c067a0",
        "dataset_name": "docs.dify.net",
        "document_id": "b3fc447a-0c75-4c8c-8ed1-39a16790a72c",
        "document_name": "https://docs.dify.ai/guides/workflow/orchestrate-node",
        "document_data_source_type": "website_crawl",
        "segment_id": "436c6284-1962-47b6-aa55-b5ca09900f47",
        "retriever_from": "workflow",
        "score": 0.4241129,
        "segment_hit_count": 1,
        "segment_word_count": 1571,
        "segment_position": 13,
        "segment_index_node_hash": "3c797b9d1862472160665f7f9f0e69238d53193635b4e9932c0ca8923bb6764c",
        "position": 1
      },
      "title": "https://docs.dify.ai/guides/workflow/orchestrate-node",
      "content": "All parallel structures will run simultaneously; nodes within the parallel structure output results after completing their tasks, with no order relationship in output. The simpler the parallel structure, the faster the output of results.\n\n![](https://docs.dify.ai/~gitbook/image?url=https%3A%2F%2F3866086014-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FRncMhlfeYTrpujwzDIqw%252Fuploads%252Fgit-blob-0ceb0311c9f69671bc1a5f0256dc32808b94e3ad%252Forchestrate-node-chatflow-multi-answer.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=99a8dbb2&sv=2)\n\n### [Direct link to heading](\\#designing-parallel-structure-patterns) Designing Parallel Structure Patterns\n\nThe following four patterns demonstrate common parallel structure designs:\n\n#### [Direct link to heading](\\#id-1.-normal-parallel) 1\\. Normal Parallel\n\nNormal parallel refers to the `Start | Parallel Nodes | End three-layer` relationship, which is also the smallest unit of parallel structure. This structure is intuitive, allowing the workflow to execute multiple tasks simultaneously after user input.\n\nThe upper limit for parallel branches is 10.\n\n![](https://docs.dify.ai/~gitbook/image?url=https%3A%2F%2F3866086014-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FRncMhlfeYTrpujwzDIqw%252Fuploads%252Fgit-blob-6208ef2403ee301e15029ef431fa6d8d313c98f8%252Forchestrate-node-simple-parallel.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=39314b3d&sv=2)\n\n#### [Direct link to heading](\\#id-2.-nested-parallel) 2\\. Nested Parallel"
    }
  ]
}

STEP 2:コードブロックでデータを整形

スタジオ上の コードブロック「整形・URL付加」 部分です。

知識庫からの検索結果(retrievedResults)を受け取り、タイトル(=URL)を明示的なデータとして扱うためのJavascriptコードブロックを配置します。

/**
 * 文書情報の加工
 * urlを付加する
 * @param retrievedResults {Object[]}
 * @return {Object[]}
 */
function main({ retrievedResults }) { 
  return { 
    results: retrievedResults.map(result => { 
      const url = result.title; // タイトルをURLとして扱う 
      return { ...result, url }; }) 
    }; 
 }

STEP 3:テンプレートでテキスト化

スタジオ上の テンプレートブロック「文書情報テキスト」 部分です。

整形したデータを、LLMが理解しやすいテキスト形式に変換します。

テンプレート変換ブロックを使い、URL + 本文 の形式にまとめます。

{% for result in results %} 
> {{ result.url }} 
{% for line in result.content.split('\n') %}> {{ line }} 
{% endfor %} 
{% endfor %}

STEP 4:システムプロンプトでの指示

最後に、LLMブロックのシステムプロンプトで以下のように指示を出します。

あなたは社内文書検索システムのアシスタントです。
回答作成に使用した文書のセクションには、必ず提供されたURLと参照箇所の抜粋を示してください。

これにより、AIは回答の最後に「参考リンク:https://…」のように、正確なソース元を提示してくれるようになります。

実行結果

さらに検索精度を高めるコツ

検索ドメイン(範囲)を絞る

すべてのドキュメントを一つのナレッジに入れると、無関係な情報がヒットしやすくなります(ノイズ)。

「エンジニア向け」「総務・労務向け」「Slackログ」のようにナレッジを分割し、ユーザーが検索対象を選択できるようにすると、検索体験が劇的に向上します。

まとめ:Difyで業務効率化を加速しよう

Difyを活用することで、高価なツールを導入せずとも、実用的な社内文書検索システムを構築できました。

ただし、DifyのRAG機能は閲覧権限の細かい制御(この部署の人には見せない等)は苦手です。

まずは「全社員に公開しても良い情報(マニュアルや規定類)」の検索から始めてみるのがおすすめです。

【推奨】業務システム化に有効なアイテム

生成AIを学ぶ

システム化のパートナー

VPSサーバの選定

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次