Переехали на графовую модель, засунули все в докер, поменяли парсинг

This commit is contained in:
2026-07-23 08:34:26 +04:00
parent c503fc4990
commit b2a13528ee
14 changed files with 420 additions and 204 deletions

View File

@@ -4,38 +4,47 @@ using System.Text;
public class LlmPromptBuilder
{
public string BuildPrompt(string userQuestion, List<CodeChunk> foundChunks)
public string BuildPrompt(string userQuestion, List<GraphNodeContext> graphContexts)
{
var sb = new StringBuilder();
var promptBuilder = new StringBuilder();
// 1. Задаем жесткую роль и ограничения
sb.AppendLine("Ты — опытный разработчик и архитектор. Твоя задача — ответить на вопрос пользователя.");
sb.AppendLine("ОТВЕЧАЙ СТРОГО НА ОСНОВЕ ПРЕДОСТАВЛЕННОГО КОДА НИЖЕ.");
sb.AppendLine("Если в коде нет ответа на вопрос, честно скажи: «В данном фрагменте кода нет этой информации». Не придумывай функции, которых нет в тексте.");
promptBuilder.AppendLine("Ты — опытный C#-архитектор. Твоя задача — ответить на вопрос пользователя, опираясь ИСКЛЮЧИТЕЛЬНО на предоставленный граф вызовов и зависимостей кода. Не придумывай методы или классы, которых нет в контексте.");
promptBuilder.AppendLine("\nКонтекст из кодовой базы (Граф зависимостей):");
sb.AppendLine("\n================ ПРЕДОСТАВЛЕННЫЙ КОД ================");
// 2. Вклеиваем найденные чанки с контекстом
foreach (var chunk in foundChunks)
foreach (var node in graphContexts)
{
sb.AppendLine($"Файл: {chunk.FilePath}");
sb.AppendLine($"Класс: {chunk.ClassName}");
sb.AppendLine($"Метод: {chunk.MethodName}");
if (!string.IsNullOrEmpty(chunk.Documentation))
promptBuilder.AppendLine("--------------------------------------------------");
promptBuilder.AppendLine($"[ГЛАВНЫЙ УЗЕЛ]");
promptBuilder.AppendLine($"Имя: {node.MethodName}");
promptBuilder.AppendLine($"Файл: {node.FilePath}");
// Добавляем зависимости ВНИЗ (что использует метод)
if (node.OutgoingDependencies.Any())
{
sb.AppendLine($"Документация: {chunk.Documentation}");
promptBuilder.AppendLine("\n[ИСПОЛЬЗУЕТ ВНУТРИ СЕБЯ]:");
foreach (var dep in node.OutgoingDependencies.Distinct())
{
promptBuilder.AppendLine($"- {dep}");
}
}
sb.AppendLine("Код:");
sb.AppendLine("```csharp");
sb.AppendLine(chunk.Content);
sb.AppendLine("```");
sb.AppendLine("--------------------------------------------------");
// Добавляем зависимости ВВЕРХ (кто зависит от метода)
if (node.IncomingDependencies.Any())
{
promptBuilder.AppendLine("\n[ВЫЗЫВАЕТСЯ ИЗ]:");
foreach (var caller in node.IncomingDependencies.Distinct())
{
promptBuilder.AppendLine($"- {caller}");
}
}
promptBuilder.AppendLine("\nКод:");
promptBuilder.AppendLine(node.Content);
}
// 3. Добавляем сам вопрос
sb.AppendLine("\n================ ВОПРОС ПОЛЬЗОВАТЕЛЯ ================");
sb.AppendLine(userQuestion);
promptBuilder.AppendLine("--------------------------------------------------");
promptBuilder.AppendLine($"Вопрос пользователя: {userQuestion}");
return sb.ToString();
return promptBuilder.ToString();
}
}