ваше сообщение коммита

This commit is contained in:
2025-07-03 21:54:00 +03:00
parent 11cf0ea353
commit 972553dbb1
21 changed files with 1435 additions and 176 deletions

View File

@@ -0,0 +1,163 @@
// Временно устанавливаем 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_tags', name: 'Tags', type: 'text', purpose: 'userTags' },
{ 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', tags: 'ai,ml', product: 'A' },
{ id: 'row_2', question: 'Что такое FAISS?', answer: 'Facebook AI Similarity Search', tags: 'ai,search', product: 'B' },
{ id: 'row_3', question: 'Что такое Ollama?', answer: 'Локальный inference LLM', tags: '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_tags', row.tags,
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: 'Что такое FAISS?',
userTags: ['search']
});
console.log('Результат с фильтром по тегу:', result);
if (!result) throw new Error('Нет результата');
if (result.answer !== 'Facebook AI Similarity Search') {
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?',
userTags: ['ai'],
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}`);
}
});
});