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}} | |