есть три роли:
- system - систмные инструкции
- user - обычный юзер
- assistant - то что бот отвечает юзеру
- [x] Reset conversation with the `/reset` command
- [x] (NEW!) Get personal token usage statistics and cost per day/month via the `/stats` command - by [@AlexHTW](https://github.com/AlexHTW)
#### Budgets
| Parameter | Description | Default value |
|-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------|
| `BUDGET_PERIOD` | Determines the time frame all budgets are applied to. Available periods: `daily` *(resets budget every day)*, `monthly` *(resets budgets on the first of each month)*, `all-time` *(never resets budget)*. See the [Budget Manual](https://github.com/n3d1117/chatgpt-telegram-bot/discussions/184) for more information | `monthly` |
| `USER_BUDGETS` | A comma-separated list of $-amounts per user from list `ALLOWED_TELEGRAM_USER_IDS` to set custom usage limit of OpenAI API costs for each. For `*`- user lists the first `USER_BUDGETS` value is given to every user. **Note**: by default, *no limits* for any user (`*`). See the [Budget Manual](https://github.com/n3d1117/chatgpt-telegram-bot/discussions/184) for more information | `*` |
| `GUEST_BUDGET` | $-amount as usage limit for all guest users. Guest users are users in group chats that are not in the `ALLOWED_TELEGRAM_USER_IDS` list. Value is ignored if no usage limits are set in user budgets (`USER_BUDGETS`=`*`). See the [Budget Manual](https://github.com/n3d1117/chatgpt-telegram-bot/discussions/184) for more information | `100.0` |
Check out the [Budget Manual](https://github.com/n3d1117/chatgpt-telegram-bot/discussions/184) for possible budget configurations.
#### Additional optional configuration options
| Parameter | Description | Default value |
|------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------|
| `PROXY` | Proxy to be used for OpenAI and Telegram bot (e.g. `http://localhost:8080`) | - |
| `OPENAI_MODEL` | The OpenAI model to use for generating responses | `gpt-3.5-turbo` |
| `ASSISTANT_PROMPT` | A system message that sets the tone and controls the behavior of the assistant | `You are a helpful assistant.` |
| `SHOW_USAGE` | Whether to show OpenAI token usage information after each response | `false` |
| `MAX_TOKENS` | Upper bound on how many tokens the ChatGPT API will return | `1200` for GPT-3, `2400` for GPT-4 |
| `MAX_HISTORY_SIZE` | Max number of messages to keep in memory, after which the conversation will be summarised to avoid excessive token usage | `15` |
| `TEMPERATURE` | Number between 0 and 2. Higher values will make the output more random | `1.0` |
| `SUMMARY_TEMPERATURE` | SUMMARY_TEMPERATURE | `1.0` |
| `PRESENCE_PENALTY` | Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far | `0.0` |
| `FREQUENCY_PENALTY` | Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far | `0.0` |
| `GROUP_TRIGGER_KEYWORD` | If set, the bot in group chats will only respond to messages that start with this keyword | - |
SHOW_USAGE - show usage in every message
SUMMARY_TOKENS - сейчас это коряво работает я подставляю это число в SUMMARY_PROMPT и модель сама понимает сколько слов надо юзать
по хорошему это надо протестить и указывать в АПИ запросе ОпенИИ
PROMPT_TOKEN_PRICE_1K
COMPLETION_TOKEN_PRICE_1K
цены за 1000 токенов
SEMANTIC_DB_TOP_K
SEMANTIC_DB_MIN_SCORE
это для механизма подсказок
сколько их подтягивать из БД и какой минимальный скор должен быть у подсказки чтобы она попала в список
## Алгоритм ответа
- Бот получает все update из чаат
- если это команда /get итп он отдает ответ по команде
- если обычное сообщение то начинает обработку
### Личка
- бот подтягивает из БД историю всего диалога (хранится не более MAX_HISTORY_SIZE сообщений) - CONVERSATION
- бот подтягивает из векторБД все подсказки для этого диалога
- он объединяет ASSISTANCE_PROMPT + CONVERSATION + подсказки + сообщение юзера в одну простыню
- если она сильно большая то запускает саммарезирующую модель которая делает из истории summary
- после самарезации по хорошему нужно еще проверять что мы по токенам попадаем нужно потестить на больших текстах
- отправляет в опенАИ и показывает юзеру ответ
### Группа
важно выставить MAX_HISTORY_SIZE = 0
- бот подтягивает из БД историю по цепочки replied_to - CONVERSATION
- бот подтягивает из векторБД все подсказки для этого диалога
- он объединяет ASSISTANCE_PROMPT + CONVERSATION + подсказки + сообщение юзера в одну простыню
- если она сильно большая то запускает саммарезирующую модель которая делает из истории summary
- после самарезации по хорошему нужно еще проверять что мы по токенам попадаем нужно потестить на больших текстах
- отправляет в опенАИ и показывает юзеру ответ
## Как работает механизм подсказок
### Что я понимаю под подсказкой
это более подробная инфа по какому-то вопросу
для каждой подсказки мы можем выделить индексируемую часть (назовем это топик) и часть которую будем отдавать боту (пояснение)
сейчас у нас топик совпадает с пояснением - это нормально но можно поиграться
например если у нас все ВОПРОС-ОТВЕТ
то топик можно сделать ВОПРОС а пояснение это ВОПРОС+ОТВЕТ
либо мы можем гпт4 попросить под каждый вопрос-ответ написать топик чтобы поиск лучше работал
поиск работает так
по топику спец модель нам выдает вектор в многомерном пространстве (типа как смыслов)
если интересно можешь погуглить про Word2Vec и Senternce2Vec
по вектору мы ищем ближайшие вектора в БД и отдаем боту
### Как работает Самери
SUMMARY_PROMPT - промпт для суммирования истории разговора, в нем может быть {SUMMARY_TOKENS} которая она будет подставлять
LAST_MESSAGES_TO_SUMMARY_N - сколько последних сообщений оставлять as-is после саммери, берутся сообщения от бота и от юзера
вообще с этим параметром надо поаккуратнее быть не устанавливать его сильно большим иначе мы упремся в ограничение по токенам от которого не спасет даже самери
лучше потратить время на то чтобы задать подбробный SUMMARY_PROMPT чтобы он по умному брал правильный контекст и даже написать ему "дословно включи последние Н сообщений"
LAST_MESSAGES_TO_SUMMARY_CUTOFF - сколько от каждого такого сообщения отрезать симоволов с начала
вдруг юзер там настрогал простыню, мы просто не можем ее всю включить мы отрежем первые 100 символов - вообще
это экстремальный кейс. Вряд ли предполагается что юзеры шлют простыню
мы даем боту SUMMARY_PROMPT + историю диалога и просим ужать историю до SUMMARY_TOKENS токенов