80 lines
3.7 KiB
Markdown
80 lines
3.7 KiB
Markdown
**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 (например, недоступность сервера).
|
||
* Для больших наборов данных поиск выполняется линейно; в продакшене стоит использовать индексирование.
|
||
|
||
--- |