Я работаю над проектом, который требует от меня создания интерфейса между LLM и пользователем. LLM используется для генерации исправлений кода, и мне нужно вывести разницу между сгенерированным кодом и содержимым данного файла C. Проблема возникает, когда в сгенерированном коде есть эллипсы, обозначающие блок неизмененного кода, это нарушает различие.
До сих пор я пытался использовать расстояние Левенштейна, чтобы найти похожие строки и найти diff между ними, однако этот подход, похоже, не работает при добавлении новых строк. Вот как я это реализовал
import difflib
from rapidfuzz import fuzz
def compare_code_with_diffs(
original_code, fixed_code, similarity_threshold=0.7
):
def string_similarity(s1, s2):
# Remove spaces and convert to lowercase for a more robust comparison
s1 = s1.replace(" ", "").lower()
s2 = s2.replace(" ", "").lower()
return (
fuzz.ratio(s1, s2) / 100.0
) # Convert percentage to a float between 0 and 1
def find_matching_indices(A, B):
result = []
for i, a_item in enumerate(A):
best_match = None
best_similarity = 0
for j, b_item in enumerate(B):
similarity = string_similarity(a_item, b_item)
if similarity > best_similarity:
best_similarity = similarity
best_match = (j, b_item, similarity)
if best_match and best_similarity >= similarity_threshold:
result.append(
(i, best_match[0], a_item, best_match[1], best_similarity)
)
return result
def generate_diff(old_line, new_line):
differ = difflib.Differ()
diff = list(differ.compare([old_line], [new_line]))
return "\n".join(diff)
A = fixed_code.splitlines()
B = original_code.splitlines()
matches = find_matching_indices(A, B)
diffs = []
for match in matches:
if similarity_threshold < match[4] < 1.0:
diff = generate_diff(match[3], match[2])
diffs.append(
{
"fixed_index": match[0],
"original_index": match[1],
"similarity": match[4],
"diff": diff,
}
)
return diffs
Подробнее здесь: https://stackoverflow.com/questions/787 ... atch-of-it
Как мне создать разницу между файлом и его неполным патчем? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение