2025.05.19

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

Shuji
- 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の便利な機能がありますので、今後も追っていきたいと思います。
Other Articles
FastAPI × React LeafletでGoogle Earth Engineの衛星データを扱う
Google Earth Engine で衛生データを表示する
DifyのワークフローをNode Cronで定期実行
Difyの外部ナレッジAPIでNotion APIのデータを取得
Dify × NotionでAIチャットボットを構築する
Gatsby × Tailwindcss × ダークモードでSEO対策
[Gatsby.js] gatsby-plugin-canonical-urlsでcanonicalタグを生成する
[Gatsby.js] gatsby-plugin-robots-txtでrobot.txtを生成する
[Gatsby.js] gatsby-plugin-sitemapでサイトマップを生成する