checked / search_errors_logic.py
bvd757's picture
with_chat_gpt_now
c4528c6
raw
history blame
6.12 kB
import openai
from openai import OpenAI
import difflib
prompt_fix_text_gpt = "Исправь ошибки в данном тексте:\n{}"
prompt_compare_get_comment = """
Ты должен писать комментарии об ошибках в тексте.
Тебе дан кусок текст, в котором есть одна или несколько ошибок и этот же кусок текста с исправленными ошибками.
Твоя задача - кратко описать суть каждой ошибки и, если необходимо, исправить её. Отвечай на русском языке.
### Пример 1:
original text:
"кросивую"
corrected text:
"красивую"
Твой ответ:
Орфографическая ошибка: "кросивую" -> "красивую".
### Пример 2:
original:
"я решил пойти в"
corrected text:
"я решил пойти в"
Твой ответ:
Опечатка: повтор пробла.
Теперь твоя очередь:
original:
"{}"
corrected text:
"{}"
"""
prompt = """
Ты должен писать комментарии об ошибках в тексте.
Тебе дан кусок текст, в котором есть ошибка, контекст, в котором стоит это слово и сообщение об ошибке. Твоя задача - кратко описать суть ошибки и, если необходимо, исправить её.
Исправляй только ту ошибку, на которую указывает сообщение. Отвечай на русском языке.
### Пример 1:
Кусок текста:
"кросивую"
Сообщение об ошибке:
"Возможно найдена орфографическая ошибка."
Текст:
"...т! Сегодня я был в парке и встретил там кросивую собаку. Она повиляла хвостом и побежа..."
Твой ответ:
Орфографическая ошибка в слове "кросивую" - правильно "красивую".
### Пример 2:
Кусок текста:
" "
Сообщение об ошибке:
"Повтор пробела."
Текст:
"...ретил там кросивую собаку. Она повиляла хвостом и побежала к речке. Я решил что ..."
Твой ответ:
Обнаружен повтор пробела между словами.
Теперь твоя очередь:
Кусок текста:
"{}"
Сообщение об ошибке:
"{}"
Текст:
"{}"
"""
def get_gpt_response_openai(inp):
response = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": inp}
]
)
return response.choices[0].message['content']
def get_gpt_response_vsegpt(inp):
client = OpenAI(
api_key='sk-or-vv-44ca318747a45e810149bf769e9dfbe5f42046695875efd7c9121cca590d6906',
base_url='https://api.vsegpt.ru/v1'
)
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": inp}]
).choices[0].message.content
return response
def get_gpt_response(inp, client_name):
if client_name == "openai":
return get_gpt_response_openai(inp)
elif client_name == "vsegpt":
return get_gpt_response_vsegpt(inp)
else:
raise ValueError(f"Unsupported client: {client_name}")
def find_corrected_positions(original, corrected):
matcher = difflib.SequenceMatcher(None, original, corrected)
changes = []
for opcode in matcher.get_opcodes():
tag, i1, i2, j1, j2 = opcode
if tag != 'equal':
changes.append({
'original': (i1, i2),
'corrected': (j1, j2),
'operation': tag
})
return changes
def get_piece_of_text_bounds(s, start, end):
if start != 0: start -= 1
while start != 0 and s[start] not in [' ', "\n", '\t']:
start -= 1
start += 1
if end < len(s) - 1: end += 1
while end < len(s) - 1 and s[end] not in [' ', "\n", '\t']:
end += 1
return start, end
def add_comments_to_text(text, errors):
errors = sorted(errors, key=lambda x: x['end'])
shift = 0
for i, error in enumerate(errors, 1):
error['start'] += shift
error['end'] += shift
inp = f"({i})"
text = text[:error['end']] + inp + text[error['end']:]
shift += len(inp)
return text.replace("\n", " ")
def check_text_chat_gpt(text, *args, **kwargs):
fixed_text = get_gpt_response(prompt_fix_text_gpt.format(text), "vsegpt")
changes = find_corrected_positions(text, fixed_text)
errors = []
for change in changes:
start_orig, end_orid = get_piece_of_text_bounds(text, change['original'][0], change['original'][1])
start_corr, end_corr = get_piece_of_text_bounds(fixed_text, change['corrected'][0], change['corrected'][1])
inp = prompt_compare_get_comment.format(text[start_orig:end_orid], fixed_text[start_corr:end_corr])
errors.append({
'start': start_orig,
'end': end_orid,
'message': get_gpt_response(inp, client_name="vsegpt"),
})
text_with_comments = add_comments_to_text(text, errors)
return text_with_comments, errors
def check_text(text, tool):
matches = tool.check(text)
errors = []
for match in matches:
inp = prompt.format(text[match.offset:match.offset + match.errorLength],
match.message, match.context)
error_info = {
'start': match.offset,
'end': match.offset + match.errorLength,
'message': get_gpt_response(inp, client_name="vsegpt"),
}
errors.append(error_info)
text_with_comments = add_comments_to_text(text, errors)
return text_with_comments, errors