Описание изменений
This commit is contained in:
149
backend/services/ollama.js
Normal file
149
backend/services/ollama.js
Normal file
@@ -0,0 +1,149 @@
|
||||
const { ChatOllama } = require('@langchain/ollama');
|
||||
const { RetrievalQAChain } = require("langchain/chains");
|
||||
const { PromptTemplate } = require("@langchain/core/prompts");
|
||||
const axios = require('axios');
|
||||
|
||||
// Создаем шаблон для контекстного запроса
|
||||
const PROMPT_TEMPLATE = `
|
||||
Ты - AI-ассистент для бизнеса, специализирующийся на блокчейн-технологиях и Web3.
|
||||
Используй следующий контекст для ответа на вопрос пользователя.
|
||||
Если ты не знаешь ответа, просто скажи, что не знаешь, не пытайся придумать ответ.
|
||||
|
||||
Контекст: {context}
|
||||
|
||||
Вопрос: {query}
|
||||
|
||||
Ответ:
|
||||
`;
|
||||
|
||||
// Функция для проверки доступности Ollama
|
||||
async function checkOllamaAvailability() {
|
||||
console.log('Проверка доступности Ollama...');
|
||||
|
||||
try {
|
||||
// Добавляем таймаут для запроса
|
||||
const response = await axios.get('http://localhost:11434/api/tags', {
|
||||
timeout: 5000 // 5 секунд таймаут
|
||||
});
|
||||
|
||||
if (response.status === 200) {
|
||||
console.log('Ollama доступен. Доступные модели:');
|
||||
if (response.data && response.data.models) {
|
||||
response.data.models.forEach(model => {
|
||||
console.log(`- ${model.name}`);
|
||||
});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Ollama недоступен:', error.message);
|
||||
console.log('Приложение продолжит работу без Ollama');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Функция для прямого запроса к Ollama API
|
||||
async function directOllamaQuery(message, model = 'mistral') {
|
||||
try {
|
||||
console.log(`Отправка запроса к Ollama (модель: ${model}):`, message);
|
||||
|
||||
// Проверяем доступность Ollama перед отправкой запроса
|
||||
const isAvailable = await checkOllamaAvailability();
|
||||
if (!isAvailable) {
|
||||
throw new Error('Сервер Ollama недоступен');
|
||||
}
|
||||
|
||||
// Создаем экземпляр ChatOllama
|
||||
const ollama = new ChatOllama({
|
||||
baseUrl: 'http://localhost:11434',
|
||||
model: model,
|
||||
temperature: 0.7,
|
||||
});
|
||||
|
||||
console.log('Отправка запроса к Ollama...');
|
||||
const result = await ollama.invoke(message);
|
||||
console.log('Получен ответ от Ollama');
|
||||
|
||||
return result.content;
|
||||
} catch (error) {
|
||||
console.error('Ошибка при запросе к Ollama:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// Функция для создания цепочки Ollama с RAG
|
||||
async function createOllamaChain(vectorStore) {
|
||||
try {
|
||||
console.log('Создаем модель Ollama...');
|
||||
// Создаем модель Ollama
|
||||
const model = new ChatOllama({
|
||||
baseUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',
|
||||
model: process.env.OLLAMA_MODEL || 'mistral',
|
||||
temperature: 0.2,
|
||||
timeout: 60000, // 60 секунд таймаут
|
||||
});
|
||||
console.log('Модель Ollama создана');
|
||||
|
||||
// Проверяем модель прямым запросом
|
||||
try {
|
||||
console.log('Тестируем модель прямым запросом...');
|
||||
const testResponse = await model.invoke('Тестовый запрос');
|
||||
console.log('Тест модели успешен:', testResponse);
|
||||
} catch (testError) {
|
||||
console.error('Ошибка при тестировании модели:', testError);
|
||||
// Продолжаем выполнение, даже если тест не прошел
|
||||
}
|
||||
|
||||
console.log('Создаем шаблон запроса...');
|
||||
// Создаем шаблон запроса
|
||||
const prompt = new PromptTemplate({
|
||||
template: PROMPT_TEMPLATE,
|
||||
inputVariables: ["context", "query"],
|
||||
});
|
||||
console.log('Шаблон запроса создан');
|
||||
|
||||
console.log('Получаем retriever из векторного хранилища...');
|
||||
const retriever = vectorStore.asRetriever();
|
||||
console.log('Retriever получен');
|
||||
|
||||
console.log('Создаем цепочку для поиска и ответа...');
|
||||
// Создаем цепочку для поиска и ответа
|
||||
const chain = RetrievalQAChain.fromLLM(
|
||||
model,
|
||||
retriever,
|
||||
{
|
||||
returnSourceDocuments: true,
|
||||
prompt: prompt,
|
||||
inputKey: "query",
|
||||
outputKey: "text",
|
||||
verbose: true
|
||||
}
|
||||
);
|
||||
console.log('Цепочка для поиска и ответа создана');
|
||||
|
||||
return chain;
|
||||
} catch (error) {
|
||||
console.error('Error creating Ollama chain:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// Функция для получения модели Ollama
|
||||
async function getOllamaModel() {
|
||||
try {
|
||||
// Создаем модель Ollama
|
||||
const model = new ChatOllama({
|
||||
baseUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',
|
||||
model: process.env.OLLAMA_MODEL || 'mistral',
|
||||
temperature: 0.2,
|
||||
timeout: 60000, // 60 секунд таймаут
|
||||
});
|
||||
|
||||
return model;
|
||||
} catch (error) {
|
||||
console.error('Error creating Ollama model:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { getOllamaModel, createOllamaChain, checkOllamaAvailability, directOllamaQuery };
|
||||
Reference in New Issue
Block a user