Spaces:
Sleeping
Sleeping
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 | |
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") | |
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}} | |