- Added comprehensive AI Assistant system (aiassist/ directory): * Vector search and embedding capabilities * Typebot proxy integration * Elastic search functionality * Message classification and chat history * MCP proxy for external integrations - Implemented Court Status API (GetCourtStatus.php): * Real-time court document status checking * Integration with external court systems * Comprehensive error handling and logging - Enhanced S3 integration: * Improved file backup system with metadata * Batch processing capabilities * Enhanced error logging and recovery * Copy operations with URL fixing - Added Telegram contact creation API - Improved error logging across all modules - Enhanced callback system for AI responses - Extensive backup file storage with timestamps - Updated documentation and README files - File storage improvements: * Thousands of backup files with proper metadata * Fix operations for broken file references * Project-specific backup and recovery systems * Comprehensive file integrity checking Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
129 lines
4.9 KiB
PHP
129 lines
4.9 KiB
PHP
<?php
|
||
// aiassist/search_context.php
|
||
|
||
/**
|
||
* Генерирует итоговый prompt для GPT, объединяя:
|
||
* 1. Исходный текст нового спора ($combinedContent).
|
||
* 2. Результаты поиска судебных решений в индексе legal_cases.
|
||
* 3. Результаты поиска похожих кейсов в индексе cases и связанных судебных решений из court_decisions.
|
||
*
|
||
* Предполагается, что функции getTextEmbedding, searchIndex, parseSearchResults
|
||
* и константа ELASTIC_URL уже подключены.
|
||
*/
|
||
|
||
$embedding = getTextEmbedding($combinedContent);
|
||
//logMessage("Полученный эмбеддинг (первые 10 значений): " . json_encode(array_slice($embedding, 0, 10)));
|
||
|
||
// 1. Поиск судебных решений в индексе legal_cases
|
||
$es_url_legal = ELASTIC_URL . "/legal_cases/_search";
|
||
$queryLegal = [
|
||
"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_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;
|
||
?>
|