jeongsoo commited on
Commit
a76f77b
ยท
1 Parent(s): 52a2853

Add application file

Browse files
Files changed (3) hide show
  1. app.py +49 -25
  2. app_rag.py +128 -0
  3. requirements.txt +1 -1
app.py CHANGED
@@ -470,13 +470,13 @@ class AutoRAGChatApp:
470
  except Exception as e:
471
  return f"์บ์‹œ ์ดˆ๊ธฐํ™” ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
472
 
473
- def process_query(self, query: str, chat_history: List[Tuple[str, str]]) -> Tuple[str, List[Tuple[str, str]]]:
474
  """
475
  ์‚ฌ์šฉ์ž ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ
476
 
477
  Args:
478
  query: ์‚ฌ์šฉ์ž ์งˆ๋ฌธ
479
- chat_history: ๋Œ€ํ™” ๊ธฐ๋ก
480
 
481
  Returns:
482
  ์‘๋‹ต ๋ฐ ์—…๋ฐ์ดํŠธ๋œ ๋Œ€ํ™” ๊ธฐ๋ก
@@ -484,37 +484,54 @@ class AutoRAGChatApp:
484
  if not query: # ๋น„์–ด์žˆ๋Š” ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ
485
  return "", chat_history
486
 
487
- if not self.is_initialized:
 
488
  response = "๋ฌธ์„œ ๋กœ๋“œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž๋™ ๋กœ๋“œ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค."
489
- chat_history.append((query, response))
 
490
 
491
  # ์ž๋™ ๋กœ๋“œ ์‹œ๋„
492
  try:
493
- self.auto_process_documents()
494
- if not self.is_initialized:
495
- response = "๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 'documents' ํด๋”์— PDF ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”."
496
- chat_history.append((query, response))
497
- return "", chat_history
 
 
 
498
  except Exception as e:
499
  response = f"๋ฌธ์„œ ๋กœ๋“œ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
500
- chat_history.append((query, response))
501
- return "", chat_history
 
 
 
502
 
503
  try:
504
  # RAG ์ฒด์ธ ์‹คํ–‰ ๋ฐ ์‘๋‹ต ์ƒ์„ฑ
505
  start_time = time.time()
 
506
  response = self.rag_chain.run(query)
507
  end_time = time.time()
508
 
509
  query_time = end_time - start_time
510
  print(f"์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„: {query_time:.2f}์ดˆ")
 
511
 
512
- chat_history.append((query, response))
513
- return "", chat_history
 
 
514
  except Exception as e:
515
  error_msg = f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
516
- chat_history.append((query, error_msg))
517
- return "", chat_history
 
 
 
 
 
518
 
519
  def process_voice_query(self, audio, chat_history: List[Tuple[str, str]]) -> List[Tuple[str, str]]:
520
  """
@@ -579,7 +596,8 @@ class AutoRAGChatApp:
579
  if not self.is_initialized or self.rag_chain is None:
580
  print("์Œ์„ฑ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ: ๋ฌธ์„œ ๋กœ๋“œ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.")
581
  response = "๋ฌธ์„œ ๋กœ๋“œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž๋™ ๋กœ๋“œ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค."
582
- chat_history.append((query, response))
 
583
 
584
  # ์ž๋™ ๋กœ๋“œ ์‹œ๋„
585
  try:
@@ -588,12 +606,14 @@ class AutoRAGChatApp:
588
 
589
  if not self.is_initialized or self.rag_chain is None:
590
  response = f"๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 'documents' ํด๋”์— PDF ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.\n์˜ค๋ฅ˜ ์ •๋ณด: {init_result}"
591
- chat_history.append((query, response))
592
- return chat_history
 
593
  except Exception as e:
594
  response = f"๋ฌธ์„œ ๋กœ๋“œ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
595
- chat_history.append((query, response))
596
- return chat_history
 
597
  else:
598
  print("์Œ์„ฑ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ: ๋ฌธ์„œ๊ฐ€ ์ด๋ฏธ ๋กœ๋“œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.")
599
 
