Files
agent-s-rag-pamyatyu/SOLUTION.md
T
2026-07-01 13:08:56 +03:00

3.7 KiB
Raw Blame History

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

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