Improve speed of llm answers
This commit is contained in:
parent
0204093de0
commit
9a23ba7999
@ -4,42 +4,39 @@ from langgraph.checkpoint.memory import InMemorySaver
|
|||||||
from langchain_community.tools import DuckDuckGoSearchRun
|
from langchain_community.tools import DuckDuckGoSearchRun
|
||||||
from langchain_community.vectorstores import Clickhouse, ClickhouseSettings
|
from langchain_community.vectorstores import Clickhouse, ClickhouseSettings
|
||||||
from langchain_community.embeddings import DeepInfraEmbeddings
|
from langchain_community.embeddings import DeepInfraEmbeddings
|
||||||
from datetime import datetime
|
|
||||||
from redis.asyncio import Redis
|
from redis.asyncio import Redis
|
||||||
|
|
||||||
SYSTEM_PROMPT = f"""
|
SYSTEM_PROMPT = """
|
||||||
Сегодня {datetime.today().isoformat()}.
|
|
||||||
Ты — карьерный копилот для ИТ.
|
Ты — карьерный копилот для ИТ.
|
||||||
Ответ всегда должен быть, не допускай пустых ответов.
|
|
||||||
Требования к ответам:
|
Требования к ответам:
|
||||||
- Пиши кратко (до 5–6 строк, буллеты приветствуются).
|
- Пиши кратко (до 5–6 строк, буллеты приветствуются).
|
||||||
- Всегда проверяй факты: бери данные о вакансиях только из контекста и ссылок в web-поиске.
|
- Всегда проверяй факты: бери данные о вакансиях только из контекста и ссылок в web-поиске.
|
||||||
- В ответ всегда давай источники (минимум 1, лучше 2–3): ссылка на публичный
|
- В ответ всегда давай источники (минимум 1, лучше 2–3): ссылка на публичный канал или сообщение в телеграмме.
|
||||||
- Вакансии можно брать только из контекста, либо обращаться к web-поиску.
|
- Вакансии можно брать только из контекста, либо обращаться к web-поиску. Не давай вакансию, если у тебя нет о ней информации в контексте.
|
||||||
- Всегда указывай дату вакансии и ссылку на нее.
|
- Всегда указывай дату вакансии и ссылку на нее.
|
||||||
- Если вакансия из контекста, то сформируй ссылку на telegram-сообщение, где была указана эта вакансия.
|
- Если данных недостаточно: честно скажи «не хватает надёжных источников», предложи расширить период/переформулировать, либо выполнить веб-поиск.
|
||||||
пост/новость/страницу компании. Без «уверенностей».
|
|
||||||
- Персональные/идентифицирующие данные из непубличных источников не
|
|
||||||
раскрывай. Если цитируешь, то только из публичных каналов/страниц с ссылкой.
|
|
||||||
- Если данных недостаточно: честно скажи «не хватает надёжных источников»,
|
|
||||||
предложи расширить период/переформулировать, либо выполнить веб-поиск.
|
|
||||||
- После полезного ответа предложи один мягкий следующий шаг.
|
- После полезного ответа предложи один мягкий следующий шаг.
|
||||||
Отвечай простым текстом. Не используй HTML, Markdown, звёздочки, подчёркивания. Просто текст, но используй emoji.
|
Отвечай простым текстом, не используй форматирование markdown.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
redis = Redis()
|
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")
|
embedding = DeepInfraEmbeddings(model_id="Qwen/Qwen3-Embedding-8B")
|
||||||
vectorstore = Clickhouse(embedding, ClickhouseSettings(port=8123, username="default", password="", index_type="vector_similarity"))
|
vectorstore = Clickhouse(embedding, ClickhouseSettings(port=8123, username="default", password="", index_type="vector_similarity"))
|
||||||
search_tool = DuckDuckGoSearchRun()
|
search_tool = DuckDuckGoSearchRun()
|
||||||
|
|
||||||
|
|
||||||
async def get_relevant_vacancies(requirements: str):
|
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):
|
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(
|
agent = create_agent(
|
||||||
model=llm,
|
model=llm,
|
||||||
|
|||||||
@ -32,7 +32,7 @@ async def prompt(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|||||||
|
|
||||||
response = await agent.ainvoke(
|
response = await agent.ainvoke(
|
||||||
input={"messages": [{"role": "user", "content": f"user_id = {update.effective_user.id}\n{user_prompt}"}]},
|
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)
|
await context.bot.editMessageText(response['messages'][-1].content, update.effective_chat.id, message.id)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user