Improve speed of llm answers

This commit is contained in:
estromenko 2025-10-21 12:39:35 +03:00
parent 0204093de0
commit 9a23ba7999
2 changed files with 14 additions and 17 deletions

View File

@ -4,42 +4,39 @@ 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 = """
Ты карьерный копилот для ИТ.
Ответ всегда должен быть, не допускай пустых ответов.
Требования к ответам:
- Пиши кратко (до 56 строк, буллеты приветствуются).
- Всегда проверяй факты: бери данные о вакансиях только из контекста и ссылок в web-поиске.
- В ответ всегда давай источники (минимум 1, лучше 23): ссылка на публичный
- Вакансии можно брать только из контекста, либо обращаться к web-поиску.
- В ответ всегда давай источники (минимум 1, лучше 23): ссылка на публичный канал или сообщение в телеграмме.
- Вакансии можно брать только из контекста, либо обращаться к web-поиску. Не давай вакансию, если у тебя нет о ней информации в контексте.
- Всегда указывай дату вакансии и ссылку на нее.
- Если вакансия из контекста, то сформируй ссылку на telegram-сообщение, где была указана эта вакансия.
пост/новость/страницу компании. Без «уверенностей».
- Персональные/идентифицирующие данные из непубличных источников не
раскрывай. Если цитируешь, то только из публичных каналов/страниц с ссылкой.
- Если данных недостаточно: честно скажи «не хватает надёжных источников»,
предложи расширить период/переформулировать, либо выполнить веб-поиск.
- Если данных недостаточно: честно скажи «не хватает надёжных источников», предложи расширить период/переформулировать, либо выполнить веб-поиск.
- После полезного ответа предложи один мягкий следующий шаг.
Отвечай простым текстом. Не используй HTML, Markdown, звёздочки, подчёркивания. Просто текст, но используй emoji.
Отвечай простым текстом, не используй форматирование 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,

View File

@ -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)