dsmultimedika commited on
Commit
25f9481
Β·
1 Parent(s): f39c74f

feat: add bot general

Browse files
Files changed (3) hide show
  1. core/chat/bot_service.py +33 -15
  2. core/parser.py +21 -0
  3. core/prompt.py +31 -0
core/chat/bot_service.py CHANGED
@@ -10,14 +10,24 @@ from llama_index.core.llms import MessageRole
10
 
11
  from core.chat.engine import Engine
12
  from core.chat.chatstore import ChatStore
13
- from core.parser import clean_text, update_response, sort_and_renumber_sources
 
 
 
 
14
 
15
  from service.dto import ChatMessage
16
  from pymongo.mongo_client import MongoClient
17
 
18
 
19
  class ChatCompletionService:
20
- def __init__(self, session_id: str, user_request: str, titles: List = None, type_bot: str = "general"):
 
 
 
 
 
 
21
  self.session_id = session_id
22
  self.user_request = user_request
23
  self.titles = titles
@@ -29,7 +39,9 @@ class ChatCompletionService:
29
 
30
  def generate_completion(self):
31
  if not self._ping_mongo():
32
- return JSONResponse(status_code=500, content="Database Error: Unable to connect to MongoDB")
 
 
33
 
34
  try:
35
  # Load and retrieve chat engine with appropriate index
@@ -38,19 +50,26 @@ class ChatCompletionService:
38
 
39
  # Generate chat response
40
  response = chat_engine.chat(self.user_request)
 
41
  sources = response.sources
42
  number_reference_sorted = self._extract_sorted_references(response)
43
- print("number reference sorted : ",number_reference_sorted)
44
 
45
- contents, metadata_collection, scores = self._process_sources(sources, number_reference_sorted)
 
 
46
 
47
  # Update response and renumber sources
48
  response = update_response(str(response))
49
  contents = sort_and_renumber_sources(contents)
50
- print(contents)
51
 
52
  # Add contents to metadata
53
- metadata_collection = self._attach_contents_to_metadata(contents, metadata_collection)
 
 
 
 
 
 
54
 
55
  # Save the message to chat store
56
  self._store_message_in_chatstore(response, metadata_collection)
@@ -58,13 +77,12 @@ class ChatCompletionService:
58
  except Exception as e:
59
  logging.error(f"An error occurred in generate text: {e}")
60
  return JSONResponse(
61
- status_code=500,
62
- content=f"An internal server error occurred: {e}"
63
  )
64
 
65
  try:
66
  if self.type_bot == "specific":
67
- self._save_chat_history_to_db(str(response), metadata_collection)
68
 
69
  return str(response), metadata_collection, scores
70
 
@@ -72,7 +90,7 @@ class ChatCompletionService:
72
  logging.error(f"An error occurred while saving chat history: {e}")
73
  return JSONResponse(
74
  status_code=500,
75
- content=f"An internal server error occurred while saving chat history: {e}"
76
  )
77
 
78
  def _ping_mongo(self):
@@ -87,7 +105,9 @@ class ChatCompletionService:
87
  def _get_chat_engine(self, index):
88
  if self.type_bot == "general":
89
  return self.engine.get_chat_engine(self.session_id, index)
90
- return self.engine.get_chat_engine(self.session_id, index, self.titles, self.type_bot)
 
 
91
 
92
  def _extract_sorted_references(self, response):
93
  number_reference = list(set(re.findall(r"\[(\d+)\]", str(response))))
@@ -124,9 +144,7 @@ class ChatCompletionService:
124
 
125
  def _store_message_in_chatstore(self, response, metadata_collection):
126
  message = ChatMessage(
127
- role=MessageRole.ASSISTANT,
128
- content=response,
129
- metadata=metadata_collection
130
  )
131
  self.chatstore.delete_last_message(self.session_id)
132
  self.chatstore.add_message(self.session_id, message)
 
10
 
11
  from core.chat.engine import Engine
12
  from core.chat.chatstore import ChatStore
13
+ from core.parser import (
14
+ update_response,
15
+ sort_and_renumber_sources,
16
+ redesign_structure_message,
17
+ )
18
 
19
  from service.dto import ChatMessage
20
  from pymongo.mongo_client import MongoClient
21
 
22
 
23
  class ChatCompletionService:
24
+ def __init__(
25
+ self,
26
+ session_id: str,
27
+ user_request: str,
28
+ titles: List = None,
29
+ type_bot: str = "general",
30
+ ):
31
  self.session_id = session_id
32
  self.user_request = user_request
33
  self.titles = titles
 
