File size: 3,301 Bytes
f92376d
 
 
 
 
 
2a434a4
f92376d
 
 
 
 
 
6124a40
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cb48f96
 
 
6124a40
 
cb48f96
f92376d
 
cb48f96
f92376d
 
 
 
 
6124a40
 
 
 
 
 
 
f92376d
 
6124a40
f92376d
 
6124a40
f92376d
6124a40
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
import json
from typing import Dict, List

from haystack import Pipeline, component
from haystack.components.builders import PromptBuilder
from haystack.components.generators import OpenAIGenerator
from haystack.utils import Secret

@component()
class QueryMetadataExtractor:

    def __init__(self):
        prompt = """
          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.
          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.
          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.
          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
          khi truy vấn một chỉ mục.
          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.
          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ệ.
          ###
          Ví dụ 1:
          Truy vấn: "Luật được Quốc hội ban hành năm 2014?"
          Metadata fields: {"publisher", "publish_year", "document_type"}
          Extracted metadata fields: {"publisher": "Quốc hội", "publish_year": 2014, "document_type":"Luật"}
          ###
          Ví dụ 2:
          Truy vấn: "Nghị định được Chính phủ ban hành năm 2021?"
          Trường metadata: {"publisher", "publish_year", "document_type"}
          Extracted metadata fields: {"publisher": "Chính phủ", "publish_year": 2021, "document_type":"Nghị định"}
          ###
          Ví dụ 3:
          Truy vấn: "{{query}}"
          Trường metadata: "{{metadata_fields}}"
          Extracted metadata fields:
          """
        generator = OpenAIGenerator(
            api_key=Secret.from_env_var("OCTOAI_TOKEN"),
            api_base_url="https://text.octoai.run/v1",
            model="meta-llama-3-70b-instruct",
            generation_kwargs = {"max_tokens": 512,"response_format": { "type": "json_object" }}
        )
        self.pipeline = Pipeline()
        self.pipeline.add_component(name="builder", instance=PromptBuilder(prompt))
        self.pipeline.add_component(name="llm", instance=generator)
        self.pipeline.connect("builder", "llm")

    @component.output_types(filters=Dict[str, str])
    def run(self, query: str, metadata_fields: List[str]):
        result = self.pipeline.run({'builder': {'query': query, 'metadata_fields': metadata_fields}})
        
        import json
        first_reply = result['llm']['replies'][0]
        parsed_data = json.loads(first_reply)
        metadata = parsed_data['answer']
        metadata = metadata.replace("'",'"')
        data = json.loads(metadata)
        # this can be done with specific data structures and in a more sophisticated way
        filters = []
        for key, value in data.items():
            field = f"meta.{key}"
            filters.append({f"field": field, "operator": "==", "value": value})
        print(filters)
        return {"filters": {"operator": "AND", "conditions": filters}}