File size: 3,545 Bytes
a844653
3618620
56205e9
152d4a2
1cc747b
56205e9
6066e39
a844653
1b071a4
152d4a2
a844653
 
 
152d4a2
a844653
 
 
 
47af0fc
 
12f5431
a844653
 
17d2ff9
12f5431
a844653
 
12f5431
a844653
 
12f5431
 
 
 
 
 
a844653
 
12f5431
17d2ff9
 
 
a844653
12f5431
 
 
 
 
 
a844653
 
 
 
 
 
 
 
3618620
a844653
 
 
 
 
 
 
1b071a4
a844653
 
 
 
 
 
3618620
a844653
 
17d2ff9
a844653
12f5431
a844653
 
 
 
 
 
3618620
a844653
 
 
 
 
 
12f5431
a844653
 
152d4a2
6066e39
12f5431
 
 
 
17d2ff9
 
 
 
 
1b071a4
 
12f5431
56205e9
 
 
12f5431
a844653
 
 
f19d93a
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import logging
from typing import Union, Optional, SupportsIndex
from fastapi import FastAPI
from llama_cpp import Llama

app = FastAPI()

CHAT_TEMPLATE = '<|system|> {system_prompt}<|end|><|user|> {prompt}<|end|><|assistant|>'.strip()
SYSTEM_PROMPT = '{prompt}'

logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)
logger = logging.getLogger(__name__)

logger.info("Запускаемся... 🥳🥳🥳")

REPO_ID = "Vikhrmodels/Vikhr-Qwen-2.5-1.5B-Instruct-GGUF"
FILENAME = "Vikhr-Qwen-2.5-1.5b-Instruct-Q8_0.gguf",

# Инициализация модели
try:
    logger.info(f"Загрузка модели {FILENAME}...")

    # загрузка модели для локального хранилища
    # llm = Llama(
    #     model_path=f"./models/{model_name}.gguf",
    #     verbose=False,
    #     n_gpu_layers=-1,
    #     n_ctx=1512,
    #     temperature=0.3,
    #     num_return_sequences=1,
    #     no_repeat_ngram_size=2,
    #     top_k=50,
    #     top_p=0.95,
    # )

    # if not llm:
    LLM = Llama.from_pretrained(
        repo_id=REPO_ID,
        filename=FILENAME,
        n_gpu_layers=-1,
        n_ctx=1512,
        temperature=0.3,
        num_return_sequences=1,
        no_repeat_ngram_size=2,
        top_k=50,
        top_p=0.95,
    )

except Exception as e:
    logger.error(f"Ошибка загрузки модели: {str(e)}")
    raise


# составление промта для модели
def create_prompt(text: str) -> Union[str, None]:
    try:
        user_input = text
        logger.info(f"Получено сообщение: {user_input}")


        # Генерация шаблона
        return CHAT_TEMPLATE.format(
            system_prompt=SYSTEM_PROMPT.format(promt='Ответ должен быть точным, кратким и с юмором.'),
            prompt=user_input,
        )
    except Exception as e:
        logger.error(e)


def generate_response(prompt: str) -> Optional[str]:
    try:
        # Обработка текстового сообщения
        output = LLM(
            prompt,
            max_tokens=64,
            stop=["<|end|>"],
        )

        logger.info('Output:')
        logger.info(output)

        response = output['choices'][0]['text']

        # Отправка ответа
        if response:
            return response

        return 'Произошла ошибка при обработке запроса'

    except Exception as e:
        logger.error(f"Ошибка обработки сообщения: {str(e)}")


@app.get("/")
def greet_json():
    return {"Hello": "World!"}

@app.put("/system-prompt")
async def set_system_prompt(text: str):
    # Генерация ответа с помощью модели
    logger.info('post/system-prompt')
    global SYSTEM_PROMPT
    SYSTEM_PROMPT = SYSTEM_PROMPT.format(promt=text)
    return {"set": 'ok'}

@app.post("/predict")
async def predict(text: str):
    # Генерация ответа с помощью модели
    logger.info('post/predict')
    prompt = create_prompt(text)
    response = generate_response(prompt)
    return {"response": response}

@app.post("/webhook")
async def predict(response):
    # Генерация ответа с помощью модели
    logger.info('post/webhook -> response:')
    logger.info(response)
    # prompt = create_prompt(text)
    # response = generate_response(prompt)
    return {"response": response}