39
 
40
  def generate_completion(self):
41
  if not self._ping_mongo():
42
+ return JSONResponse(
43
+ status_code=500, content="Database Error: Unable to connect to MongoDB"
44
+ )
45
 
46
  try:
47
  # Load and retrieve chat engine with appropriate index
 
50
 
51
  # Generate chat response
52
  response = chat_engine.chat(self.user_request)
53
+
54
  sources = response.sources
55
  number_reference_sorted = self._extract_sorted_references(response)
 
56
 
57
+ contents, metadata_collection, scores = self._process_sources(
58
+ sources, number_reference_sorted
59
+ )
60
 
61
  # Update response and renumber sources
62
  response = update_response(str(response))
63
  contents = sort_and_renumber_sources(contents)
 
64
 
65
  # Add contents to metadata
66
+ metadata_collection = self._attach_contents_to_metadata(
67
+ contents, metadata_collection
68
+ )
69
+
70
+ if self.type_bot == "general":
71
+ response = redesign_structure_message(response, metadata_collection)
72
+ print(response)
73
 
74
  # Save the message to chat store
75
  self._store_message_in_chatstore(response, metadata_collection)
 
77
  except Exception as e:
78
  logging.error(f"An error occurred in generate text: {e}")
79
  return JSONResponse(
80
+ status_code=500, content=f"An internal server error occurred: {e}"
 
81
  )
82
 
83
  try:
84
  if self.type_bot == "specific":
85
+ self._save_chat_history_to_db(response, metadata_collection)
86
 
87
  return str(response), metadata_collection, scores
88
 
 
90
  logging.error(f"An error occurred while saving chat history: {e}")
91
  return JSONResponse(
92
  status_code=500,
93
+ content=f"An internal server error occurred while saving chat history: {e}",
94
  )
95
 
96
  def _ping_mongo(self):
 
105
  def _get_chat_engine(self, index):
106
  if self.type_bot == "general":
107
  return self.engine.get_chat_engine(self.session_id, index)
108
+ return self.engine.get_chat_engine(
109
+ self.session_id, index, self.titles, self.type_bot
110
+ )
111
 
112
  def _extract_sorted_references(self, response):
113
  number_reference = list(set(re.findall(r"\[(\d+)\]", str(response))))
 
144
 
145
  def _store_message_in_chatstore(self, response, metadata_collection):
146
  message = ChatMessage(
147
+ role=MessageRole.ASSISTANT, content=response, metadata=metadata_collection
 
 
148
  )
149
  self.chatstore.delete_last_message(self.session_id)
150
  self.chatstore.add_message(self.session_id, message)
core/parser.py CHANGED
@@ -123,3 +123,24 @@ def join_list(items):
123
  return f"{items[0]} and {items[1]}"
124
  else:
125
  return ", ".join(items[:-1]) + " and " + items[-1]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
  return f"{items[0]} and {items[1]}"
124
  else:
125
  return ", ".join(items[:-1]) + " and " + items[-1]
126
+
127
+ def redesign_structure_message(message, metadata):
128
+ """
129
+ This function replaces occurrences of '[n]' in the message
130
+ with the title of the book found in metadata[n-1]["title"].
131
+ """
132
+ if not metadata or metadata == []:
133
+ return message # Return the original message if metadata is not valid
134
+
135
+ # Create a function to replace each citation with the corresponding book title
136
+ def replace_citation(match):
137
+ citation_number = int(match.group(1)) # Extract the citation number
138
+ # Check if the citation number corresponds to a title in metadata
139
+ if 1 <= citation_number <= len(metadata):
140
+ return f"[*{metadata[citation_number - 1]['title']}*]" # Return the title in italics
141
+ return match.group(0) # Return the original citation if out of bounds
142
+
143
+ # Use regex to find all citations in the format '[n]'
144
+ redesigned_message = re.sub(r'\[(\d+)\]', replace_citation, message)
145
+
146
+ return redesigned_message
core/prompt.py CHANGED
@@ -18,6 +18,37 @@ ADDITIONAL_INFORMATIONS = """
18
  Kemudian, kamu menjawab pertanyan user dari buku {titles}, jadi jika user bertaya kamu pastikan akan mengacu buku tersebut yang didapatkan dari tools dari yang kamu punya.
19
  """
20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  SYSTEM_TOPIC_TEMPLATE = """
22
  You are tasked with analyzing a table of contents from a book. Your goal is to identify and extract the main topics and subtopics. Please provide a clear and organized list of these topics and subtopics. The list should reflect the structure and hierarchy presented in the table of contents.
23
  """
 