@@ -608,15 +628,19 @@ class AutoRAGChatApp:
608
  print(f"์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„: {query_time:.2f}์ดˆ")
609
  print(f"์‘๋‹ต: {response[:100]}..." if len(response) > 100 else f"์‘๋‹ต: {response}")
610
 
611
- chat_history.append((query, response))
612
- return chat_history
 
 
613
  except Exception as e:
614
  error_msg = f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
615
  print(f"RAG ์ฒด์ธ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜: {error_msg}")
616
  import traceback
617
  traceback.print_exc()
618
- chat_history.append((query, error_msg))
619
- return chat_history
 
 
620
 
621
  except Exception as e:
622
  error_msg = f"์Œ์„ฑ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
@@ -736,7 +760,7 @@ class AutoRAGChatApp:
736
 
737
  # ๋Œ€ํ™” ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ
738
  clear_chat_button.click(
739
- fn=lambda: [],
740
  outputs=[chatbot]
741
  )
742
 
 
470
  except Exception as e:
471
  return f"์บ์‹œ ์ดˆ๊ธฐํ™” ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
472
 
473
+ def process_query(self, query: str, chat_history: List[List[str]]) -> Tuple[str, List[List[str]]]:
474
  """
475
  ์‚ฌ์šฉ์ž ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ
476
 
477
  Args:
478
  query: ์‚ฌ์šฉ์ž ์งˆ๋ฌธ
479
+ chat_history: ๋Œ€ํ™” ๊ธฐ๋ก (๋ฆฌ์ŠคํŠธ ํ˜•์‹)
480
 
481
  Returns:
482
  ์‘๋‹ต ๋ฐ ์—…๋ฐ์ดํŠธ๋œ ๋Œ€ํ™” ๊ธฐ๋ก
 
484
  if not query: # ๋น„์–ด์žˆ๋Š” ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ
485
  return "", chat_history
486
 
487
+ if not self.is_initialized or self.rag_chain is None:
488
+ print("ํ…์ŠคํŠธ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ: ๋ฌธ์„œ ๋กœ๋“œ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.")
489
  response = "๋ฌธ์„œ ๋กœ๋“œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž๋™ ๋กœ๋“œ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค."
490
+ new_history = list(chat_history)
491
+ new_history.append([query, response])
492
 
493
  # ์ž๋™ ๋กœ๋“œ ์‹œ๋„
494
  try:
495
+ init_result = self.auto_process_documents()
496
+ print(f"[DEBUG] ์ž๋™ ๋กœ๋“œ ํ›„ is_initialized = {self.is_initialized}, RAG ์ฒด์ธ ์กด์žฌ = {self.rag_chain is not None}")
497
+
498
+ if not self.is_initialized or self.rag_chain is None:
499
+ response = f"๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 'documents' ํด๋”์— PDF ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.\n์˜ค๋ฅ˜ ์ •๋ณด: {init_result}"
500
+ new_history = list(chat_history)
501
+ new_history.append([query, response])
502
+ return "", new_history
503
  except Exception as e:
504
  response = f"๋ฌธ์„œ ๋กœ๋“œ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
505
+ new_history = list(chat_history)
506
+ new_history.append([query, response])
507
+ return "", new_history
508
+ else:
509
+ print("ํ…์ŠคํŠธ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ: ๋ฌธ์„œ๊ฐ€ ์ด๋ฏธ ๋กœ๋“œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.")
510
 
511
  try:
512
  # RAG ์ฒด์ธ ์‹คํ–‰ ๋ฐ ์‘๋‹ต ์ƒ์„ฑ
513
  start_time = time.time()
514
+ print(f"RAG ์ฒด์ธ ์‹คํ–‰ ์ค‘: ์ฟผ๋ฆฌ = '{query}'")
515
  response = self.rag_chain.run(query)
516
  end_time = time.time()
517
 
518
  query_time = end_time - start_time
519
  print(f"์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„: {query_time:.2f}์ดˆ")
520
+ print(f"์‘๋‹ต: {response[:100]}..." if len(response) > 100 else f"์‘๋‹ต: {response}")
521
 
522
+ # ๋ฉ”์‹œ์ง€ ํ˜•์‹์— ๋งž๊ฒŒ ์ถ”๊ฐ€
523
+ new_history = list(chat_history)
524
+ new_history.append([query, response])
525
+ return "", new_history
526
  except Exception as e:
527
  error_msg = f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
528
+ print(f"RAG ์ฒด์ธ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜: {error_msg}")
529
+ import traceback
530
+ traceback.print_exc()
531
+
532
+ new_history = list(chat_history)
533
+ new_history.append([query, error_msg])
534
+ return "", new_history
535
 
536
  def process_voice_query(self, audio, chat_history: List[Tuple[str, str]]) -> List[Tuple[str, str]]:
537
  """
 
