Files
nlp/deepseek_module.py
2025-09-30 23:43:51 +04:00

170 lines
9.8 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 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())