Категоризация элементов по описанию через GTP
Всем доброго времени суток. Стоит такая задача: Пользователь пишет боту описание желаемой услуги. Например "Хочу крутой загар". На сервере через GPT определяется по описанию определяется категория. Проблема в том, что список категорий очень сильно разросся и один запрос стоит огромное кол-во токенов. Вопрос: Как-то можно вынести список услуг из промпта? Сейчас мой код выглядит так:
class AI():
def __init__(self) -> None:
self.token = os.environ["PROXYAI_API_KEY"]
self.api_url = os.environ["API_URL"]
async def categorize_description(self, text):
categories = await crud.get_services()
categories = list(map(lambda el: {"id": el["id"], "name": el["name"]}, categories))
categories_answer_exemple = {
'name': 'подкатегория',
'id': 1
}
json_categories_answer_exemple = json.dumps(
categories_answer_exemple,
ensure_ascii=False,
)
prompt = f"""Есть список услуг в формате json : {categories} .
name объекта указывает на имя ислуги.
Опираясь на свойство name объектов определи id и name услуги к которой принадлежит услуга по ее описанию.
в ответ пришли только json такого вида {json_categories_answer_exemple} . Ты не можешь добавлять в ответ новые name, id узлы, которых нет в списке услуг. Используй только те, которые предложены.
Например если в описании говорится про одежду необходимо вернуть : 'name': 'Вязание кофт', 'id': 19 .
Если не можешь определить категорию или подкатегорию в ответ пришли null
Учти, что в ответе может быть только 1 name и id. """
# prompt = f"""Пользователь будет присылать тебе описание услуги. Нужно определить категорию принадлежание услуги к определенной подкатегории по ее описанию. Поиск по подкатегориям осуществляй в следующем json объекте \n {categories}. """
chat_completion = client.chat.completions.create(
model="gpt-4o-mini",
response_format={"type": "json_object"},
messages=[{
"role": "system",
"content": prompt
}, {
"role": "user",
"content": text
}])
return json.loads(chat_completion.choices[0].message.content)
P.S. Я далеко не эксперт в работе с GPT. Можно сказать только начинаю изучать. Поэтому не судите строго