3.7 KiB
3.7 KiB
SOLUTION.md
Что реализовано
-
Инструменты RAG
search_knowledge_base(query, topK)– ищет наиболее релевантные документы в памяти.add_to_knowledge_base(content)– добавляет новый контент в память.
-
Стек эмбеддингов
- Заменён
OpenAIEmbeddingsнаOllamaEmbeddings. - В
package.jsonдобавлена зависимостьollama-embeddings.
- Заменён
-
Интеграция
- Инструменты подключены в
src/index.jsи доступны через CLI‑команды/searchи/add. - Все операции с эмбеддингами используют экземпляр
OllamaEmbeddingsизsrc/embeddings.js.
- Инструменты подключены в
Почему это соответствует требованиям
- Наличие инструментов – файлы
searchKnowledgeBase.jsиaddToKnowledgeBase.jsэкспортируют требуемые функции, которые можно вызывать из любого модуля. - Использование OllamaEmbeddings – в
embeddings.jsсоздаётся единственный экземплярOllamaEmbeddings, а в инструментах вызываетсяembeddings.embedQuery. - Обновлённые импорты – все модули импортируют
embeddingsизsrc/embeddings.js, а не из OpenAI. - Пакетная зависимость –
ollama-embeddingsприсутствует вpackage.json, что позволяет npm установить нужный пакет.
Ключевые фрагменты кода
src/embeddings.js – инициализация OllamaEmbeddings
import { OllamaEmbeddings } from 'ollama-embeddings';
const modelName = process.env.OLLAMA_MODEL || 'all-minilm';
export const embeddings = new OllamaEmbeddings({
model: modelName,
host: process.env.OLLAMA_HOST || 'http://localhost:11434'
});
src/tools/searchKnowledgeBase.js – поиск по памяти
export async function search_knowledge_base(query, topK = 3) {
const queryEmbedding = await embeddings.embedQuery(query);
const scored = knowledgeBase.map(entry => ({
id: entry.id,
content: entry.content,
score: cosineSimilarity(queryEmbedding, entry.embedding)
}));
scored.sort((a, b) => b.score - a.score);
return scored.slice(0, topK);
}
src/tools/addToKnowledgeBase.js – добавление контента
export async function add_to_knowledge_base(content) {
const embedding = await embeddings.embedQuery(content);
const id = uuidv4();
knowledgeBase.push({ id, content, embedding });
return { id };
}
src/index.js – CLI‑интеграция инструментов
import { search_knowledge_base } from './tools/searchKnowledgeBase.js';
import { add_to_knowledge_base } from './tools/addToKnowledgeBase.js';
...
if (trimmed.startsWith('/search ')) { … }
else if (trimmed.startsWith('/add ')) { … }
Ограничения
- Память реализована как простая массив‑объект, поэтому данные не сохраняются между перезапусками.
- Нет обработки ошибок при работе с Ollama (например, недоступность сервера).
- Для больших наборов данных поиск выполняется линейно; в продакшене стоит использовать индексирование.