File size: 2,383 Bytes
4e6a306
 
82f7e90
9da9b54
82f7e90
 
 
 
 
 
 
 
 
 
 
 
9da9b54
82f7e90
 
 
 
4e6a306
9da9b54
 
 
 
 
4e6a306
82f7e90
9da9b54
 
 
82f7e90
 
 
 
 
4e6a306
9da9b54
 
 
 
 
 
4e6a306
82f7e90
9da9b54
4e6a306
 
 
9da9b54
4e6a306
82f7e90
 
 
 
4e6a306
 
82f7e90
4e6a306
9da9b54
4e6a306
 
9da9b54
4e6a306
9da9b54
 
4e6a306
 
 
 
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
import gradio as gr
from huggingface_hub import InferenceClient
from PyPDF2 import PdfReader
import os

# PDF ํ…์ŠคํŠธ ๋ฏธ๋ฆฌ ์ฝ์–ด์˜ค๊ธฐ
def extract_pdf_text(pdf_paths):
    full_text = ""
    for path in pdf_paths:
        reader = PdfReader(path)
        for page in reader.pages:
            text = page.extract_text()
            if text:
                full_text += text + "\n"
    return full_text.strip()

# ๋ฏธ๋ฆฌ ์ง€์ •๋œ PDF ๋ฌธ์„œ๋“ค
pdf_context = extract_pdf_text([
    "assets/Programming-Fundamentals-1570222270.pdf",
    "assets/1๋ถ„ํŒŒ์ด์ฌ_๊ฐ•์˜์ž๋ฃŒ_์ „์ฒด.pdf"
])

# Inference Client ์„ค์ • - ๋ชจ๋ธ ๋ณ€๊ฒฝ๋จ
client = InferenceClient(
    model="mistralai/Mistral-7B-Instruct-v0.1",
    token=os.getenv("HUGGINGFACEHUB_API_TOKEN")  # ๋ฐ˜๋“œ์‹œ ๋“ฑ๋ก ํ•„์š”
)

def respond(message, history, system_message, max_tokens, temperature, top_p):
    messages = [{"role": "system", "content": system_message}]
    
    # history ๊ธฐ๋ฐ˜ message ๊ตฌ์„ฑ
    for user_msg, bot_msg in history:
        if user_msg:
            messages.append({"role": "user", "content": user_msg})
        if bot_msg:
            messages.append({"role": "assistant", "content": bot_msg})

    # ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ์งˆ๋ฌธ ๊ตฌ์„ฑ
    messages.append({
        "role": "user",
        "content": f"๋‹ค์Œ์€ ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค:\n\n{pdf_context}\n\n์งˆ๋ฌธ: {message}"
    })

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

demo = gr.ChatInterface(
    fn=respond,
    additional_inputs=[
        gr.Textbox(value="You are a helpful assistant answering based on the programming reference.", label="System message"),
        gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
        gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
        gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p"),
    ],
    title="๐Ÿ“˜ ํŒŒ์ด์ฌ API ๋ ˆํผ๋Ÿฐ์Šค ์ฑ—๋ด‡ (Mistral ๊ธฐ๋ฐ˜)",
    description="ํ•œ๊ตญ๊ณต๋Œ€ ์ˆ˜์—…์ž๋ฃŒ ๊ธฐ๋ฐ˜์œผ๋กœ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•˜๋Š” ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค."
)

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