From ef6904599af42d1cf9ca42d86b96d2c4d8bd33b6 Mon Sep 17 00:00:00 2001 From: estromenko Date: Tue, 21 Oct 2025 12:39:35 +0300 Subject: [PATCH] Improve speed of llm answers --- backend/agent.py | 30 ++++++++++++++---------------- backend/bot.py | 2 +- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/backend/agent.py b/backend/agent.py index 32ccb17..860f49c 100644 --- a/backend/agent.py +++ b/backend/agent.py @@ -4,42 +4,40 @@ from langgraph.checkpoint.memory import InMemorySaver from langchain_community.tools import DuckDuckGoSearchRun from langchain_community.vectorstores import Clickhouse, ClickhouseSettings from langchain_community.embeddings import DeepInfraEmbeddings -from datetime import datetime from redis.asyncio import Redis -SYSTEM_PROMPT = f""" -Сегодня {datetime.today().isoformat()}. +SYSTEM_PROMPT = """ Ты — карьерный копилот для ИТ. -Ответ всегда должен быть, не допускай пустых ответов. Требования к ответам: - Пиши кратко (до 5–6 строк, буллеты приветствуются). - Всегда проверяй факты: бери данные о вакансиях только из контекста и ссылок в web-поиске. -- В ответ всегда давай источники (минимум 1, лучше 2–3): ссылка на публичный -- Вакансии можно брать только из контекста, либо обращаться к web-поиску. +- В ответ всегда давай источники (минимум 1, лучше 2–3): ссылка на публичный канал или сообщение в телеграмме. +- Вакансии можно брать только из контекста, либо обращаться к web-поиску. Не давай вакансию, если у тебя нет о ней информации в контексте. - Всегда указывай дату вакансии и ссылку на нее. -- Если вакансия из контекста, то сформируй ссылку на telegram-сообщение, где была указана эта вакансия. -пост/новость/страницу компании. Без «уверенностей». -- Персональные/идентифицирующие данные из непубличных источников не -раскрывай. Если цитируешь, то только из публичных каналов/страниц с ссылкой. -- Если данных недостаточно: честно скажи «не хватает надёжных источников», -предложи расширить период/переформулировать, либо выполнить веб-поиск. +- Если данных недостаточно: честно скажи «не хватает надёжных источников», предложи расширить период/переформулировать, либо выполнить веб-поиск. - После полезного ответа предложи один мягкий следующий шаг. -Отвечай простым текстом. Не используй HTML, Markdown, звёздочки, подчёркивания. Просто текст, но используй emoji. +Отвечай простым текстом, не используй форматирование markdown. +Если в контексте ты получил вакансию с форматированием markdown, то убери это форматирование. """ redis = Redis() -llm = ChatOpenAI(model_name="zai-org/GLM-4.6", openai_api_base="https://api.deepinfra.com/v1/openai") +llm = ChatOpenAI(model_name="Qwen/Qwen3-Next-80B-A3B-Instruct", openai_api_base="https://api.deepinfra.com/v1/openai") embedding = DeepInfraEmbeddings(model_id="Qwen/Qwen3-Embedding-8B") vectorstore = Clickhouse(embedding, ClickhouseSettings(port=8123, username="default", password="", index_type="vector_similarity")) search_tool = DuckDuckGoSearchRun() + async def get_relevant_vacancies(requirements: str): """Получает релевантные вакансии из базы данных по переданным требованиям.""" - return await vectorstore.asimilarity_search(requirements, k=10) + documents = await vectorstore.asimilarity_search(requirements, k=5) + return "\n\n".join(document.page_content for document in documents) + async def get_user_resume(user_id: int): """Получает резюме пользователя для подбора вакансий.""" - return await redis.get(user_id) + resume_bytes = await redis.get(user_id) + return resume_bytes.decode("utf-8") + agent = create_agent( model=llm, diff --git a/backend/bot.py b/backend/bot.py index df90a81..77df614 100644 --- a/backend/bot.py +++ b/backend/bot.py @@ -32,7 +32,7 @@ async def prompt(update: Update, context: ContextTypes.DEFAULT_TYPE): response = await agent.ainvoke( input={"messages": [{"role": "user", "content": f"user_id = {update.effective_user.id}\n{user_prompt}"}]}, - config={"configurable": {"thread_id": "1"}}, + config={"configurable": {"thread_id": update.effective_user.id}}, ) await context.bot.editMessageText(response['messages'][-1].content, update.effective_chat.id, message.id)