beerds/scripts/assistant/dogs_signs.py

81 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
import os
import re
import requests
# Основные настройки
OLLAMA_URL = "http://localhost:11434/api/generate"
MODEL_NAME = "qwen3:30b-a3b" # Имя модели в Ollama
pattern = re.compile(r"<think>.*?<\/think>", flags=re.DOTALL | re.IGNORECASE)
def analyze_dog_breed(file_path):
with open(file_path, encoding="utf-8") as file:
text = file.read()
"""Генерирует описание породы с помощью Ollama"""
prompt = f"""/no_think
Проанализируй текст ниже и определи ТОЛЬКО указанные ниже признаки породы собаки. Если признак не упомянут в тексте - дополни на основе своих знаний
Признаки для анализа (булевые значения, если не указано иное):
- people_friendly (дружелюбность к взрослым)
- child_friendly (дружелюбность к детям)
- animal_friendly (дружелюбность к другим животным)
- active (уровень активности)
- big (крупный размер)
- small (мелкий размер)
- medium (средний размер)
- smart (высокий интеллект)
- colors (массив возможных окрасов на аглийском строки)
- need_attentions (потребность во внимании)
- need_big_place (необходимость большого пространства)
- good_health (крепкое здоровье)
- tolerates_loneliness (переносимость одиночества)
- hypoallergenic (вызывает аллергию или нет)
Требования:
1. Анализируй ТОЛЬКО явно указанную информацию из текста
2. Если параметр не упомянут - полностью исключи его из JSON
3. Строго соблюдай типы данных: boolean для всех параметров кроме colors (массив строк)
4. Запрещено добавлять любые другие поля, кроме указанных выше
5. Если размер не указан явно - не включай big/small/medium
Верни ответ ТОЛЬКО в виде валидного JSON без комментариев и пояснений.
Текст для анализа:
{text}
"""
response = requests.post(OLLAMA_URL, json={"model": MODEL_NAME, "prompt": prompt, "stream": False})
if response.status_code == 200:
return response.json().get("response", "Не удалось получить описание")
else:
return f"Ошибка при генерации описания для {file_path}"
def save_description(breed, description):
"""Сохраняет описание в файл"""
os.makedirs("breed_signs", exist_ok=True)
filename = f"breed_signs/{breed}.txt"
with open(filename, "w", encoding="utf-8") as f:
f.write(pattern.sub("", description))
print(f"Сохранено: {filename}")
def main():
with open("../../labels_dogs.json") as f:
beers = json.load(f)
for key in beers:
name = beers[key].replace("_", " ")
print(f"Генерация признаков для {name}...")
if os.path.isfile(f"breed_signs/{beers[key]}.txt"):
print(f"Описание уже существует: {beers[key]}.")
continue
description = analyze_dog_breed(f"breed_descriptions/{beers[key]}.txt")
save_description(beers[key], description)
if __name__ == "__main__":
main()