596
  if not self.is_initialized or self.rag_chain is None:
597
  print("์Œ์„ฑ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ: ๋ฌธ์„œ ๋กœ๋“œ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.")
598
  response = "๋ฌธ์„œ ๋กœ๋“œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž๋™ ๋กœ๋“œ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค."
599
+ new_history = list(chat_history)
600
+ new_history.append([query, response])
601
 
602
  # ์ž๋™ ๋กœ๋“œ ์‹œ๋„
603
  try:
 
606
 
607
  if not self.is_initialized or self.rag_chain is None:
608
  response = f"๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 'documents' ํด๋”์— PDF ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.\n์˜ค๋ฅ˜ ์ •๋ณด: {init_result}"
609
+ new_history = list(chat_history)
610
+ new_history.append([query, response])
611
+ return new_history
612
  except Exception as e:
613
  response = f"๋ฌธ์„œ ๋กœ๋“œ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
614
+ new_history = list(chat_history)
615
+ new_history.append([query, response])
616
+ return new_history
617
  else:
618
  print("์Œ์„ฑ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ: ๋ฌธ์„œ๊ฐ€ ์ด๋ฏธ ๋กœ๋“œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.")
619
 
 
628
  print(f"์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„: {query_time:.2f}์ดˆ")
629
  print(f"์‘๋‹ต: {response[:100]}..." if len(response) > 100 else f"์‘๋‹ต: {response}")
630
 
631
+ # ๋ฉ”์‹œ์ง€ ํ˜•์‹์— ๋งž๊ฒŒ ์ถ”๊ฐ€
632
+ new_history = list(chat_history) # ๊ธฐ์กด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณต์‚ฌ
633
+ new_history.append([query, response]) # ๋ฆฌ์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ถ”๊ฐ€
634
+ return new_history
635
  except Exception as e:
636
  error_msg = f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
637
  print(f"RAG ์ฒด์ธ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜: {error_msg}")
638
  import traceback
639
  traceback.print_exc()
640
+ # ๋ฉ”์‹œ์ง€ ํ˜•์‹์— ๋งž๊ฒŒ ์ถ”๊ฐ€
641
+ new_history = list(chat_history) # ๊ธฐ์กด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณต์‚ฌ
642
+ new_history.append([query, error_msg]) # ๋ฆฌ์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ถ”๊ฐ€
643
+ return new_history
644
 
645
  except Exception as e:
646
  error_msg = f"์Œ์„ฑ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
 
760
 
761
  # ๋Œ€ํ™” ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ
762
  clear_chat_button.click(
763
+ fn=lambda: [], # ๋นˆ ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜
764
  outputs=[chatbot]
765
  )
766
 
