MCP Docs RAG Server
by kazuph
Verified
#!/usr/bin/env node
/**
* シンプルなRAGテストスクリプト - MCPサーバーを介さずに直接インデックスを使用します
* src/index.tsからエクスポートされた関数を使ってテストを行います
*/
// .envファイルから環境変数を読み込む
import * as dotenv from "dotenv";
dotenv.config();
import path from "path";
import fs from "fs";
// GEMINI_API_KEYをGOOGLE_API_KEYにマッピング(ライブラリが自動的に取得するため)
if (process.env.GEMINI_API_KEY && !process.env.GOOGLE_API_KEY) {
process.env.GOOGLE_API_KEY = process.env.GEMINI_API_KEY;
}
// index.tsからエクスポートされた関数と変数をインポート
import { DOCS_PATH, INDICES_PATH, loadDocument } from "./src/index.js";
// 対象のドキュメントID
const documentId = "honojs";
// メイン関数
async function main() {
console.log(`RAGテストを開始します - ドキュメント: ${documentId}`);
console.time("処理時間");
try {
// インデックスディレクトリのパス
const indexDir = path.join(INDICES_PATH, documentId);
console.log(`インデックスディレクトリ: ${indexDir}`);
// インデックスが存在するか確認し、存在しない場合は自動的に作成されることを表示
if (!fs.existsSync(indexDir)) {
console.log(`インデックスが存在しません。loadDocument関数により自動的に作成されます...`);
} else {
// 既存のインデックスファイルを確認
const indexFiles = fs.readdirSync(indexDir);
console.log("\n--- インデックスファイル ---");
indexFiles.forEach(file => {
const stats = fs.statSync(path.join(indexDir, file));
console.log(`${file} - ${(stats.size / 1024).toFixed(2)} KB`);
});
}
// index.tsからエクスポートされたloadDocument関数を使用してインデックスをロードまたは作成
console.log("\nインデックスをロードまたは作成中...");
const index = await loadDocument(documentId);
console.log("インデックスのロードまたは作成完了");
// インデックスの基本情報を表示
console.log("\n--- インデックス情報 ---");
console.log(`ドキュメントID: ${documentId}`);
// indexの基本的な情報を抽出して表示
const indexSummary = {
type: index.constructor.name,
docStore: Boolean(index.docStore),
vectorStores: Boolean(index.vectorStores),
indexStore: Boolean(index.indexStore),
};
console.log("インデックス構造:", JSON.stringify(indexSummary, null, 2));
// クエリエンジンを作成してテストクエリを実行
const queryEngine = index.asQueryEngine();
// テストクエリを実行
const testQuery = "Honoの特徴と基本的な使い方を教えてください";
console.log(`\nクエリを実行: "${testQuery}"`);
const response = await queryEngine.query({
query: testQuery,
});
console.log("\n--- クエリ結果 ---");
console.log(response.toString());
// ノードソース(引用元)の表示
console.log("\n--- 引用元 ---");
if (response.sourceNodes && response.sourceNodes.length > 0) {
response.sourceNodes.forEach((node, i) => {
console.log(`\n[引用 ${i+1}]`);
// 安全にノード情報を出力
try {
console.log(`スコア: ${node.score || 0}`);
// JSONとしてノードの情報を表示
const nodeInfo = JSON.stringify(node.node, null, 2);
console.log(`ノード情報: ${nodeInfo.substring(0, 500)}...`);
} catch (error) {
console.log(`ノード情報の出力中にエラーが発生しました: ${error.message}`);
}
});
} else {
console.log("引用元情報がありません");
}
// 処理後のインデックスファイルを確認
if (fs.existsSync(indexDir)) {
const indexFiles = fs.readdirSync(indexDir);
console.log("\n--- 処理後のインデックスファイル ---");
indexFiles.forEach(file => {
const stats = fs.statSync(path.join(indexDir, file));
console.log(`${file} - ${(stats.size / 1024).toFixed(2)} KB`);
});
// doc_store.jsonファイルの確認
const docStorePath = path.join(indexDir, 'doc_store.json');
const indexStorePath = path.join(indexDir, 'index_store.json');
console.log("\n--- インデックスファイル確認 ---");
console.log(`doc_store.json: ${fs.existsSync(docStorePath) ? '存在します' : '存在しません'}`);
console.log(`index_store.json: ${fs.existsSync(indexStorePath) ? '存在します' : '存在しません'}`);
if (fs.existsSync(docStorePath)) {
const stats = fs.statSync(docStorePath);
console.log(`doc_store.jsonサイズ: ${(stats.size / (1024 * 1024)).toFixed(2)} MB`);
}
}
} catch (error) {
console.error("エラーが発生しました:", error);
}
console.timeEnd("処理時間");
// 終了する
process.exit(0);
}
// スクリプト実行
main().catch(console.error);