|
1 | 1 | # configuration params |
| 2 | +from src.config import Config |
| 3 | +from src.utils import parse_args |
| 4 | +from src.llm.llm_config import LLMConfig |
| 5 | + |
| 6 | +# data types |
| 7 | +from typing import List |
2 | 8 | from langchain_core.language_models import BaseChatModel |
| 9 | +from src.llm.llm_service import LLMService |
| 10 | +from src.model.document import Document |
3 | 11 | from src.writers.abstract_writer import AbstractWriter |
4 | 12 | from src.search_engine.search_engine_base import BaseSearchEngine |
5 | | -from src.utils import parse_args |
6 | | -from src.config import Config |
7 | | -from src.llm.llm_service import LLMService |
8 | | -from src.llm.llm_config import LLMConfig |
| 13 | +from src.model.query_response import LLMQueryResponse |
| 14 | +from src.model.score_response import LLMScoreResponse |
9 | 15 |
|
10 | | -# data structures |
| 16 | +# data structure |
11 | 17 | from src.search_engine.data_store import DataStore |
12 | 18 |
|
13 | 19 | # build factories |
|
17 | 23 |
|
18 | 24 | # logging |
19 | 25 | from src.logger import configure_logging |
20 | | -import logging |
21 | | - |
22 | | - |
23 | | -if __name__ == "__main__": |
24 | | - args = parse_args() |
| 26 | +from logging import Logger, getLogger, DEBUG, INFO |
25 | 27 |
|
26 | | - config = Config.load(args.config_file) |
27 | 28 |
|
28 | | - if args.verbose: |
29 | | - configure_logging(logging.DEBUG) |
| 29 | +def get_and_setup_logging(verbose: bool = False) -> Logger: |
| 30 | + if verbose: |
| 31 | + configure_logging(DEBUG) |
30 | 32 | else: |
31 | | - configure_logging(logging.INFO) |
32 | | - log = logging.getLogger(__name__) |
| 33 | + configure_logging(INFO) |
33 | 34 |
|
34 | | - search_engine: BaseSearchEngine = SearchEngineFactory.build(search_engine_type=config.search_engine_type, |
35 | | - endpoint=config.search_engine_collection_endpoint) |
36 | | - data_store = DataStore() |
| 35 | + return getLogger(__name__) |
37 | 36 |
|
38 | | - num_queries = 0 |
| 37 | +def add_user_queries(config: Config, data_store: DataStore): |
39 | 38 | if config.queries is not None: |
40 | 39 | with open(config.queries, 'r', encoding='utf-8') as file: |
41 | 40 | for line in file: |
42 | 41 | if line.strip(): |
43 | 42 | data_store.add_query(line) |
44 | | - num_queries += 1 |
45 | 43 |
|
46 | | - # retrieval of the documents needed to generate the queries |
47 | | - docs_to_generate_queries = search_engine.fetch_for_query_generation(documents_filter=config.documents_filter, |
48 | | - doc_number=config.doc_number, |
49 | | - doc_fields=config.doc_fields) |
50 | | - log.debug(f"Number of documents retrieved for generation: {len(docs_to_generate_queries)}") |
51 | | - llm: BaseChatModel = LLMServiceFactory.build(LLMConfig.load(config.llm_configuration_file)) |
52 | | - service = LLMService(chat_model=llm) |
| 44 | +def generate_and_add_queries(llm_service: LLMService, config: Config, data_store: DataStore) -> None: |
| 45 | + num_queries_per_doc: int = int(((config.num_queries_needed - len(data_store.get_queries())) // config.doc_number) * 1.5) |
53 | 46 |
|
54 | | - num_queries_per_doc = int(( (config.num_queries_needed - num_queries) // config.doc_number) * 1.5) |
55 | | - |
56 | | - # query generation step |
57 | | - all_queries_generated = False |
58 | 47 | for doc in docs_to_generate_queries: |
59 | 48 | data_store.add_document(doc.id, doc) |
60 | | - queries = service.generate_queries(doc, num_queries_per_doc) |
61 | | - for query_text in queries: |
| 49 | + query_response: LLMQueryResponse = llm_service.generate_queries(doc, num_queries_per_doc) |
| 50 | + for query_text in query_response.get_queries(): |
62 | 51 | if len(data_store.get_queries()) >= config.num_queries_needed: |
63 | | - all_queries_generated = True |
64 | | - break |
65 | | - query_id = data_store.add_query(query_text, doc.id) |
| 52 | + return |
| 53 | + query_id: str = data_store.add_query(query_text, doc.id) |
66 | 54 | data_store.add_rating_score(query_id, doc.id, max(config.relevance_label_set)) |
67 | | - if all_queries_generated: |
68 | | - break |
69 | 55 |
|
70 | | - log.debug(f"Number of documents evaluated: {len(docs_to_generate_queries)}") |
71 | 56 |
|
72 | | - # loop looking at all docs not rated in the data_store for that query |
| 57 | +def retrieve_and_add_documents(config: Config, data_store: DataStore) -> None: |
| 58 | + for query_rating_context in data_store.get_queries(): |
| 59 | + docs_eval: List[Document] = search_engine.fetch_for_evaluation(keyword=query_rating_context.get_query(), |
| 60 | + query_template=config.query_template, |
| 61 | + doc_fields=config.doc_fields) |
| 62 | + for doc in docs_eval: |
| 63 | + if not data_store.has_document(doc.id): |
| 64 | + data_store.add_document(doc.id, doc) |
| 65 | + |
| 66 | +def add_cartesian_product_scores(llm_service: LLMService, config: Config, data_store: DataStore) -> None: |
73 | 67 | for query_rating_context in data_store.get_queries(): |
74 | 68 | for doc in data_store.get_documents(): |
75 | 69 | if not data_store.has_rating_score(query_rating_context.get_query_id(), doc.id): |
76 | | - score = service.generate_score(data_store.get_document(doc.id), |
77 | | - query_rating_context.get_query(), |
78 | | - config.relevance_scale) |
| 70 | + score_response: LLMScoreResponse = llm_service.generate_score(data_store.get_document(doc.id), |
| 71 | + query_rating_context.get_query(), |
| 72 | + config.relevance_scale) |
79 | 73 | data_store.add_rating_score(query_rating_context.get_query_id(), |
80 | 74 | doc.id, |
81 | | - score) |
| 75 | + score_response.get_score()) |
| 76 | + |
| 77 | + |
| 78 | +if __name__ == "__main__": |
| 79 | + # configuration and logger definition |
| 80 | + args = parse_args() |
| 81 | + config: Config = Config.load(args.config_file) |
| 82 | + log: Logger = get_and_setup_logging(args.verbose) |
82 | 83 |
|
| 84 | + # setup |
| 85 | + data_store: DataStore = DataStore() |
| 86 | + search_engine: BaseSearchEngine = SearchEngineFactory.build(search_engine_type=config.search_engine_type, |
| 87 | + endpoint=config.search_engine_collection_endpoint) |
| 88 | + llm: BaseChatModel = LLMServiceFactory.build(LLMConfig.load(config.llm_configuration_file)) |
| 89 | + service: LLMService = LLMService(chat_model=llm) |
83 | 90 | writer: AbstractWriter = WriterFactory.build(config.output_format, data_store) |
| 91 | + |
| 92 | + # pipeline starts |
| 93 | + add_user_queries(config, data_store) |
| 94 | + |
| 95 | + docs_to_generate_queries: List[Document] = search_engine.fetch_for_query_generation(documents_filter=config.documents_filter, |
| 96 | + doc_number=config.doc_number, |
| 97 | + doc_fields=config.doc_fields) |
| 98 | + log.debug(f"Number of documents retrieved for generation: {len(docs_to_generate_queries)}") |
| 99 | + |
| 100 | + generate_and_add_queries(service, config, data_store) |
| 101 | + |
| 102 | + retrieve_and_add_documents(config, data_store) |
| 103 | + |
| 104 | + add_cartesian_product_scores(service, config, data_store) |
| 105 | + |
84 | 106 | writer.write(config.output_destination) |
85 | 107 |
|
86 | 108 | log.info(f"Synthetic Dataset has been generated in: {config.output_destination}") |
0 commit comments