Разделение HTML-документа для LLM с ограниченным размером токенаPython

Программы на Python
Anonymous
Разделение HTML-документа для LLM с ограниченным размером токена

Сообщение Anonymous »

Сценарий:
Я пытаюсь внести изменения в HTML-файл на основе отзывов пользователей/разработчиков. Я хочу добавить в свой конвейер CI/CD уровень, который вносит изменения в HTML-сборку моего проекта перед его развертыванием. Отзыв может быть примерно таким: «Убедитесь, что изображения загружаются отложенно» (просто пример).
Проблема:
  • Я не могу передать весь HTML-документ, поскольку LLM имеет максимально допустимый размер токена.
  • Размер контекстного окна — 128 КБ, а выходные токены — ~ 16 КБ. Я придерживался принципа создания каждого фрагмента не более 15 000 токенов, потому что ожидаю, что LLM вернет измененный фрагмент, если есть какие-либо изменения, или исходный фрагмент, если изменений не будет. 15 КБ для фрагмента позволяет остальной части приглашения вписаться в исходный лимит выходных токенов в 16 КБ.
  • Поэтому я реализовал сценарий для разделения HTML-файла на независимые фрагменты
    используя подход, основанный на глубине, но я продолжаю получать повторяющиеся элементы между фрагментами.
  • Я был бы открыт для идеи, что LLM сам оценивает, к каким частям дерева HTML относится комментарий пользователя. а затем возвращать изменения только для этих связанных разделов вместо необходимости возвращать как измененные, так и неизмененные разделы в моем текущем примере, но LLM все равно потребуется знание всего дерева. Поэтому разработка идеальной стратегии разбиения на блоки имеет для меня первостепенное значение.
  • Обратите внимание, что HTML-файлы, которые я рассматриваю, имеют размер не менее 248 000 токенов каждый.
    < /ul>
    Ожидание:
  • Что мой скрипт разделит html-файл на куски максимум 15 тысяч токенов с неповторяющимися разделами.
  • Он разделен таким образом, что я могу объединить выходные данные всех фрагментов и создать модифицированный html-файл.
  • PS: Я изучаю этот вопрос. Если у вас есть более эффективные подходы, я тоже буду открыт для них.
Скрипт для фрагментации:
def split_html_into_chunks(self, node, token_limit):
chunks = []
current_chunk = []
current_tokens = 0

def dfs(element):
nonlocal current_chunk, current_tokens

# Get text and token count of the element
if isinstance(element, str):
text = element.strip()
tokens = self.estimate_tokens(text)
else:
text = str(element)
tokens = self.estimate_tokens(text)

# If a single element exceeds the token limit, break it down further
if tokens > token_limit:
if hasattr(element, 'children'):
for child in element.children:
dfs(child)
return

# If adding this element exceeds the limit, finalize the current chunk
if current_tokens + tokens > token_limit:
chunks.append(current_chunk)
current_chunk = []
current_tokens = 0

# Add element to current chunk
current_chunk.append(element)
current_tokens += tokens

# Recurse into children if it's a Tag
if hasattr(element, 'children'):
for child in element.children:
dfs(child)

# Start DFS traversal
dfs(node)

# Add the last chunk if not empty
if current_chunk:
chunks.append(current_chunk)

return chunks

Скрипт для изменения и обратного соединения:
def modify_html_with_llm(self, audit_issue):
soup = BeautifulSoup(self.html, 'html.parser')

# Split the entire document into chunks
html_chunks = self.split_html_into_chunks(soup, TOKEN_LIMIT)

serialized_chunks = self.serialize_chunks(html_chunks)

# Iterate through each chunk, send it to the LLM, and replace it in the soup
modified_chunks = []
chunk_json = {}
for i, chunk in enumerate(serialized_chunks):
print(f"Processing chunk {i+1}/{len(serialized_chunks)} with {self.estimate_tokens(chunk)} tokens...")
modified_chunk = self.send_to_llm(chunk, audit_issue)
modified_chunks.append(modified_chunk)

# Join all modified parts back into the original structure
modified_html = ''.join(modified_chunks)

Подсказка:
You are a web developer.
Based on the following user optimization feedback {feedback},
please modify this HTML code to resolve the performance issue:

Return the modified HTML code alone,
making only necessary changes for the given feedback.
If no changes are possible, return the original code.

The original HTML code is as follows:

{html_part}


Подробнее здесь: https://stackoverflow.com/questions/790 ... token-size

Вернуться в «Python»