В прошлый раз мы запускали Ollama — командный интерфейс для работы LLaMa2 моделей. Из коробки он плохо работает с русским языком. Поэтому сегодня используем saiga — LLM для работы на русском языке и залезем в код на питоне для более точной настройки интерфейса.
Скачайте saiga модель
Например, для GGUF V2 — q4_K вам потребуется 10GB RAM:
wget https://huggingface.co/IlyaGusev/saiga2_13b_gguf/resolve/main/model-q4_K.gguf
Установите зависимости
Убедитесь что у вас установлен python3 и pip. Затем установите пакеты:
pip install scipy fire llama-cpp-python
Настройка файла инициализации и запуск модели
Сохраните файл interact_llamacpp.py реализующий сценарий чат-бота:
import fire
from llama_cpp import Llama
SYSTEM_PROMPT = "Ты — русскоязычный автоматический ассистент. Ты помогаешь структурировать ответы."
SYSTEM_TOKEN = 1788
USER_TOKEN = 1404
BOT_TOKEN = 9225
LINEBREAK_TOKEN = 13
ROLE_TOKENS = {
"user": USER_TOKEN,
"bot": BOT_TOKEN,
"system": SYSTEM_TOKEN
}
def get_message_tokens(model, role, content):
message_tokens = model.tokenize(content.encode("utf-8"))
message_tokens.insert(1, ROLE_TOKENS[role])
message_tokens.insert(2, LINEBREAK_TOKEN)
message_tokens.append(model.token_eos())
return message_tokens
def get_system_tokens(model):
system_message = {
"role": "system",
"content": SYSTEM_PROMPT
}
return get_message_tokens(model, **system_message)
def interact(
model_path,
n_ctx=2000,
top_k=30,
top_p=0.9,
temperature=0.2,
repeat_penalty=1.1
):
model = Llama(
model_path=model_path,
n_ctx=n_ctx,
n_parts=1,
)
system_tokens = get_system_tokens(model)
tokens = system_tokens
model.eval(tokens)
while True:
user_message = input("> ")
message_tokens = get_message_tokens(model=model, role="user", content=user_message)
role_tokens = [model.token_bos(), BOT_TOKEN, LINEBREAK_TOKEN]
tokens += message_tokens + role_tokens
generator = model.generate(
tokens,
top_k=top_k,
top_p=top_p,
temp=temperature,
repeat_penalty=repeat_penalty
)
for token in generator:
token_str = model.detokenize([token]).decode("utf-8", errors="ignore")
tokens.append(token)
if token == model.token_eos():
break
print(token_str, end="", flush=True)
print()
if __name__ == "__main__":
fire.Fire(interact)
Для запуска чата выполните команду:
python3 interact_llamacpp.py ./model-q4_K.gguf
Вы так же можете использовать любой другой сценарий, например infer_saiga_llamacpp.py. В таком случае подготовьте заранее входящий example.json. Убедитесь, что записан в одной строке, например так:
{"result": "left", "instruction": "Найди ответ\n2+2=?", "input": "", "left_answer": "", "right_answer": "", "left_model": "", "right_model": "", "id": "example_1"}
Для запуска заранее генерированного JSON выполните команду:
python3 infer_saiga_llamacpp.py ./model-q4_K.gguf example.json result.json