234 lines
10 KiB
PHP
234 lines
10 KiB
PHP
|
|
<?php
|
|||
|
|
// iacode14.php
|
|||
|
|
require_once 'aiassist/config.php';
|
|||
|
|
require_once 'aiassist/logger.php';
|
|||
|
|
require_once 'aiassist/database.php';
|
|||
|
|
require_once 'aiassist/crmHandler.php';
|
|||
|
|
require_once 'aiassist/elastic.php';
|
|||
|
|
require_once 'aiassist/fileHandler.php';
|
|||
|
|
require_once 'aiassist/vectorgpt.php';
|
|||
|
|
require_once 'aiassist/gptAssistant.php';
|
|||
|
|
require_once 'aiassist/search.php';
|
|||
|
|
//require_once 'aiassist/search_context.php';
|
|||
|
|
|
|||
|
|
|
|||
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||
|
|
$id = $_POST['id'] ?? null;
|
|||
|
|
if (!$id) {
|
|||
|
|
$input = json_decode(file_get_contents('php://input'), true);
|
|||
|
|
$id = $input['id'] ?? null;
|
|||
|
|
}
|
|||
|
|
if (!$id || !is_numeric($id)) {
|
|||
|
|
logMessage("Ошибка: Некорректный ID.");
|
|||
|
|
die(json_encode(["status" => "error", "message" => "Некорректный ID."], JSON_UNESCAPED_UNICODE));
|
|||
|
|
}
|
|||
|
|
$GLOBALS['caseId'] = $id;
|
|||
|
|
|
|||
|
|
// 1️⃣ Получаем данные из базы
|
|||
|
|
$pdo = getDbConnection();
|
|||
|
|
$documents = fetchDocumentData($pdo, $id);
|
|||
|
|
if (empty($documents)) {
|
|||
|
|
logMessage("Документы не найдены для ID: $id");
|
|||
|
|
die("Документы не найдены для ID: $id");
|
|||
|
|
}
|
|||
|
|
logMessage("✅ Документы получены: " . json_encode($documents, JSON_UNESCAPED_UNICODE));
|
|||
|
|
|
|||
|
|
// 2️⃣ Извлекаем текст из документов
|
|||
|
|
$combinedContent = "";
|
|||
|
|
foreach ($documents as $doc) {
|
|||
|
|
if (empty($doc['filepath'])) continue;
|
|||
|
|
$text = extractText($doc['filepath']);
|
|||
|
|
if (!empty($text)) {
|
|||
|
|
$combinedContent .= $text . "\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
logMessage("📄 Собранный контент:\n" . $combinedContent);
|
|||
|
|
|
|||
|
|
if (empty($combinedContent)) {
|
|||
|
|
logMessage("❌ Ошибка: анализ документов не дал результатов.");
|
|||
|
|
die("Ошибка: анализ документов не вернул результатов.");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 3️⃣ Первый запрос в GPT (извлекаем ключевые параметры дела)
|
|||
|
|
$threadId = createNewThread();
|
|||
|
|
if (!$threadId) {
|
|||
|
|
logMessage("❌ Ошибка создания треда GPT");
|
|||
|
|
die("Ошибка создания треда");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
logMessage("📤 Отправляем в GPT-4 на предварительный анализ...");
|
|||
|
|
|
|||
|
|
$parsedResponse = extractCaseDetailsWithGPT($threadId, ASSISTANT_ID, "", $combinedContent);
|
|||
|
|
if (!$parsedResponse) {
|
|||
|
|
logMessage("❌ Ошибка анализа обращения через GPT-4.");
|
|||
|
|
die("Ошибка анализа обращения через GPT-4");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
logMessage("✅ Ответ GPT-4 (ключевые параметры): " . json_encode($parsedResponse, JSON_UNESCAPED_UNICODE));
|
|||
|
|
|
|||
|
|
// 4️⃣ Генерируем эмбеддинг по `facts`
|
|||
|
|
$embedding = getTextEmbedding($parsedResponse['facts']);
|
|||
|
|
logMessage("🔍 Полученный эмбеддинг (первые 10 значений): " . json_encode(array_slice($embedding["embedding_1024"], 0, 10)));
|
|||
|
|
|
|||
|
|
// 5️⃣ Ищем судебные решения в ElasticSearch
|
|||
|
|
logMessage("🔍 Выполняем поиск судебных решений...");
|
|||
|
|
$searchResults = searchSimilarCases([
|
|||
|
|
'category' => $parsedResponse['category'],
|
|||
|
|
'article' => implode(" ", $parsedResponse['articles']),
|
|||
|
|
'amount' => $parsedResponse['claim_amount'],
|
|||
|
|
'facts' => $parsedResponse['facts'],
|
|||
|
|
'embedding' => $embedding
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
logMessage("✅ Найденные судебные решения: " . json_encode($searchResults, JSON_UNESCAPED_UNICODE));
|
|||
|
|
|
|||
|
|
// 6️⃣ Формируем итоговый промпт
|
|||
|
|
$embedding = getTextEmbedding($combinedContent);
|
|||
|
|
logMessage("🔍 Полученный эмбеддинг (первые 10 значений): " . json_encode(array_slice($embedding, 0, 10)));
|
|||
|
|
|
|||
|
|
// Выполняем поиск судебных решений
|
|||
|
|
$searchResults = searchSimilarCases([
|
|||
|
|
'category' => $parsedResponse['category'],
|
|||
|
|
'article' => implode(" ", $parsedResponse['articles']),
|
|||
|
|
'amount' => $parsedResponse['claim_amount'],
|
|||
|
|
'facts' => $parsedResponse['facts'],
|
|||
|
|
'embedding' => $embedding
|
|||
|
|
]);
|
|||
|
|
logMessage("✅ Найденные судебные решения: " . json_encode($searchResults, JSON_UNESCAPED_UNICODE));
|
|||
|
|
|
|||
|
|
// Формируем `finalPrompt`
|
|||
|
|
$finalPrompt = "Новый спор:\n" . $combinedContent . "\n\n" .
|
|||
|
|
"Контекст поиска судебных решений:\n\n";
|
|||
|
|
foreach ($searchResults as $case) {
|
|||
|
|
$finalPrompt .= "- " . ($case['court_decision'] ?? "Нет данных") . "\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 7️⃣ Второй запрос в GPT (финальный анализ)
|
|||
|
|
logMessage("📤 Отправляем в GPT-4 финальный анализ...");
|
|||
|
|
$analysis = analyzeDocumentWithAssistantStream($threadId, ASSISTANT_ID, "", $finalPrompt, $searchResults);
|
|||
|
|
|
|||
|
|
if (!$analysis) {
|
|||
|
|
logMessage("❌ Ошибка анализа совокупного запроса");
|
|||
|
|
die("Ошибка анализа совокупного запроса");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
logMessage("✅ Итоговый анализ от GPT-4:\n" . $analysis);
|
|||
|
|
|
|||
|
|
// 8️⃣ Завершаем обработку
|
|||
|
|
logMessage("✅ Обработка всех документов завершена.");
|
|||
|
|
exit;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||
|
|
$id = $_POST['id'] ?? null;
|
|||
|
|
if (!$id) {
|
|||
|
|
$input = json_decode(file_get_contents('php://input'), true);
|
|||
|
|
$id = $input['id'] ?? null;
|
|||
|
|
}
|
|||
|
|
if (!$id || !is_numeric($id)) {
|
|||
|
|
logMessage("Ошибка: Некорректный ID.");
|
|||
|
|
die(json_encode(["status" => "error", "message" => "Некорректный ID."], JSON_UNESCAPED_UNICODE));
|
|||
|
|
}
|
|||
|
|
$GLOBALS['caseId'] = $id;
|
|||
|
|
|
|||
|
|
$pdo = getDbConnection();
|
|||
|
|
$documents = fetchDocumentData($pdo, $id);
|
|||
|
|
if (empty($documents)) {
|
|||
|
|
logMessage("Документы не найдены для ID: $id");
|
|||
|
|
die("Документы не найдены для ID: $id");
|
|||
|
|
}
|
|||
|
|
logMessage("Документы получены из БД: " . json_encode($documents, JSON_UNESCAPED_UNICODE));
|
|||
|
|
|
|||
|
|
$filePathList = array_map(function($doc) {
|
|||
|
|
return $doc['filepath'];
|
|||
|
|
}, $documents);
|
|||
|
|
|
|||
|
|
$previousAnalysis = checkPreviousAnalysis($id, $filePathList);
|
|||
|
|
logMessage("DEBUG: Значение предыдущего анализа: " . print_r($previousAnalysis, true));
|
|||
|
|
if ($previousAnalysis) {
|
|||
|
|
logMessage("Найден сохранённый анализ, отправляем его в CRM.");
|
|||
|
|
exit;
|
|||
|
|
} else {
|
|||
|
|
logMessage("Сохранённый анализ не найден, продолжаем обработку.");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Создание Vector Store и загрузка файлов
|
|||
|
|
$vectorStoreId = createVectorStore();
|
|||
|
|
$uploadedFileIds = [];
|
|||
|
|
foreach ($filePathList as $filePath) {
|
|||
|
|
if (!file_exists($filePath)) {
|
|||
|
|
logMessage("Ошибка: Файл не существует: $filePath");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
$fileId = uploadFileToOpenAI($filePath);
|
|||
|
|
if (!$fileId) {
|
|||
|
|
logMessage("Ошибка загрузки файла: $filePath");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (!addFileToVectorStore($vectorStoreId, $fileId)) {
|
|||
|
|
logMessage("Ошибка добавления файла в Vector Store: $filePath");
|
|||
|
|
} else {
|
|||
|
|
logMessage("Файл успешно добавлен в Vector Store: $filePath");
|
|||
|
|
$uploadedFileIds[$filePath] = $fileId;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!updateAssistantWithVectorStore($vectorStoreId)) {
|
|||
|
|
logMessage("Ошибка обновления ассистента с Vector Store");
|
|||
|
|
die("Ошибка обновления ассистента");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Извлечение текста из документов и формирование объединённого контента
|
|||
|
|
$combinedContent = "";
|
|||
|
|
foreach ($documents as $doc) {
|
|||
|
|
if (empty($doc['filepath'])) continue;
|
|||
|
|
$text = extractText($doc['filepath']);
|
|||
|
|
if (!empty($text)) {
|
|||
|
|
$combinedContent .= $text . "\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
logMessage("Собранный контент для анализа:\n" . $combinedContent);
|
|||
|
|
if (empty($combinedContent)) {
|
|||
|
|
logMessage("Ошибка: анализ документов не вернул результатов");
|
|||
|
|
die("Ошибка: анализ документов не вернул результатов");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$fileIdCombined = implode(',', array_values($uploadedFileIds));
|
|||
|
|
logMessage("Объединённый список идентификаторов файлов: " . $fileIdCombined);
|
|||
|
|
|
|||
|
|
// Получаем итоговый prompt для GPT через search_context.php
|
|||
|
|
$finalPrompt = include 'aiassist/search_context.php';
|
|||
|
|
logMessage("Итоговый prompt для GPT:\n" . $finalPrompt);
|
|||
|
|
|
|||
|
|
$threadId = createNewThread();
|
|||
|
|
if (!$threadId) {
|
|||
|
|
logMessage("Ошибка создания треда");
|
|||
|
|
die("Ошибка создания треда");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Пример вызова анализа через GPT-4
|
|||
|
|
$analysis = analyzeDocumentWithAssistantStream($threadId, ASSISTANT_ID, $fileIdCombined, $finalPrompt, []);
|
|||
|
|
if (!$analysis) {
|
|||
|
|
logMessage("❌ Ошибка анализа совокупного запроса");
|
|||
|
|
die("Ошибка анализа совокупного запроса");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Получение эмбеддинга для полного текста обращения
|
|||
|
|
$embedding = getTextEmbedding($combinedContent);
|
|||
|
|
logMessage("Полученный эмбеддинг (первые 10 значений): " . json_encode(array_slice($embedding["embedding_1024"], 0, 10)));
|
|||
|
|
|
|||
|
|
// Далее можно продолжить обработку: анализ обращения, поиск судебных решений, сохранение результата и т.д.
|
|||
|
|
|
|||
|
|
logMessage("Обработка всех документов завершена.");
|
|||
|
|
exit;
|
|||
|
|
|
|||
|
|
*/
|
|||
|
|
else {
|
|||
|
|
logMessage("Ошибка: запрос должен быть POST");
|
|||
|
|
die("Ошибка: запрос должен быть POST");
|
|||
|
|
}
|
|||
|
|
?>
|