170 lines
9.8 KiB
Python
170 lines
9.8 KiB
Python
import asyncio
|
||
import datetime
|
||
import json
|
||
import logging
|
||
import time
|
||
from yandex_cloud_ml_sdk import YCloudML
|
||
from deepseek import DeepSeekAPI
|
||
|
||
# Инициализация клиентов
|
||
sdk = YCloudML(
|
||
folder_id="b1g9ebhd2j6dapolmspn",
|
||
auth="t1.9euelZqOxsiNmczGlYmVjZqPnciemu3rnpWamMbLiY7Ix8zHyMvPlZGJmc3l9PcLQDFA-e93IjGb3fT3S24uQPnvdyIxm83n9euelZqSyo6cyJ2PnMjInceWmI6QnO_8xeuelZqSyo6cyJ2PnMjInceWmI6QnA.73RaOj7lFKgEkAFnhrpy1LkS3EvH-hYeBPZ1mX43hyPgSCZ4ShrVFjarra1xCHGpRA3F_Z576viaMyg6UXR-BQ"
|
||
)
|
||
|
||
api_client = DeepSeekAPI("sk-2a2045f744474426b03fc18e30e9f561")
|
||
|
||
|
||
async def nlp_yandex(question: str) -> str:
|
||
"""Асинхронный запрос к Yandex GPT"""
|
||
start_time = datetime.datetime.now()
|
||
try:
|
||
model = sdk.models.completions("yandexgpt", model_version="rc")
|
||
model.configure(response_format="json", temperature=1)
|
||
|
||
operation = await model._run_deferred([
|
||
{
|
||
"role": "system",
|
||
"text": "Ты используешься как nlp процессор. Твоя задача по заданному комментарию траты понять в какую категорию эта трата относится. "
|
||
"Ответ предположением 3х категории с рассчитанным весом в формате json [{'category': 'cat1', 'weight': 0.5}, ...]."
|
||
"Используй категории из данных."
|
||
},
|
||
{
|
||
"role": "assistant",
|
||
"text": "Aвто,Аптеки,Дни рождения и подарки,Другое,ЖКХ,Интернет и связь,Кофе,Красота,Кредиты и долги,Мебель,Медицина,Одежда,Продукты,Прочие услуги,Путешествия,Развлечения,Ребенок,Рестораны и кафе,Сбережения,Спорт,Транспорт,Электроника"
|
||
},
|
||
{"role": "user", "text": question},
|
||
])
|
||
|
||
while operation.get_status().is_running:
|
||
print(operation.get_status())
|
||
await asyncio.sleep(0.1)
|
||
|
||
result = operation.get_result()
|
||
response_msg = "".join(alt.text for alt in result)
|
||
|
||
print(f"Yandex NLP time: {datetime.datetime.now() - start_time}")
|
||
return response_msg.replace('```', '')
|
||
|
||
except Exception as e:
|
||
logging.error(f"Yandex NLP error: {str(e)}")
|
||
return "Ошибка обработки запроса"
|
||
|
||
|
||
def fast_nlp_yandex(question: str) -> str:
|
||
"""Cинхронный запрос к Yandex GPT"""
|
||
start_time = datetime.datetime.now()
|
||
try:
|
||
model = sdk.models.completions("yandexgpt", model_version="rc")
|
||
model.configure(response_format="json", temperature=1)
|
||
|
||
result = model.run([
|
||
{
|
||
"role": "system",
|
||
"text": "Ты используешься как nlp процессор. Твоя задача по заданному комментарию траты понять в какую категорию эта трата относится. "
|
||
"Ответ предположением 3х категории с рассчитанным весом в формате json [{'category': 'cat1', 'weight': 0.5}, ...]."
|
||
"Используй категории из данных."
|
||
},
|
||
{
|
||
"role": "assistant",
|
||
"text": "Aвто,Аптеки,Дни рождения и подарки,Другое,ЖКХ,Интернет и связь,Кофе,Красота,Кредиты и долги,Мебель,Медицина,Одежда,Продукты,Прочие услуги,Путешествия,Развлечения,Ребенок,Рестораны и кафе,Сбережения,Спорт,Транспорт,Электроника"
|
||
},
|
||
{"role": "user", "text": question},
|
||
])
|
||
|
||
response_msg = "".join(alt.text for alt in result)
|
||
|
||
print(f"Sync Yandex NLP time: {datetime.datetime.now() - start_time}")
|
||
return response_msg.replace('```', '')
|
||
|
||
except Exception as e:
|
||
logging.error(f"Yandex NLP error: {str(e)}")
|
||
return "Ошибка обработки запроса"
|
||
|
||
|
||
def nlp_cloud(question: str) -> str:
|
||
"""Запрос к DeepSeek API"""
|
||
start_time = datetime.datetime.now()
|
||
try:
|
||
prompt = [
|
||
{
|
||
"role": "system",
|
||
"content": "Ты используешься как nlp процессор. Твоя задача по заданному комментарию траты понять в какую категорию эта трата относится. "
|
||
"Ответ предположением как минимум 3х категории с рассчитанным весом в формате json [{'id': 'id1', 'weight': 0.5}, ...]. "
|
||
"Используй ТОЛЬКО категории из данных."
|
||
},
|
||
{"role": "user", "content": question},
|
||
{
|
||
"role": "assistant",
|
||
"content": "Aвто(id=677bc767c7857460a491bd52),Аптеки(id=677bc767c7857460a491bd59),Дни рождения и подарки(id=677bc767c7857460a491bd54),Другое(id=67b83e141fc0575a3f0a383f),ЖКХ(id=677bc767c7857460a491bd4b),Интернет и связь(id=677bc767c7857460a491bd53),Кофе(id=677bc767c7857460a491bd4e),Красота(id=677bc767c7857460a491bd50),Кредиты и долги(id=677bc767c7857460a491bd49),Мебель(id=677bc767c7857460a491bd4c),Медицина(id=677bc767c7857460a491bd5a),Одежда(id=677bc767c7857460a491bd5b),Продукты(id=677bc767c7857460a491bd4a),Прочие услуги(id=677bc767c7857460a491bd4d),Путешествия(id=677bc767c7857460a491bd56),Развлечения(id=677bc767c7857460a491bd58),Ребенок(id=677bc767c7857460a491bd5d),Рестораны и кафе(id=677bc767c7857460a491bd55),Сбережения(id=677bc767c7857460a491bd4f),Спорт(id=677bc767c7857460a491bd57),Транспорт(id=677bc767c7857460a491bd51),Электроника(id=677bc767c7857460a491bd5c)"
|
||
},
|
||
]
|
||
|
||
response = ""
|
||
for chunk in api_client.chat_completion(prompt=prompt, stream=True):
|
||
response += chunk
|
||
|
||
# Очистка и парсинг JSON
|
||
clean_response = response.replace('```json', '').replace('```', '').strip()
|
||
try:
|
||
parsed = json.loads(clean_response)
|
||
print(f"DeepSeek NLP time: {datetime.datetime.now() - start_time}")
|
||
return json.dumps(parsed, ensure_ascii=False, indent=2)
|
||
except json.JSONDecodeError:
|
||
return clean_response
|
||
|
||
except Exception as e:
|
||
logging.error(f"DeepSeek NLP error: {str(e)}")
|
||
return json.dumps({"error": str(e)})
|
||
|
||
|
||
def generate_spends():
|
||
"""Запрос к DeepSeek API"""
|
||
start_time = datetime.datetime.now()
|
||
try:
|
||
prompt = [
|
||
{
|
||
"role": "system",
|
||
"content": "Ты используешься для генерации виртуальных трат, для последующего обучения NLP модели. "
|
||
"Тебе даны категории с их идентификаторами. По запросу сгенерируй 50 человеческих транзакций."
|
||
"Используй ТОЛЬКО категории из данных.Ответь в формате csv id, comment, category"
|
||
},
|
||
{"role": "user", "content": "Давай"},
|
||
{
|
||
"role": "assistant",
|
||
"content": "Aвто(id=677bc767c7857460a491bd52),Аптеки(id=677bc767c7857460a491bd59),Дни рождения и подарки(id=677bc767c7857460a491bd54),Другое(id=67b83e141fc0575a3f0a383f),ЖКХ(id=677bc767c7857460a491bd4b),Интернет и связь(id=677bc767c7857460a491bd53),Кофе(id=677bc767c7857460a491bd4e),Красота(id=677bc767c7857460a491bd50),Кредиты и долги(id=677bc767c7857460a491bd49),Мебель(id=677bc767c7857460a491bd4c),Медицина(id=677bc767c7857460a491bd5a),Одежда(id=677bc767c7857460a491bd5b),Продукты(id=677bc767c7857460a491bd4a),Прочие услуги(id=677bc767c7857460a491bd4d),Путешествия(id=677bc767c7857460a491bd56),Развлечения(id=677bc767c7857460a491bd58),Ребенок(id=677bc767c7857460a491bd5d),Рестораны и кафе(id=677bc767c7857460a491bd55),Сбережения(id=677bc767c7857460a491bd4f),Спорт(id=677bc767c7857460a491bd57),Транспорт(id=677bc767c7857460a491bd51),Электроника(id=677bc767c7857460a491bd5c)"
|
||
},
|
||
]
|
||
|
||
response = ""
|
||
for chunk in api_client.chat_completion(prompt=prompt, stream=True):
|
||
response += chunk
|
||
|
||
# Очистка и парсинг JSON
|
||
clean_response = response.replace('```json', '').replace('```', '').strip()
|
||
try:
|
||
parsed = json.loads(clean_response)
|
||
print(f"DeepSeek process time: {datetime.datetime.now() - start_time}")
|
||
return json.dumps(parsed, ensure_ascii=False, indent=2)
|
||
except json.JSONDecodeError:
|
||
return clean_response
|
||
|
||
except Exception as e:
|
||
logging.error(f"DeepSeek NLP error: {str(e)}")
|
||
return json.dumps({"error": str(e)})
|
||
|
||
|
||
async def main():
|
||
# Тестирование функций
|
||
# req = 'мойка'
|
||
# yandex_result = fast_nlp_yandex(req)
|
||
# print("Yandex:", yandex_result)
|
||
#
|
||
# cloud_result = nlp_cloud(req)
|
||
# print("DeepSeek:", cloud_result)
|
||
print( generate_spends())
|
||
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(main())
|