yoon2566 commited on
Commit
8384bbc
ยท
verified ยท
1 Parent(s): 47b82fb

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +97 -0
app.py ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import gradio as gr
3
+ from langchain_openai import ChatOpenAI
4
+ from langchain_experimental.agents import create_pandas_dataframe_agent
5
+ from langchain.agents.agent_types import AgentType
6
+ from langchain.memory import ConversationBufferMemory
7
+ import os
8
+
9
+ # OpenAI API ํ‚ค ์„ค์ • (ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๊ถŒ์žฅ)
10
+ # Hugging Face Spaces์— ๋ฐฐํฌ ์‹œ Secrets์— OPENAI_API_KEY๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
11
+ # ๋กœ์ปฌ์—์„œ ์‹คํ–‰ ์‹œ .env ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
12
+ # ์˜ˆ์‹œ: os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"
13
+
14
+ # CSV ํŒŒ์ผ ๋กœ๋“œ
15
+ CSV_FILE_PATH = "2.csv"
16
+ try:
17
+ df = pd.read_csv("https://github.com/kairess/toy-datasets/raw/master/titanic.csv")
18
+ except FileNotFoundError:
19
+ print(f"Error: '{CSV_FILE_PATH}' ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”.")
20
+ # Gradio ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
21
+ # ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ๋นˆ DataFrame์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
22
+ df = pd.DataFrame() # ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๋นˆ DataFrame์œผ๋กœ ์ง„ํ–‰
23
+ except Exception as e:
24
+ print(f"CSV ํŒŒ์ผ ๋กœ๋“œ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")
25
+ df = pd.DataFrame()
26
+
27
+ # LLM ๋ชจ๋ธ ์„ค์ •
28
+ # gpt-4o-mini ๋ชจ๋ธ ์‚ฌ์šฉ
29
+ llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
30
+
31
+ # ๋Œ€ํ™” ๊ธฐ๋ก์„ ์œ„ํ•œ Memory ์„ค์ •
32
+ # ์ฑ—๋ด‡์ด ์ด์ „ ๋Œ€ํ™”๋ฅผ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
33
+ memory = ConversationBufferMemory(memory_key="chat_history")
34
+
35
+ # Pandas DataFrame Agent ์ƒ์„ฑ
36
+ # allow_dangerous_code=True ์„ค์ • ์‹œ ๋ณด์•ˆ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
37
+ # ๋ฉ”๋ชจ๋ฆฌ๋ฅผ Agent์— ์—ฐ๊ฒฐํ•˜์—ฌ ๋Œ€ํ™” ๊ธฐ๋ก์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
38
+ if not df.empty:
39
+ agent = create_pandas_dataframe_agent(
40
+ llm,
41
+ df,
42
+ verbose=True,
43
+ agent_type=AgentType.OPENAI_FUNCTIONS, # ๋˜๋Š” AgentType.ZERO_SHOT_REACT_DESCRIPTION
44
+ allow_dangerous_code=True,
45
+ memory=memory # ๋ฉ”๋ชจ๋ฆฌ ์—ฐ๊ฒฐ
46
+ )
47
+ else:
48
+ agent = None # DataFrame ๋กœ๋“œ ์‹คํŒจ ์‹œ Agent ์ƒ์„ฑ ์•ˆ ํ•จ
49
+
50
+ # ์ฑ—๋ด‡ ์˜ˆ์ธก ํ•จ์ˆ˜
51
+ def predict(message, history):
52
+ # Gradio history ํ˜•์‹์„ LangChain history ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
53
+ # ConversationBufferMemory๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ณ€ํ™˜ ๊ณผ์ •์ด Agent ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
54
+ # ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ๋Š” ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€๋งŒ Agent์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
55
+
56
+ if agent is None:
57
+ return "CSV ํŒŒ์ผ์„ ๋กœ๋“œํ•  ์ˆ˜ ์—†์–ด ์ฑ—๋ด‡์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."
58
+
59
+ try:
60
+ # Agent ์‹คํ–‰. run ๋Œ€์‹  invoke๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์œ ์—ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
61
+ # invoke๋Š” ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
62
+ response = agent.invoke({"input": message})
63
+ # invoke ๊ฒฐ๊ณผ์—์„œ ์‘๋‹ต ํ…์ŠคํŠธ ์ถ”์ถœ
64
+ gpt_response = response.get('output', '์‘๋‹ต ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.')
65
+ except Exception as e:
66
+ print(f"์—์ด์ „ํŠธ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")
67
+ gpt_response = f"์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {e}"
68
+
69
+ # Gradio history ํ˜•์‹์— ๋งž์ถฐ ์‘๋‹ต ๋ฐ˜ํ™˜
70
+ # history๋Š” [[user_msg, bot_msg], [user_msg, bot_msg], ...] ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
71
+ # Gradio ChatInterface๋Š” ์ž๋™์œผ๋กœ ์ด์ „ ๋Œ€ํ™”๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ,
72
+ # ์—ฌ๊ธฐ์„œ๋Š” ํ˜„์žฌ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€์™€ Agent์˜ ์‘๋‹ต๋งŒ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
73
+ # ChatInterface์˜ predict ํ•จ์ˆ˜๋Š” (message, history)๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ 
74
+ # ์—…๋ฐ์ดํŠธ๋œ history๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
75
+ # Gradio 4.0๋ถ€ํ„ฐ๋Š” history ์ธ์ž๋ฅผ dictionary ํ˜•ํƒœ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.
76
+ # history๋Š” {"user": [...], "assistant": [...]} ํ˜•ํƒœ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
77
+
78
+ # ChatInterface์˜ 'messages' type์— ๋งž์ถฐ history๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ฐ˜ํ™˜
79
+ # history๋Š” [['user_message', 'bot_message'], ...] ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
80
+ # Gradio ChatInterface๋Š” ์ด ํ˜•์‹์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.
81
+ return gpt_response
82
+
83
+ # Gradio ChatInterface ์„ค์ •
84
+ # ChatInterface๋Š” history ๊ด€๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
85
+ # predict ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์‘๋‹ต๋งŒ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.
86
+ demo = gr.ChatInterface(
87
+ predict,
88
+ # type="messages", # ChatInterface๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ "messages" ํƒ€์ž…
89
+ title="CSV ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์ฑ—๋ด‡",
90
+ description=f"{CSV_FILE_PATH} ํŒŒ์ผ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค.",
91
+ )
92
+
93
+ # Gradio ์•ฑ ์‹คํ–‰
94
+ # share=True ์„ค์ • ์‹œ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ž„์‹œ ๋งํฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค (๋””๋ฒ„๊น… ๋ชฉ์ ).
95
+ # Hugging Face Spaces์— ๋ฐฐํฌ ์‹œ share=False๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
96
+ if __name__ == "__main__":
97
+ demo.launch()