app_rag.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ ์•ฑ์— ๋‚ด์žฅ๋œ ๊ฐ„๋‹จํ•œ RAG ์ฒด์ธ ๊ตฌํ˜„
3
+ """
4
+ from typing import List, Dict, Any, Optional
5
+ import os
6
+ from config import OPENAI_API_KEY, LLM_MODEL, USE_OPENAI, TOP_K_RETRIEVAL
7
+
8
+ # ์•ˆ์ „ํ•œ ์ž„ํฌํŠธ
9
+ try:
10
+ from langchain_openai import ChatOpenAI
11
+ from langchain.prompts import PromptTemplate
12
+ from langchain_core.output_parsers import StrOutputParser
13
+ from langchain_core.runnables import RunnablePassthrough
14
+ LANGCHAIN_IMPORTS_AVAILABLE = True
15
+ except ImportError:
16
+ print("[APP_RAG] langchain ๊ด€๋ จ ํŒจํ‚ค์ง€๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
17
+ LANGCHAIN_IMPORTS_AVAILABLE = False
18
+
19
+ class SimpleRAGChain:
20
+ """
21
+ ๊ฐ„๋‹จํ•œ RAG ์ฒด์ธ ๊ตฌํ˜„ (์•ฑ์— ๋‚ด์žฅ)
22
+ """
23
+ def __init__(self, vector_store):
24
+ """๊ฐ„๋‹จํ•œ RAG ์ฒด์ธ ์ดˆ๊ธฐํ™”"""
25
+ print("[APP_RAG] ๊ฐ„๋‹จํ•œ RAG ์ฒด์ธ ์ดˆ๊ธฐํ™” ์ค‘...")
26
+ self.vector_store = vector_store
27
+
28
+ if not LANGCHAIN_IMPORTS_AVAILABLE:
29
+ print("[APP_RAG] langchain ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์–ด RAG ์ฒด์ธ์„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
30
+ raise ImportError("RAG ์ฒด์ธ ์ดˆ๊ธฐํ™”์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")
31
+
32
+ # API ํ‚ค ํ™•์ธ
33
+ if not OPENAI_API_KEY and USE_OPENAI:
34
+ print("[APP_RAG] ๊ฒฝ๊ณ : OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")
35
+ raise ValueError("OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")
36
+
37
+ try:
38
+ # LLM ์ดˆ๊ธฐํ™”
39
+ if USE_OPENAI:
40
+ self.llm = ChatOpenAI(
41
+ model_name=LLM_MODEL,
42
+ temperature=0.2,
43
+ api_key=OPENAI_API_KEY,
44
+ )
45
+ print(f"[APP_RAG] OpenAI ๋ชจ๋ธ ์ดˆ๊ธฐํ™”: {LLM_MODEL}")
46
+ else:
47
+ try:
48
+ # Ollama ์‚ฌ์šฉ ์‹œ๋„
49
+ from langchain_community.chat_models import ChatOllama
50
+ from config import OLLAMA_HOST
51
+
52
+ self.llm = ChatOllama(
53
+ model=LLM_MODEL,
54
+ temperature=0.2,
55
+ base_url=OLLAMA_HOST,
56
+ )
57
+ print(f"[APP_RAG] Ollama ๋ชจ๋ธ ์ดˆ๊ธฐํ™”: {LLM_MODEL}")
58
+ except ImportError:
59
+ # Ollama ๊ฐ€์ ธ์˜ค๊ธฐ ์‹คํŒจ ์‹œ OpenAI ์‚ฌ์šฉ
60
+ self.llm = ChatOpenAI(
61
+ model_name="gpt-3.5-turbo",
62
+ temperature=0.2,
63
+ api_key=OPENAI_API_KEY,
64
+ )
65
+ print("[APP_RAG] Ollama๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด OpenAI๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.")
66
+
67
+ # ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ
68
+ template = """
69
+ ๋‹ค์Œ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์งˆ๋ฌธ์— ์ •ํ™•ํ•˜๊ฒŒ ๋‹ต๋ณ€ํ•ด์ฃผ์„ธ์š”.
70
+
71
+ ์งˆ๋ฌธ: {question}
72
+
73
+ ์ฐธ๊ณ  ์ •๋ณด:
74
+ {context}
75
+
76
+ ์ฐธ๊ณ  ์ •๋ณด์— ๋‹ต์ด ์—†๋Š” ๊ฒฝ์šฐ "์ œ๊ณต๋œ ๋ฌธ์„œ์—์„œ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๋‹ต๋ณ€ํ•˜์„ธ์š”.
77
+ ๋‹ต๋ณ€์€ ์ •ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ œ๊ณตํ•˜๋˜, ์ฐธ๊ณ  ์ •๋ณด์—์„œ ๊ทผ๊ฑฐ๋ฅผ ์ฐพ์•„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
78
+ ์ฐธ๊ณ  ์ •๋ณด์˜ ์ถœ์ฒ˜๋„ ํ•จ๊ป˜ ์•Œ๋ ค์ฃผ์„ธ์š”.
79
+ """
80
+
81
+ self.prompt = PromptTemplate.from_template(template)
82
+
83
+ # ์ฒด์ธ ๊ตฌ์„ฑ
84
+ self.chain = (
85
+ {"context": self._retrieve, "question": RunnablePassthrough()}
86
+ | self.prompt
87
+ | self.llm
88
+ | StrOutputParser()
89
+ )
90
+ print("[APP_RAG] RAG ์ฒด์ธ ์ดˆ๊ธฐํ™” ์™„๋ฃŒ")
91
+ except Exception as e:
92
+ print(f"[APP_RAG] RAG ์ฒด์ธ ์ดˆ๊ธฐํ™” ์‹คํŒจ: {e}")
93
+ import traceback
94
+ traceback.print_exc()
95
+ raise
96
+
97
+ def _retrieve(self, query):
98
+ """๋ฌธ์„œ ๊ฒ€์ƒ‰"""
99
+ try:
100
+ docs = self.vector_store.similarity_search(query, k=TOP_K_RETRIEVAL)
101
+
102
+ # ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ปจํ…์ŠคํŠธ ๊ตฌ์„ฑ
103
+ context_parts = []
104
+ for i, doc in enumerate(docs, 1):
105
+ source = doc.metadata.get("source", "์•Œ ์ˆ˜ ์—†๋Š” ์ถœ์ฒ˜")
106
+ page = doc.metadata.get("page", "")
107
+ source_info = f"{source}"
108
+ if page:
109
+ source_info += f" (ํŽ˜์ด์ง€: {page})"
110
+
111
+ context_parts.append(f"[์ฐธ๊ณ ์ž๋ฃŒ {i}] - ์ถœ์ฒ˜: {source_info}\n{doc.page_content}\n")
112
+
113
+ return "\n".join(context_parts)
114
+ except Exception as e:
115
+ print(f"[APP_RAG] ๊ฒ€์ƒ‰ ์ค‘ ์˜ค๋ฅ˜: {e}")
116
+ import traceback
117
+ traceback.print_exc()
118
+ return "๋ฌธ์„œ ๊ฒ€์ƒ‰ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."
119
+
120
+ def run(self, query):
121
+ """์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ"""
122
+ try:
123
+ return self.chain.invoke(query)
124
+ except Exception as e:
125
+ print(f"[APP_RAG] ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜: {e}")
126
+ import traceback
127
+ traceback.print_exc()
128
+ return f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
requirements.txt CHANGED
@@ -1,6 +1,7 @@
1
  langchain>=0.1.0
2
  langchain-community>=0.0.10
3
  langchain-huggingface>=0.0.1
 
4
  sentence-transformers>=2.2.2
5
  faiss-cpu>=1.7.4
6
  pypdf>=3.15.1
@@ -8,7 +9,6 @@ gradio>=4.0.0
8
  python-dotenv>=1.0.0
9
  torch>=2.0.0
10
  transformers>=4.34.0
11
- langchain-openai>=0.0.2
12
  openai>=1.0.0
13
  docling>=0.1.3
14
  requests>=2.28.0
 
1
  langchain>=0.1.0
2
  langchain-community>=0.0.10
3
  langchain-huggingface>=0.0.1
4
+ langchain-openai>=0.0.2
5
  sentence-transformers>=2.2.2
6
  faiss-cpu>=1.7.4
7
  pypdf>=3.15.1
 
9
  python-dotenv>=1.0.0
10
  torch>=2.0.0
11
  transformers>=4.34.0
 
12
  openai>=1.0.0
13
  docling>=0.1.3
14
  requests>=2.28.0