File size: 2,527 Bytes
f6f5153
 
 
 
 
f49b99e
18898ac
 
c589e1a
2571345
c589e1a
2571345
c589e1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ee24018
834791f
c589e1a
70bcdad
776a762
7d55b61
ee24018
c589e1a
 
 
 
 
 
 
 
f49b99e
c589e1a
 
 
776a762
70bcdad
 
776a762
70bcdad
776a762
 
 
f49b99e
776a762
 
 
834791f
ee24018
 
 
 
 
776a762
7d55b61
 
17ee92b
7d55b61
 
 
 
 
d6e934b
7d55b61
17ee92b
70bcdad
 
7b8bbfd
 
 
 
 
 
 
 
 
 
776a762
7b8bbfd
 
 
 
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
import gradio as gr
from huggingface_hub import InferenceClient
from sentence_transformers import SentenceTransformer
import torch


with open("knowledge.txt", "r", encoding="utf-8") as file:
  knowledge = file.read()

print(knowledge)

cleaned_chunks = [chunk.strip() for chunk in knowledge.strip().split("\n") if chunk.strip()]
print(cleaned_chunks)

model = SentenceTransformer('all-MiniLM-L6-v2')

chunk_embeddings = model.encode(cleaned_chunks, convert_to_tensor=True)
print(chunk_embeddings)

cleaned_text = ""

def get_top_chunks(query):
    query_embedding = model.encode(query, convert_to_tensor=True)
    query_embedding_normalized = query_embedding / query_embedding.norm()

    similarities = torch.matmul(chunk_embeddings, query_embedding_normalized)
    print(similarities)
    top_indices = torch.topk(similarities, k=5).indices.tolist()
    print(top_indices)

    return [cleaned_chunks[i] for i in top_indices]

top_results = get_top_chunks("What are some good wizard characters?")
print(top_results)


client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")


def respond(message, history):
    response = ""
    # char_limit= 500

    top_chunks = get_top_chunks(message)
    context = "\n".join(top_chunks)

    messages = [
        {
            "role": "system",
            "content": (
                "You are a chatbot that helps users create characters for role-playing games. "
                "Use the following knowledge to inform your answers:\n\n" + context + "and keep your answers under 300 words."
            )
        }
    ]

    if history:
        messages.extend(history)

    messages.append({"role": "user", "content": message})

    stream = client.chat_completion(
        messages,
        max_tokens=300,
        temperature=1.2,
        stream=True
    )

    for message in stream:
        token = message.choices[0].delta.content
        if token is not None:
            response += token
            yield response

    # if len(response) > char_limit:
    #     response = response[:char_limit]

    # for punc in [".", "!", "?"]:
    #     i = response.rfind(punc)
    #     if i != -1:
    #         response = response[:i+1]
    #         break 

    # yield response
    
chatbot = gr.ChatInterface(respond, type="messages")


chatbot = gr.ChatInterface(
    respond,
    type="messages",
    examples=None,
    title="Character Creator",
    description="Welcome! Tell me what you want to create and we can make your character come to life!"
)


chatbot.launch()