File size: 3,371 Bytes
6711e4a
 
5b2c980
6711e4a
5f509da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5b2c980
6711e4a
5f509da
 
 
 
 
6711e4a
 
 
 
 
 
 
 
5b2c980
6711e4a
5b2c980
6711e4a
5b2c980
 
 
 
 
 
 
 
 
6711e4a
5b2c980
 
 
 
 
 
 
6711e4a
5b2c980
 
6711e4a
 
 
5b2c980
 
6711e4a
5b2c980
 
 
 
6711e4a
5b2c980
6711e4a
5b2c980
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6711e4a
 
 
 
5b2c980
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
import gradio as gr
from huggingface_hub import InferenceClient
import requests

def wiki_info(frage: str) -> str:
    search_url = "https://de.wikipedia.org/w/api.php"
    search_params = {
        "action": "query",
        "list": "search",
        "srsearch": frage,
        "format": "json"
    }

    r = requests.get(search_url, params=search_params)
    data = r.json()

    suchergebnisse = data.get("query", {}).get("search", [])
    if not suchergebnisse:
        return None

    pageid = suchergebnisse[0]["pageid"]

    # 2. Volltext laden
    page_url = "https://de.wikipedia.org/w/api.php"
    page_params = {
        "action": "query",
        "prop": "extracts",
        "pageids": pageid,
        "explaintext": 1,
        "format": "json"
    }

    r2 = requests.get(page_url, params=page_params)
    page_data = r2.json()

    pages = page_data.get("query", {}).get("pages", {})
    page = pages.get(str(pageid), {})

    text = page.get("extract")
    if not text:
        return None

    saetze = re.split(r'(?<=[.!?]) +', text)
    gekuerzt = " ".join(saetze[:10])

    return gekuerzt

def respond(
    message,
    history: list[dict[str, str]],
    system_message,
    max_tokens,
    temperature,
    top_p,
    hf_token: gr.OAuthToken,
    use_wiki # Checkbox Input
):
    client = InferenceClient(token=hf_token.token, model="meta-llama/Llama-3.2-1B-Instruct")

    # --- HIER PASSIERT DAS IN-CONTEXT LEARNING ---
    context_text = ""
    if use_wiki:
        wiki_content = get_wikipedia_summary(message)
        if wiki_content:
            context_text = f"\n\nEXTERNER KONTEXT (WIKIPEDIA): {wiki_content}\n"
            gr.Info(f"Kontext gefunden: {wiki_content[:50]}...") # Kleines UI Feedback
        else:
            gr.Info("Kein Wikipedia-Artikel gefunden.")

    # Der Prompt zwingt das Modell, den Kontext zu nutzen
    final_system_prompt = (
        f"{system_message} "
        f"Wenn 'EXTERNER KONTEXT' bereitgestellt wird, nutze dieses Wissen, um die Frage zu beantworten. "
        f"Verlasse dich mehr auf den Kontext als auf dein eigenes Wissen."
        f"{context_text}"
    )

    messages = [{"role": "system", "content": final_system_prompt}]
    messages.extend(history)
    messages.append({"role": "user", "content": message})

    response = ""
    for msg in client.chat_completion(
        messages, max_tokens=max_tokens, stream=True, temperature=temperature, top_p=top_p,
    ):
        token = msg.choices[0].delta.content
        if token:
            response += token
            yield response

# --- GUI ---
with gr.Blocks() as demo:
    gr.Markdown("# 🧠 Der Wikipedia-gestützte Assistent")
    gr.Markdown("Stelle eine Frage. Wenn du die Checkbox aktivierst, suche ich live nach Fakten!")
    
    with gr.Row():
        wiki_checkbox = gr.Checkbox(label="Nutze Wikipedia-Wissen (RAG)", value=True)

    chatbot = gr.ChatInterface(
        respond,
        additional_inputs=[
            gr.Textbox(value="Du bist ein hilfreicher Assistent der Dinge genau und exakt erklärt.", label="System"),
            gr.Slider(1, 1024, 512, label="Max Tokens"),
            gr.Slider(0.1, 2.0, 0.7, label="Temp"),
            gr.Slider(0.1, 1.0, 0.95, label="Top-p"),
            wiki_checkbox
        ]
    )
    with gr.Sidebar():
        gr.LoginButton()

if __name__ == "__main__":
    demo.launch()