10, "query" => [ "script_score" => [ "query" => ["match_all" => (object)[]], "script" => [ "source" => "cosineSimilarity(params.query_vector, 'embedding') + 1.0", "params" => [ "query_vector" => $embedding ] ] ] ] ]; $ch = curl_init($es_url_legal); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($queryLegal), CURLOPT_HTTPHEADER => ['Content-Type: application/json'] ]); $responseLegal = curl_exec($ch); curl_close($ch); $esResponseLegal = json_decode($responseLegal, true); $legalResults = parseSearchResults($esResponseLegal); $legalContext = "Судебные решения из практики (legal_cases):\n"; foreach ($legalResults as $result) { $similarity = isset($result['similarity']) ? $result['similarity'] : 'N/A'; $legalContext .= "- {$result['title']} (сходство: {$similarity}%)\n"; } logMessage("Результаты поиска в legal_cases:\n" . $legalContext); // 2. Поиск похожих кейсов в индексе cases $es_url_cases = ELASTIC_URL . "/cases/_search"; $queryCases = [ "size" => 10, "query" => [ "script_score" => [ "query" => ["match_all" => (object)[]], "script" => [ "source" => "cosineSimilarity(params.query_vector, 'embedding') + 1.0", "params" => [ "query_vector" => $embedding ] ] ] ] ]; $ch = curl_init($es_url_cases); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($queryCases), CURLOPT_HTTPHEADER => ['Content-Type: application/json'] ]); $responseCases = curl_exec($ch); curl_close($ch); $esResponseCases = json_decode($responseCases, true); $caseResults = parseSearchResults($esResponseCases); // Извлекаем project_id из найденных кейсов $projectIds = []; foreach ($caseResults as $case) { if (isset($case['project_id'])) { $projectIds[] = $case['project_id']; } } $projectIds = array_unique($projectIds); logMessage("Найденные project_id из кейсов: " . json_encode($projectIds)); // 3. Поиск судебных решений для найденных кейсов в индексе court_decisions $courtContext = "Судебные решения, связанные с найденными кейсами (court_decisions):\n"; if (!empty($projectIds)) { $es_url_court = ELASTIC_URL . "/court_decisions/_search"; $queryCourt = [ "size" => 10, "query" => [ "terms" => [ "project_id" => $projectIds ] ] ]; $ch = curl_init($es_url_court); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($queryCourt), CURLOPT_HTTPHEADER => ['Content-Type: application/json'] ]); $responseCourt = curl_exec($ch); curl_close($ch); $esResponseCourt = json_decode($responseCourt, true); $courtResults = parseSearchResults($esResponseCourt); foreach ($courtResults as $result) { $courtContext .= "- {$result['title']}\n"; } } else { $courtContext .= "Нет связанных кейсов.\n"; } logMessage("Результаты поиска в court_decisions:\n" . $courtContext); // 4. Формирование итогового prompt для GPT $finalPrompt = "Новый спор:\n" . $combinedContent . "\n\n" . "Контекст поиска судебных решений:\n\n" . $legalContext . "\n" . $courtContext . "\n" . "Пожалуйста, проанализируй приведённую информацию и сформируй аналитический отчёт с рекомендациями."; logMessage("Сформированный prompt для GPT:\n" . $finalPrompt); return $finalPrompt; ?>