**SOLUTION.md** --- ### Что реализовано 1. **Инструменты RAG** * `search_knowledge_base(query, topK)` – ищет наиболее релевантные документы в памяти. * `add_to_knowledge_base(content)` – добавляет новый контент в память. 2. **Стек эмбеддингов** * Заменён `OpenAIEmbeddings` на `OllamaEmbeddings`. * В `package.json` добавлена зависимость `ollama-embeddings`. 3. **Интеграция** * Инструменты подключены в `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 ```js 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** – поиск по памяти ```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** – добавление контента ```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‑интеграция инструментов ```js 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 (например, недоступность сервера). * Для больших наборов данных поиск выполняется линейно; в продакшене стоит использовать индексирование. ---