149 lines
5.4 KiB
JavaScript
149 lines
5.4 KiB
JavaScript
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 };
|