mcpField
C
Convex Agents RAG

Convex Agents RAG

github.com/sstoboエージェントワークフロー24200 回インストール40 週間前に更新
リポジトリ

Convex Agents RAG について

Convex Agents RAGは、エージェントが独自コンテンツを検索して回答に活用するためのスキルです。根拠に基づく検索や応答を構築する開発者向けで、ハイブリッド検索とユーザー・チーム単位の名前空間に対応します。

主な機能

  1. 01名前空間へのドキュメント登録
  2. 02コンテンツのセマンティック検索
  3. 03テキスト検索とベクトル検索の併用
  4. 04ドキュメント名による絞り込み
  5. 05ユーザーやチームのデータ分離

活用シーン

  1. 01製品ドキュメントに基づく回答
  2. 02ポリシーやサポート情報の検索
  3. 03FAQやドキュメント検索の構築
  4. 04ユーザーやチームごとの知識の分離

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sstobo/convex-skills --skill convex-agents-rag

インストール後、Claude Code で/convex-agents-ragを入力して読み込まれたか確認します。

詳細

目的

エージェントがカスタムコンテンツやナレッジベースを検索し、正確でコンテキストに基づいた回答を提供できるようにします。RAG は LLM の機能とセマンティック検索を組み合わせます。

このスキルを使用する場面

  • エージェントがナレッジベースやドキュメントコレクションを参照する必要がある場合
  • 特定のデータ(ポリシー、製品ドキュメントなど)に基づいて回答する場合
  • カスタムコンテンツを横断してセマンティック検索する場合
  • 検索と生成を組み合わせたシステム(FAQ、ドキュメント、サポート)を構築する場合
  • 既知の情報に回答を限定して、ハルシネーションを減らす場合
  • ユーザー別またはチーム別のナレッジ名前空間を管理する場合

セットアップ

convex.config.ts で RAG をインストールして設定します。

import { defineApp } from "convex/server";
import agent from "@convex-dev/agent/convex.config";
import rag from "@convex-dev/rag/convex.config";

const app = defineApp();
app.use(agent);
app.use(rag);

export default app;

コンテンツの追加

ドキュメントを名前空間に取り込みます。

import { rag } from "@convex-dev/rag";

export const addContent = action({
  args: { userId: v.string(), key: v.string(), text: v.string() },
  handler: async (ctx, { userId, key, text }) => {
    const namespace = `user:${userId}`;
    await rag.addContent(ctx, components.rag, {
      namespace,
      key,
      text,
      filters: { filterNames: [filename] },
    });
  },
});

検索と生成

エージェントで RAG を使用します。

export const answerWithContext = action({
  args: { threadId: v.string(), userId: v.string(), question: v.string() },
  handler: async (ctx, { threadId, userId, question }) => {
    const { thread } = await myAgent.continueThread(ctx, { threadId });

    const context = await rag.search(ctx, components.rag, {
      namespace: `user:${userId}`,
      query: question,
      limit: 10,
    });

    const augmentedPrompt = `# Context:\n\n${context.text}\n\n# Question:\n\n${question}`;
    const result = await thread.generateText({ prompt: augmentedPrompt });

    return result.text;
  },
});

主な原則

  • 名前空間でデータを分離:マルチテナントの安全性を確保するため、user:userId または team:teamId を使用します
  • ハイブリッド検索:テキスト検索とベクトル検索を組み合わせて、より良い結果を得ます
  • フィルタリング:特定のドキュメントを対象にするには filterNames を使用します

次のステップ

  • 基本的なエージェントのセットアップについては、fundamentals を参照してください
  • 高度なコンテキストのカスタマイズについては、context を参照してください

コメント