dinhquangson commited on
Commit
6124a40
1 Parent(s): 2b22ee8

Update QueryMetadataExtractor.py

Browse files
Files changed (1) hide show
  1. QueryMetadataExtractor.py +35 -30
QueryMetadataExtractor.py CHANGED
@@ -11,34 +11,34 @@ class QueryMetadataExtractor:
11
 
12
  def __init__(self):
13
  prompt = """
14
- Bạn là một phần của hệ thống thông tin xử lý các truy vấn của người dùng.
15
- Với một truy vấn của người dùng, bạn trích xuất thông tin từ đó khớp với danh sách các trường siêu dữ liệu nhất định.
16
- Thông tin được trích xuất từ ​​truy vấn phải khớp với ngữ nghĩa liên quan đến các trường siêu dữ liệu nhất định.
17
- Thông tin bạn trích xuất từ ​​truy vấn sau đó sẽ được sử dụng làm bộ lọc để thu hẹp không gian tìm kiếm
18
- khi truy vấn một chỉ mục.
19
- Chỉ bao gồm giá trị của siêu dữ liệu được trích xuất mà không bao gồm tên của trường siêu dữ liệu.
20
- Thông tin được trích xuất trong 'Siêu dữ liệu đã trích xuất' phải được trả về dưới dạng cấu trúc JSON hợp lệ.
21
- ###
22
- Ví dụ 1:
23
- Truy vấn: "Doanh thu của Nvidia vào năm 2022 là bao nhiêu?"
24
- Các trường siêu dữ liệu: {"company", "year"}
25
- Các trường siêu dữ liệu được trích xuất: {"company": "nvidia", "year": 2022}
26
- ###
27
- Ví dụ 2:
28
- Truy vấn: "Ấn phẩm ảnh hưởng nhất vào năm 2023 liên quan đến bệnh Alzheimer là gì?"
29
- Các trường siêu dữ liệu: {"disease", "year"}
30
- Các trường siêu dữ liệu được trích xuất: {"disease": "Alzheimer's", "year": 2023}
31
- ###
32
- Ví dụ 3:
33
- Truy vấn: "{{query}}"
34
- Trường siêu dữ liệu: "{{metadata_fields}}"
35
- Các trường siêu dữ liệu được trích xuất:
36
- """
37
  generator = OpenAIGenerator(
38
  api_key=Secret.from_env_var("OCTOAI_TOKEN"),
39
  api_base_url="https://text.octoai.run/v1",
40
- model="mixtral-8x22b-instruct",
41
- generation_kwargs = {"max_tokens": 512}
42
  )
43
  self.pipeline = Pipeline()
44
  self.pipeline.add_component(name="builder", instance=PromptBuilder(prompt))
@@ -48,13 +48,18 @@ class QueryMetadataExtractor:
48
  @component.output_types(filters=Dict[str, str])
49
  def run(self, query: str, metadata_fields: List[str]):
50
  result = self.pipeline.run({'builder': {'query': query, 'metadata_fields': metadata_fields}})
51
- print(result)
52
- metadata = json.loads(result['llm']['replies'][0])
53
-
 
 
 
 
54
  # this can be done with specific data structures and in a more sophisticated way
55
  filters = []
56
- for key, value in metadata.items():
57
  field = f"meta.{key}"
58
  filters.append({f"field": field, "operator": "==", "value": value})
59
-
60
  return {"filters": {"operator": "AND", "conditions": filters}}
 
 
11
 
12
  def __init__(self):
13
  prompt = """
14
+ Bạn là một phần của hệ thống thông tin xử lý các truy vấn của người dùng.
15
+ Cho một truy vấn từ người dùng, bạn trích xuất thông tin khớp với danh sách các trường metadata đã cho.
16
+ Thông tin được trích xuất từ truy vấn phải khớp với ngữ nghĩa liên quan đến các trường metadata đã cho.
17
+ Thông tin bạn trích xuất từ truy vấn sẽ được sử dụng như bộ lọc để thu hẹp không gian tìm kiếm
18
+ khi truy vấn một chỉ mục.
19
+ Chỉ bao gồm giá trị của metadata đã trích xuất mà không bao gồm tên của trường metadata.
20
+ Thông tin đã trích xuất trong 'Extracted metadata' phải trả về dưới dạng cấu trúc JSON hợp lệ.
21
+ ###
22
+ Ví dụ 1:
23
+ Truy vấn: "Luật được Quốc hội ban hành năm 2014?"
24
+ Metadata fields: {"publisher", "publish_year", "document_type"}
25
+ Extracted metadata fields: {"publisher": "Quốc hội", "publish_year": 2014, "document_type":"Luật"}
26
+ ###
27
+ Ví dụ 2:
28
+ Truy vấn: "Nghị định được Chính phủ ban hành năm 2021?"
29
+ Trường metadata: {"publisher", "publish_year", "document_type"}
30
+ Extracted metadata fields: {"publisher": "Chính phủ", "publish_year": 2021, "document_type":"Nghị định"}
31
+ ###
32
+ Ví dụ 3:
33
+ Truy vấn: "{{query}}"
34
+ Trường metadata: "{{metadata_fields}}"
35
+ Extracted metadata fields:
36
+ """
37
  generator = OpenAIGenerator(
38
  api_key=Secret.from_env_var("OCTOAI_TOKEN"),
39
  api_base_url="https://text.octoai.run/v1",
40
+ model="meta-llama-3-70b-instruct",
41
+ generation_kwargs = {"max_tokens": 512,"response_format": { "type": "json_object" }}
42
  )
43
  self.pipeline = Pipeline()
44
  self.pipeline.add_component(name="builder", instance=PromptBuilder(prompt))
 
48
  @component.output_types(filters=Dict[str, str])
49
  def run(self, query: str, metadata_fields: List[str]):
50
  result = self.pipeline.run({'builder': {'query': query, 'metadata_fields': metadata_fields}})
51
+
52
+ import json
53
+ first_reply = result['llm']['replies'][0]
54
+ parsed_data = json.loads(first_reply)
55
+ metadata = parsed_data['answer']
56
+ metadata = metadata.replace("'",'"')
57
+ data = json.loads(metadata)
58
  # this can be done with specific data structures and in a more sophisticated way
59
  filters = []
60
+ for key, value in data.items():
61
  field = f"meta.{key}"
62
  filters.append({f"field": field, "operator": "==", "value": value})
63
+ print(filters)
64
  return {"filters": {"operator": "AND", "conditions": filters}}
65
+