Files
DLE/backend/tests/ragServiceFull.test.js

158 lines
5.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/HB3-ACCELERATOR
*/
// Временно устанавливаем URL для локального тестирования
process.env.VECTOR_SEARCH_URL = 'http://localhost:8001';
const ragService = require('../services/ragService');
const db = require('../db');
const TEST_TABLE_ID = 999999; // Используем числовой ID
describe('ragService full integration (DB + vector-search)', () => {
before(async () => {
console.log('Создаем тестовую таблицу и данные...');
// Создаем тестовую таблицу
await db.getQuery()(`
INSERT INTO user_tables (id, name, description)
VALUES ($1, 'Test RAG Table', 'Test table for RAG integration')
ON CONFLICT (id) DO NOTHING
`, [TEST_TABLE_ID]);
// Создаем колонки
const columns = [
{ id: 'col_question', name: 'Question', type: 'text', purpose: 'question' },
{ id: 'col_answer', name: 'Answer', type: 'text', purpose: 'answer' },
{ id: 'col_product', name: 'Product', type: 'text', purpose: 'product' }
];
for (const col of columns) {
await db.getQuery()(`
INSERT INTO user_columns (id, table_id, name, type, options)
VALUES ($1, $2, $3, $4, $5)
ON CONFLICT (id) DO NOTHING
`, [col.id, TEST_TABLE_ID, col.name, col.type, JSON.stringify({ purpose: col.purpose })]);
}
// Создаем строки
const rows = [
{ id: 'row_1', question: 'Что такое RAG?', answer: 'Retrieval Augmented Generation', product: 'A' },
{ id: 'row_2', question: 'Что такое FAISS?', answer: 'Facebook AI Similarity Search', product: 'B' },
{ id: 'row_3', question: 'Что такое Ollama?', answer: 'Локальный inference LLM', product: 'A' }
];
for (const row of rows) {
// Создаем строку
await db.getQuery()(`
INSERT INTO user_rows (id, table_id, name)
VALUES ($1, $2, $3)
ON CONFLICT (id) DO NOTHING
`, [row.id, TEST_TABLE_ID, row.question]);
// Создаем значения ячеек
await db.getQuery()(`
INSERT INTO user_cell_values (row_id, column_id, value)
VALUES ($1, $2, $3), ($1, $4, $5), ($1, $6, $7), ($1, $8, $9)
ON CONFLICT (row_id, column_id) DO UPDATE SET value = EXCLUDED.value
`, [
row.id, 'col_question', row.question,
row.id, 'col_answer', row.answer,
row.id, 'col_product', row.product
]);
}
console.log('Тестовые данные созданы');
});
after(async () => {
console.log('Очищаем тестовые данные...');
// Удаляем значения ячеек
await db.getQuery()(`
DELETE FROM user_cell_values
WHERE row_id IN (SELECT id FROM user_rows WHERE table_id = $1)
`, [TEST_TABLE_ID]);
// Удаляем строки
await db.getQuery()(`
DELETE FROM user_rows WHERE table_id = $1
`, [TEST_TABLE_ID]);
// Удаляем колонки
await db.getQuery()(`
DELETE FROM user_columns WHERE table_id = $1
`, [TEST_TABLE_ID]);
// Удаляем таблицу
await db.getQuery()(`
DELETE FROM user_tables WHERE id = $1
`, [TEST_TABLE_ID]);
console.log('Тестовые данные очищены');
});
it('Полная интеграция: поиск без фильтрации', async () => {
const result = await ragService.ragAnswer({
tableId: TEST_TABLE_ID,
userQuestion: 'Что такое RAG?'
});
console.log('Результат RAG:', result);
if (!result) throw new Error('Нет результата');
if (result.answer !== 'Retrieval Augmented Generation') {
throw new Error(`Ответ не совпадает: ${result.answer}`);
}
});
it('Полная интеграция: фильтрация по продукту', async () => {
const result = await ragService.ragAnswer({
tableId: TEST_TABLE_ID,
userQuestion: 'Что такое Ollama?',
product: 'A'
});
console.log('Результат с фильтром по продукту:', result);
if (!result) throw new Error('Нет результата');
if (result.answer !== 'Локальный inference LLM') {
throw new Error(`Ответ не совпадает: ${result.answer}`);
}
});
it('Полная интеграция: комбинированная фильтрация', async () => {
const result = await ragService.ragAnswer({
tableId: TEST_TABLE_ID,
userQuestion: 'Что такое RAG?',
product: 'A'
});
console.log('Результат с комбинированной фильтрацией:', result);
if (!result) throw new Error('Нет результата');
if (result.answer !== 'Retrieval Augmented Generation') {
throw new Error(`Ответ не совпадает: ${result.answer}`);
}
});
it('Полная интеграция: проверка порога score', async () => {
const result = await ragService.ragAnswer({
tableId: TEST_TABLE_ID,
userQuestion: 'Что такое Ollama?',
threshold: 0.95
});
console.log('Результат с высоким порогом:', result);
// С высоким порогом может не быть результата, это нормально
if (result && result.score < 0.95) {
throw new Error(`Score слишком низкий: ${result.score}`);
}
});
});