2025.05.02

dify-knowledge-api-remix-app

Difyの外部ナレッジAPIでRAGを拡張する

  • dify
  • ai
  • remix

Difyではナレッジ機能を使うことで強力なRAGを利用できますが、頻繁にデータが更新される場合、」定期インポートでは追いつかないこともありそうです。その場合、外部ナレッジAPIで指定したエンドポイントに都度POSTリクエストして、参照することができます。この記事ではRemixで作成したアプリと連携し外部ナレッジAPIを利用してみました。

前編ではDifyのチャットbotとRemixで作った外部アプリを連携しています。
https://topaz-inc.dev/articles/dify-api-chat-bot-remix/

外部アプリのDB用意

まず、Remixアプリ側で製品データを用意します。

ただ、DifyのナレッジAPI側からはPOSTリクエストされるため、以下のようなエンドポイントが必要です。

POST <endpoint>/retrieval

以下のようなAPIエンドポイントを用意しています。

import arc from "@architect/functions";
import { json } from "@remix-run/node";

interface Product {
  pk: string;
  name: string;
  description: string;
  createdAt: string;
}

interface RetrievalRecord {
  content: string;
  score: number;
  title: string;
  metadata?: {
    description: string;
    createdAt: string;
  };
}

export async function action({ request }: { request: Request }) {
  const authHeader = request.headers.get("Authorization");
  if (!authHeader || !authHeader.startsWith("Bearer ")) {
    return json(
      { error_code: 1001, error_msg: "無効な認証ヘッダー形式です。Bearer <api-key> 形式が期待されます。" },
      { status: 401 }
    );
  }

  const db = await arc.tables();
  
  try {
    const result = await db.product.scan();

    const records: RetrievalRecord[] = result.Items.map((product: Product) => ({
      content: `${product.name}: ${product.description}`,
      score: 1.0,
      title: product.name,
      metadata: {
        description: product.description,
        createdAt: product.createdAt
      }
    }));

    return json({ records });
  } catch (error) {
    console.error("Error fetching products:", error);
    return json(
      { error_code: 500, error_msg: "内部サーバーエラーが発生しました。" },
      { status: 500 }
    );
  }
} 

ngrokでローカルurlを公開

開発環境のurlだとDify側に接続できないために、一時的に公開urlにしてトンネリングできます。

ngrok http 3333

https://3e0e-103-5-140-142.ngrok-free.appというようなurlでアクセスできるようになっています。

ナレッジベースの作成

Dify側で、外部ナレッジベース連携APIを追加します。

名前と、先ほどのngrokのurlに外部アプリのエンドポイント、API Keyを登録します。

正しく登録できたら、ngrok側でも200が返ってきます。

15:34:59.707 JST POST /api/products/retrieval   200 OK 

外部ナレッジベースと連携します。

Difyアプリ側でもコンテキストを追加から、先ほどのナレッジベースと連携させます。

あとは、Difyのダッシュボードで試したり、以下のようにRemix側のアプリから、送信してみるとDBにあるデータをRAGとして活用できていることが確認できました。

おわりに

Difyの外部ナレッジAPIを活用することで、頻繁にナレッジデータが更新される場面でも、リアルタイムな連携ができるようになりました。これは様々なケースで活用できそうでワクワクいたします。まだまだDifyの便利な機能がありますので、今後も追っていきたいと思います。