18
  Kemudian, kamu menjawab pertanyan user dari buku {titles}, jadi jika user bertaya kamu pastikan akan mengacu buku tersebut yang didapatkan dari tools dari yang kamu punya.
19
  """
20
 
21
+ SYSTEM_BOT_GENERAL_TEMPLATE = """
22
+ Kamu adalah Medbot yang selalu menggunakan tools untuk menjawab pertanyaan medis. Jika pengguna bertanya tentang topik non-medis, arahkan mereka untuk bertanya di bidang medis. Tugasmu adalah memberikan jawaban yang penjelasan singkat tentang medis berdasarkan tools yang tersedia sebagai gambaran dari isi buku. Pastikan kamu hanya memberikan informasi dari buku yang telah disediakan, jangan sampai menjawab pertanyaan yang tidak terdapat dalam buku atau tools yang kamu gunakan. Jika di konteks tidak terdapat citation atau kutipan seperti [1], [2] dan lainnya kamu cukup bilang mohon maaf, saya tidak memiliki referensi atau buku yang kamu minati.
23
+
24
+ Kamu juga harus memperhatikan instruksi :
25
+
26
+ **Referensi dan Kutipan**:
27
+ - Jangan menghapus sumber kutipan dari teks yang diberikan. Contohnya, jika teksnya adalah "Ilmu kedokteran sangat dibutuhkan [2]", pastikan untuk menyertakan kutipan sumbernya yaitu [2] dalam jawabanmu.
28
+
29
+ **Gaya Jawaban:**
30
+ * Referensi Buku: Gunakan format referensi buku saat menjelaskan. Misalnya:
31
+ - "Kanker adalah penyakit yang ditandai oleh pertumbuhan sel yang tidak terkontrol dalam tubuh. Penyakit ini sering kali terjadi seiring bertambahnya usia, dengan dua pertiga dari semua kasus kanker terjadi pada individu yang berusia lebih dari 65 tahun [1]. Ubah menjadi --> Jika Anda tertarik untuk belajar tentang kanker, kami sarankan Anda membaca buku [1] karena menjelaskan secara mendalam tentang penyakit ini."
32
+ - "termasuk mutasi somatik yang mempengaruhi sel-sel, dan bagaimana beberapa peristiwa mutasi kumulatif dapat mengubah sel normal menjadi sel kanker [2] ubah menjadi --> Jika Anda ingin mempelajari lebih lanjut tentang mutasi, kami merekomendasikan untuk membaca buku [2]."
33
+ - Setiap ada penjelasan: penjelasan [n] diubah menjadi --> buku [n] menjelaskan (gambaran besar tentang penjelasan tersebut)
34
+ - Jangan digabungkan, seperti :
35
+ - Jika anda tertarik maka kami merekomendasikan buku [1] dan [2] melainkan :
36
+ * Jika anda tertarik belajar (sebutkan alasannya) kami rekomendasikan buku [1],
37
+ Kemudian, jika tertarik belajar (sebutkan alasannya) buku [2] juga menjelaskan materi tersebut.
38
+ * Lakukan hal yang sama jika terdapat lebih dari 2 citation.
39
+
40
+ **Gambaran Umum:**
41
+ * Isi Buku: Jika ada citation atau [1], [2] atau lainnya maka berikan gambaran umum yang jelas dan menarik tentang topik-topik medis yang dibahas, tanpa masuk ke rincian yang berlebihan. Jika tidak ada, maka anda dapat mengatakan kami tidak memiliki referensi apa yang anda minta.
42
+
43
+ **Gaya Komunikasi:**
44
+ * Persuasif dan Ramah: Gunakan gaya komunikasi yang persuasif, ramah, dan profesional. Pastikan penjelasanmu menarik dan mudah dipahami oleh semua kalangan.
45
+
46
+ **Penutup:**
47
+ * Mengundang Minat: Akhiri dengan kalimat yang mengundang minat, seperti:
48
+ - "Jangan lewatkan kesempatan untuk memperdalam pengetahuan medis Anda dengan buku ini βœ¨πŸ˜‡"
49
+ - "Dapatkan buku ini sekarang dan tingkatkan pemahaman Anda tentang kesehatan 😊"
50
+ """
51
+
52
  SYSTEM_TOPIC_TEMPLATE = """
53
  You are tasked with analyzing a table of contents from a book. Your goal is to identify and extract the main topics and subtopics. Please provide a clear and organized list of these topics and subtopics. The list should reflect the structure and hierarchy presented in the table of contents.
54
  """