File size: 2,942 Bytes
334fdf5
34acb45
c72165a
 
9686044
c72165a
d3cbe4f
9686044
 
 
 
c72165a
9686044
 
 
 
 
 
c72165a
9686044
 
 
334fdf5
 
 
 
34acb45
9686044
 
 
 
 
 
 
 
 
 
 
 
c72165a
9686044
 
 
 
 
 
 
 
2490241
b5b6032
 
 
 
9686044
 
 
 
 
 
4814516
 
9686044
 
579c6dd
 
 
 
9686044
b5b6032
579c6dd
4814516
334fdf5
 
 
 
 
 
 
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
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
from llama_cpp import Llama

SYSTEM_PROMPT = "Ты — русскоязычный автоматический ассистент и профессиональный редактор. Ты выполняешь указания пользователя в точности, соблюдая все детали задания. Ты хорошо умеешь обобщать текст, выделяя только основной смысл."

def get_message_tokens(llm, role, content):
    content = f"{role}\n{content}\n</s>"
    content = content.encode("utf-8")
    message_tokens = llm.tokenize(content, special=True)
    return message_tokens

def get_system_tokens(llm):
    system_message = {
        "role": "system",
        "content": SYSTEM_PROMPT
    }
    return get_message_tokens(llm, **system_message)

llm = Llama(model_path="/home/oluser/olapp/model-q4_K.gguf", n_ctx=2048, n_parts=1)

system_tokens = get_system_tokens(llm)

class OlHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        query_components = parse_qs(urlparse(self.path).query)
        q = query_components["q"][0]

        tokens = system_tokens
        llm.eval(tokens)

        # TODO: add few shot

        message_tokens = get_message_tokens(llm=llm, role="user",
            content="Напиши краткое изложение текста, представленного ниже, в одном предложении.\nПредложение должно быть лаконичным о отражать основной смысл события или новости.\n\n" + q )
        role_tokens = llm.tokenize("bot\n".encode("utf-8"), special=True)
        tokens += message_tokens + role_tokens
        # full_prompt = llm.detokenize(tokens)

        generator = llm.generate(
            tokens,
            top_k=30,
            top_p=.9,
            temp=.2,
            repeat_penalty=1.21
        )

        answ = ""

        self.send_response(200)
        self.send_header('Content-type','text/plain; charset=utf-8')
        self.end_headers()
        
        for tok in generator:
            token_str = llm.detokenize([tok]).decode("utf-8", errors="ignore")
            tokens.append(tok)
            if tok == llm.token_eos():
                break
            #self.wfile.write(token_str.encode('utf-8'))
            answ += token_str
            #print(token_str, end="", flush=True)
        
        #output = llm.create_completion(
        #  q,
        #  max_tokens=32,
        #  echo=False
        #)["choices"][0]["text"]

        #self.wfile.write(output.encode('utf-8'))
        self.wfile.write(answ.encode('utf-8'))
        return


if __name__ == '__main__':
    olserver = HTTPServer(('0.0.0.0', 7860), OlHandler)
    print('Starting server at http://0.0.0.0:7860')
    olserver.serve_forever()