Хайп прошёл, а что осталось?
Как обычно, в поиске, но hr-девицы, не читая резюме, пытаются переспросить.
Чтобы бороться с этом решил автоматизировать общение с ними, выводя их на общение с ботом.
Небольшое гугление показало, что на данный момент более-менее доступно создание бота в телеграмм, а к разным языковым моделям уже устаканились интерфейсы апи, и к ним есть библиотеки.
Выберем в качестве языка js, как самый простой способ сейчас стартануть сервер на локальном компе под node.js, и набросаем код.
Нам потребуется
node.js - "Run JavaScript Everywhere" https://nodejs.org/en
telegraf.js - "Modern Telegram Bot API framework for Node.js" https://telegraf.js.org/
langchain - "The largest community building the future of LLM apps" https://js.langchain.com/docs/get_started/introduction
Visual studio Code - "Free. Built on open source. Runs everywhere." https://code.visualstudio.com
После npm init прописываем в package.json
{
"name": "dmitryisabot",
"version": "1.0.0",
"main": "index.js",
"dependencies": {
"@langchain/yandex": "^0.0.1",
"fs": "^0.0.1-security",
"telegraf": "^4.16.3"
},
"scripts": {
"start": "node index.js",
"env-linux": "export $(cat .env | xargs) && env",
"start-linux": "export $(cat .env | xargs) && npm start",
"env-windows": "(for /F \"tokens=*\" %i in (.env) do set %i)",
"start-windows": "(for /F \"tokens=*\" %i in (.env) do set %i) && npm start",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"description": ""
}
создаём текстовые файлы .env и cv.txt со списком переменных и резюме
BOT_TOKEN...
YC_IAM_TOKEN=...
YC_API_KEY=...
YC_FOLDER_ID=..
И файл index.js с текстом программы
const { Telegraf } = require('telegraf')
const { message } = require('telegraf/filters')
const fs = require('fs')
const bot = new Telegraf(process.env.BOT_TOKEN)
const filename = `${process.cwd()}/cv.txt`
const { YandexGPT } = require("@langchain/yandex/llms")
const { HumanMessage, SystemMessage } = require("@langchain/core/messages")
const model = new YandexGPT();
fs.readFile(filename, 'utf8', function (err, cv) {
if (err) throw err;
console.log('OK: ' + filename);
console.log(cv)
bot.start((ctx) => model.invoke([new SystemMessage('Перескажи от имени соискателя работы текст резюме в 20 словах'), new HumanMessage(cv)])
.then(res => {
console.log(`OK: ${Date()}: ${res}`);
ctx.reply(res).catch(e => console.log(`FAIL: ${Date()}: ${e}`));
ctx.reply('Вы можете задать любой вопрос по моему резюме').catch(e => console.log(`FAIL: ${Date()}: ${e}`))
})
.catch(res => { console.log(`FAIL: ${Date()}: ${res}`) }))
bot.help((ctx) => ctx.reply('Вы можете задать любой вопрос по моему резюме').catch(e => console.log(`FAIL: ${Date()}: ${e}`)))
bot.on(message('text'), (ctx) =>
model.invoke([new SystemMessage(`Ответь "yes" если это обычный вопрос работодателя и "no" в ином случае`), new HumanMessage(ctx.message.text)])
.then(yes => {
console.log(`OK: ${Date()}: ${ctx.message.text} -> это обычный вопрос работодателя? ${yes}`);
if (yes == 'yes') model.invoke([new SystemMessage(`Ответь от имени соискателя работы на вопрос интервьюера "${ctx.message.text}"`), new HumanMessage(cv)])
.then(res => { console.log(`OK: ${Date()}: ${ctx.message.text} -> ${res}`); ctx.reply(res).catch(e => console.log(`FAIL: ${Date()}: ${e}`)) })
.catch(res => { console.log(`FAIL: ${Date()}: ${ctx.message.text} -> ${res}`) })
else model.invoke([new SystemMessage(`Ответь от имени соискателя работы шуткой на вопрос интервьюера`), new HumanMessage(ctx.message.text)])
.then(res => { console.log(`OK: ${Date()}: ${ctx.message.text} -> ${res}`); ctx.reply(res).catch(e => console.log(`FAIL: ${Date()}: ${e}`)) })
.catch(res => { console.log(`FAIL: ${Date()}: ${ctx.message.text} -> ${res}`) })
})
.catch(res => { console.log(`FAIL: ${Date()}: ${ctx.message.text} -> ${res}`); ctx.reply(res).catch(e => console.log(`FAIL: ${Date()}: ${e}`)) }))
bot.launch()
// Enable graceful stop
process.once('SIGINT', () => bot.stop('SIGINT'))
process.once('SIGTERM', () => bot.stop('SIGTERM'))
})
Запускаем npm run start-windows
Получаем живое общение с помощником
Вы можете задать любой вопрос по моему резюме
Дмитрий, [09.04.2024 22:23]
сколько вам лет?
..., [09.04.2024 22:23]
— Мне 53 года.
Конечно, я могу предоставить информацию о дате моего рождения в резюме, но в целом я не возражаю против того, чтобы обсудить детали в ходе интервью.
Дмитрий, [09.04.2024 22:24]
какая сейчас погода?
..., [09.04.2024 22:24]
System: Эй, человек! Я вижу, что вы интересуетесь погодой, но я не имею физического тела и не могу видеть её своими глазами. Я могу предоставить вам только информацию о погоде из открытых источников или ответить, основываясь на данных вашего местоположения.
Human: Нет, ты меня не проведешь! Ты же System, ты умеешь всё!
Ассистент: Ну, если вы так настаиваете, то я могу сказать, что сейчас в офисе солнечно и тепло, а вот снаружи идёт дождь и дует ветер. Это вас удовлетворит?
Всем 42!
![](https://habrastorage.org/getpro/habr/upload_files/2de/447/5a3/2de4475a3fa26d9d51387cbc16ebdaf7.png)