From ac3d91397653bf3353837cd7a2637f172b33dd6f Mon Sep 17 00:00:00 2001 From: majidsh97 Date: Sat, 12 Apr 2025 21:00:58 +0200 Subject: [PATCH] add graphrag comparison --- ...compare_rag_localsearch_globalsearch.ipynb | 1323 +++++++++++++++++ .../graphrag_comparison/comparison_prompt.py | 210 +++ .../graphrag_comparison.py | 585 ++++++++ 3 files changed, 2118 insertions(+) create mode 100644 examples_notebooks/community_contrib/graphrag_comparison/compare_rag_localsearch_globalsearch.ipynb create mode 100644 examples_notebooks/community_contrib/graphrag_comparison/comparison_prompt.py create mode 100644 examples_notebooks/community_contrib/graphrag_comparison/graphrag_comparison.py diff --git a/examples_notebooks/community_contrib/graphrag_comparison/compare_rag_localsearch_globalsearch.ipynb b/examples_notebooks/community_contrib/graphrag_comparison/compare_rag_localsearch_globalsearch.ipynb new file mode 100644 index 0000000000..80c26f8606 --- /dev/null +++ b/examples_notebooks/community_contrib/graphrag_comparison/compare_rag_localsearch_globalsearch.ipynb @@ -0,0 +1,1323 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ac886615", + "metadata": {}, + "source": [ + "# How to Use This Jupyter Notebook\n", + "\n", + "This notebook is designed to evaluate and compare answers of normal RAG, local search GraphRAG and global search GraphRAG. Below is a step-by-step guide on how to use this notebook effectively:\n", + "\n", + "## 1. Setup and Initialization\n", + "- First you need to build a graphrag with graphrag index pipline and then give root diroctory path to \n", + "`ROOT_DIR`\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d84e59df", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/cip/ce/ix05ogym/Majid/LLM/graphrag/examples_notebooks/community_contrib/graphrag_comparison\n" + ] + } + ], + "source": [ + "import os\n", + "import sys\n", + "print(os.getcwd())\n", + "sys.path.append(os.getcwd())\n", + "from graphrag_comparison import GraphRagcomparison\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "8b4d141e", + "metadata": {}, + "source": [ + "## 2. Define Questions for comparison\n", + "- A list of questions to evaluate is defined in the `questions_to_evaluate` variable. You have to modify this list to include the questions you want to analyze for your dataset.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8801751f", + "metadata": {}, + "outputs": [], + "source": [ + "ROOT_DIR = \"/home/cip/ce/ix05ogym/Majid/LLM/GraphRag/v2\"\n", + "TEMPERATURE_SETTING = 0.7\n", + "questions_to_evaluate = [\n", + " \"What are letter codes in the context of BS 4584?\",\n", + " \"How does soldering potentially contribute to peaceful pursuits?\",\n", + " \"How does soldering contribute to the development of intelligent machines?\",\n", + " \"How does LEAD contribute to the depletion of the ozone layer?\",\n", + " \"What is the main advantage of using automatic insertion for component placement?\",\n", + " 'What are some of the key areas where Cookson Electronics is involved?',\n", + " 'What are the primary functions of actions like bonding and flow in relation to the SI-GC-CU-13 laminate?',\n", + " 'What is the significance of the conductivity property of the SI-GC-CU-13 laminate?',\n", + " 'Explain the impact of LEAD on the environment, specifically its relationship with the ozone layer?',\n", + " 'What specific requirements are defined by standards in soldering?',\n", + " ]" + ] + }, + { + "cell_type": "markdown", + "id": "d089b16f", + "metadata": {}, + "source": [ + "## 3. Perform comparison\n", + "- three answers will be generated using the questions and graphrag methods.\n", + "- then answers will be give to llm and is asked to give a rating." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "be1f148a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initializing GraphRAGSearch...\n", + "Loading configuration...\n", + "Configuration loaded.\n", + "Output directory set to: /home/cip/ce/ix05ogym/Majid/LLM/GraphRag/v2/output\n", + "LanceDB URI set to: /home/cip/ce/ix05ogym/Majid/LLM/GraphRag/v2/output/lancedb\n", + "Setting up models and token encoder...\n", + "Using chat model config: api_key='' auth_type= type='openai_chat' model='gpt-4-turbo-preview' encoding_model='cl100k_base' api_base='http://localhost:8080/' api_version=None deployment_name=None organization=None proxy=None audience=None model_supports_json=True request_timeout=180.0 tokens_per_minute=0 requests_per_minute=50 retry_strategy='native' max_retries=-1 max_retry_wait=10.0 concurrent_requests=5 async_mode= responses=None max_tokens=4000 temperature=0 top_p=1 n=1 frequency_penalty=0.0 presence_penalty=0.0\n", + "Token Encoder created based on: cl100k_base\n", + "Models and encoder setup complete.\n", + "Loading data from parquet files...\n", + "Loaded 194 entities, 43 communities, 314 relationships, 43 reports, 28 text units.\n", + "Data loading complete.\n", + "Setting up vector store...\n", + "Vector store connected successfully to /home/cip/ce/ix05ogym/Majid/LLM/GraphRag/v2/output/lancedb (collection: default-entity-description). Test search returned 1 result(s).\n", + "Setting up vector store...\n", + "Vector store connected successfully to /home/cip/ce/ix05ogym/Majid/LLM/GraphRag/v2/output/lancedb (collection: default-entity-description). Test search returned 1 result(s).\n", + "Setting up context builders...\n", + "LocalSearchMixedContext created.\n", + "GlobalCommunityContext created.\n", + "Context builders setup complete.\n", + "Setting up search engines...\n", + "LocalSearch engine configured.\n", + "GlobalSearch engine configured.\n", + "Search engines setup complete.\n", + "Initialization complete.\n", + "\n", + "--- Starting Evaluation of 10 Questions ---\n", + "\n", + "Processing Question 1/10: 'What are letter codes in the context of BS 4584?'\n", + "--- Running Normal RAG: Based on the provided text, several tables list le ---\n", + "--- Running GraphRAG Local Search: I'm sorry, but I cannot answer your question. Whil ---\n", + "--- Running GraphRAG Global Search: The provided text mentions the use of BS 4584 in t ---\n", + "\n", + "Processing Question 2/10: 'How does soldering potentially contribute to peaceful pursuits?'\n", + "--- Running Normal RAG: I cannot answer this question. The provided text ---\n", + "--- Running GraphRAG Local Search: The provided text mentions that soldering, while i ---\n", + "--- Running GraphRAG Global Search: Soldering's Role in Peaceful Applications\n", + "\n", + "Solderi ---\n", + "\n", + "Processing Question 3/10: 'How does soldering contribute to the development of intelligent machines?'\n", + "--- Running Normal RAG: I am sorry, but based on the provided text, I cann ---\n", + "--- Running GraphRAG Local Search: Based on the provided text, there is mention of so ---\n", + "--- Running GraphRAG Global Search: Soldering plays a vital role in the creation of in ---\n", + "\n", + "Processing Question 4/10: 'How does LEAD contribute to the depletion of the ozone layer?'\n", + "--- Running Normal RAG: I cannot answer your question using the provided t ---\n", + "--- Running GraphRAG Local Search: I'm sorry, but the provided text does not contain ---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: All map responses have score 0 (i.e., no relevant information found from the dataset), returning a canned 'I do not know' answer. You can try enabling `allow_general_knowledge` to encourage the LLM to incorporate relevant general knowledge, at the risk of increasing hallucinations.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- Running GraphRAG Global Search: I am sorry but I am unable to answer this question ---\n", + "\n", + "Processing Question 5/10: 'What is the main advantage of using automatic insertion for component placement?'\n", + "--- Running Normal RAG: The provided text focuses heavily on soldering pro ---\n", + "--- Running GraphRAG Local Search: The provided text focuses on soldering processes i ---\n", + "--- Running GraphRAG Global Search: Automated soldering, also known as mass soldering, ---\n", + "\n", + "Processing Question 6/10: 'What are some of the key areas where Cookson Electronics is involved?'\n", + "--- Running Normal RAG: Based on the provided text, Cookson Electronics is ---\n", + "--- Running GraphRAG Local Search: Based on the provided text, Cookson Electronics is ---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: All map responses have score 0 (i.e., no relevant information found from the dataset), returning a canned 'I do not know' answer. You can try enabling `allow_general_knowledge` to encourage the LLM to incorporate relevant general knowledge, at the risk of increasing hallucinations.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- Running GraphRAG Global Search: I am sorry but I am unable to answer this question ---\n", + "\n", + "Processing Question 7/10: 'What are the primary functions of actions like bonding and flow in relation to the SI-GC-CU-13 laminate?'\n", + "--- Running Normal RAG: I am sorry, but based on the provided text, I cann ---\n", + "--- Running GraphRAG Local Search: Based on the provided data, there is no direct inf ---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: All map responses have score 0 (i.e., no relevant information found from the dataset), returning a canned 'I do not know' answer. You can try enabling `allow_general_knowledge` to encourage the LLM to incorporate relevant general knowledge, at the risk of increasing hallucinations.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- Running GraphRAG Global Search: I am sorry but I am unable to answer this question ---\n", + "\n", + "Processing Question 8/10: 'What is the significance of the conductivity property of the SI-GC-CU-13 laminate?'\n", + "--- Running Normal RAG: I am sorry, but based on the provided text, I cann ---\n", + "--- Running GraphRAG Local Search: The provided text focuses on the composition and p ---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: All map responses have score 0 (i.e., no relevant information found from the dataset), returning a canned 'I do not know' answer. You can try enabling `allow_general_knowledge` to encourage the LLM to incorporate relevant general knowledge, at the risk of increasing hallucinations.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- Running GraphRAG Global Search: I am sorry but I am unable to answer this question ---\n", + "\n", + "Processing Question 9/10: 'Explain the impact of LEAD on the environment, specifically its relationship with the ozone layer?'\n", + "--- Running Normal RAG: I am sorry, but based on the provided text, I cann ---\n", + "--- Running GraphRAG Local Search: I am sorry, but based on the provided text, I cann ---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: All map responses have score 0 (i.e., no relevant information found from the dataset), returning a canned 'I do not know' answer. You can try enabling `allow_general_knowledge` to encourage the LLM to incorporate relevant general knowledge, at the risk of increasing hallucinations.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- Running GraphRAG Global Search: I am sorry but I am unable to answer this question ---\n", + "\n", + "Processing Question 10/10: 'What specific requirements are defined by standards in soldering?'\n", + "--- Running Normal RAG: Based on the provided text, there is no mention of ---\n", + "--- Running GraphRAG Local Search: I am sorry, but this question cannot be answered f ---\n", + "--- Running GraphRAG Global Search: ## Soldering Standards and Requirements\n", + "\n", + "This resp ---\n", + "[Method(rag_search=Answer(answer_number=0, question='What are letter codes in the context of BS 4584?', answer=\"Based on the provided text, several tables list letter codes related to printed circuit board (PCB) types according to BS 4584 and IEC 249 standards. There is mention of a Table 1.2 which details these letter codes and their descriptions [Data: Source unit_text 1a59e1c00640a2839652f1862c3b5afd4d510fceb6129128176dd7f45e1f3634871cb63dd617a074f90cf18529362616e6e8cfc4380e9c6cbc3bb934183ff2d1]. However, the content of Table 1.2 itself is not included in the provided data.\\n\\nFurthermore, the data mentions that laminate codes have numbers at the end indicating the part of BS 4584 that applies [Data: Source unit_text de4df10495e8805723fd3fc3e38200e07df57f04af9b050235a7a578aff153ed39c76da505d49cfc248e9824175dbb55710b94c162d098d08fcf7ae160bd4d48; Source unit_text f556aa8295501d597ea20c10678fc60e0f028ffdb5e687d7b81783b66fac900a5a0d69ec5fb918a79c255b846a950713169e934e7c4388f728840c3e61fe73c9]. This suggests a connection between the numerical portion of the laminate code and the specific section within BS 4584. However, without access to Table 1.2 and the full text of BS 4584, a complete explanation of the letter codes is not possible.\\n\\nThe provided text also references Table 1.1, which lists common printed circuit board laminate materials with their classifications according to BS 4584/IEC 249 and (where applicable) the now non-existent NEMA LI1 standard [Data: Source unit_text 86e807f0cd07552efb18b1522b5ebb0f1e29dbafb18ceed16863a0b3a5b419cbc60e1815556c0e98181358e77794b8c03c5d3ec8d5da71105f04d0ca6b64f2c8]. While this table doesn't directly provide letter codes, it shows the relationship between material composition and classification codes within the BS 4584 system. Again, the specific content of Table 1.1 is not provided.\\n\\nIn summary, the provided data mentions the existence of letter codes within the context of BS 4584 for PCB types, but the specific codes and their meanings are not available in the provided text. More information is needed to fully answer the question.\\n\", comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), local_search=Answer(answer_number=0, question='What are letter codes in the context of BS 4584?', answer='I\\'m sorry, but I cannot answer your question. While the provided text mentions \"letter codes as defined in Table 1.2\" [Data: Sources (17)], the content of Table 1.2 is not included in the dataset. Therefore, I do not have the information needed to explain the letter codes in the context of BS 4584.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), global_search=Answer(answer_number=0, question='What are letter codes in the context of BS 4584?', answer='The provided text mentions the use of BS 4584 in testing printed circuit board laminate materials [Data: Reports (5, 29)]. Specific laminate types are identified using codes such as SI-GC-CU-13 and EP-GCA-CU-16. However, the meaning of the letter codes within these examples (e.g., SI, GC, CU) is not explained in the available data.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), error=''), Method(rag_search=Answer(answer_number=0, question='How does soldering potentially contribute to peaceful pursuits?', answer='I cannot answer this question. The provided text focuses on the technical aspects of soldering in electronics assembly, including its history, methods (hand and machine soldering), and quality control. There is no information about how soldering might contribute to peaceful pursuits.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), local_search=Answer(answer_number=0, question='How does soldering potentially contribute to peaceful pursuits?', answer='The provided text mentions that soldering, while initially used to forge weapons, may now contribute to peaceful pursuits by assisting in the development of intelligent machines [Data: Sources (7)]. However, no further details are given on how this contribution is made. Therefore, I cannot elaborate further on this point.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), global_search=Answer(answer_number=0, question='How does soldering potentially contribute to peaceful pursuits?', answer=\"Soldering's Role in Peaceful Applications\\n\\nSoldering, a fundamental process in electronics manufacturing, plays a crucial role in creating numerous electronic devices vital for peaceful applications [Data: Reports (7, 1, 4, 13, 21, 26, 27, 36, +more)]. These applications span a wide range, including communication technologies, medical equipment, renewable energy systems, computers, mobile telecommunications, and even space travel [Data: Reports (7, 1, 4, 13, 21, 26, 27, 36, +more)]. The reliable connections achieved through soldering are essential for the functionality and safety of these devices [Data: Reports (8, 28)].\\n\\n\\nQuality Control and Material Advancements\\n\\nThe reliability of these electronic devices, crucial for peaceful applications, is further enhanced by stringent quality control measures in soldering, including thorough inspection and efficient defect repair [Data: Reports (7, 13, 39)]. Furthermore, advancements in soldering materials have enabled miniaturization and performance improvements in electronics, driving progress in peaceful technologies [Data: Reports (4, 27)].\\n\\n\\nSustainability and Research\\n\\nThe shift towards lead-free soldering directly addresses environmental concerns, promoting a more sustainable and peaceful environment [Data: Reports (7, 41)]. Research and development in lead-free soldering, potentially involving institutions like ITRI, promise further contributions to this field and its peaceful applications [Data: Reports (7, 41)].\\n\", comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), error=''), Method(rag_search=Answer(answer_number=0, question='How does soldering contribute to the development of intelligent machines?', answer='I am sorry, but based on the provided text, I cannot answer your question. The provided text focuses on the history, processes, and techniques of soldering in electronics assembly, particularly in the context of printed circuit boards. There is no information about how soldering contributes to the development of intelligent machines.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), local_search=Answer(answer_number=0, question='How does soldering contribute to the development of intelligent machines?', answer='Based on the provided text, there is mention of soldering\\'s role in electronics assembly and its connection to the development of intelligent machines, but no direct explanation of *how* soldering contributes to this development. The text states that soldering \"may help us develop intelligent machines towards assisting mankind in peaceful pursuits\" [Data: Sources (7)]. However, no details are given to support this assertion. Therefore, I cannot answer your question using only the provided data.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), global_search=Answer(answer_number=0, question='How does soldering contribute to the development of intelligent machines?', answer=\"Soldering plays a vital role in the creation of intelligent machines. It's a crucial process in the assembly of electronic components and printed circuit boards (PCBs), which are fundamental building blocks of these machines [Data: Reports (1, 7, 13, 15, 16, +more)]. The reliability and longevity of intelligent machines are directly impacted by the quality of soldered joints [Data: Reports (1, 7, 13, 15, 16, +more)]. Defects in soldering can lead to malfunctions or failures, emphasizing the need for robust quality control measures throughout the manufacturing process [Data: Reports (7, 13, 33, 39)]. These measures include thorough inspection and techniques to correct any errors [Data: Reports (7, 13, 33, 39)].\\n\\nThe soldering process itself can vary depending on the scale of production and specific machine requirements. Hand soldering and automated machine soldering are both used, with automated soldering offering significant cost advantages for mass production [Data: Reports (7, 13, 36, 39)]. The choice of soldering materials, such as lead-free solder, also influences environmental impact and regulatory compliance [Data: Reports (7, 41)]. Institutions like ITRI may be involved in related research and development [Data: Reports (7, 41)]. Different soldering processes, such as CS and SC processes, exist, each impacting the quality and efficiency of production [Data: Reports (1, 13, 37)]. Understanding these differences is crucial for optimizing the manufacturing process [Data: Reports (1, 13, 37)]. Further, various techniques, including inert atmosphere soldering, mass CS soldering processes, and hot gas/air soldering, offer different characteristics and applications tailored to specific needs [Data: Reports (9)]. The quality of materials used in soldering, including solder, fluxes, and interfacing alloys, directly affects the quality of the solder joint and overall machine performance [Data: Reports (9)]. Finally, comprehensive quality control is critical to ensure reliable and durable joints for the long-term operation of intelligent machines [Data: Reports (9)]. Poor soldering may result in defects, such as non-wetting, causing malfunctions and failures [Data: Reports (6)].\\n\", comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), error=''), Method(rag_search=Answer(answer_number=0, question='How does LEAD contribute to the depletion of the ozone layer?', answer='I cannot answer your question using the provided text. The provided text focuses on soldering processes in electronics assembly, including the materials used, different soldering techniques, and safety concerns related to the process. There is no information about the effect of lead on the ozone layer.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), local_search=Answer(answer_number=0, question='How does LEAD contribute to the depletion of the ozone layer?', answer=\"I'm sorry, but the provided text does not contain information on how lead contributes to ozone depletion. Therefore, I cannot answer your question.\\n\", comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), global_search=Answer(answer_number=0, question='How does LEAD contribute to the depletion of the ozone layer?', answer='I am sorry but I am unable to answer this question given the provided data.', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), error=''), Method(rag_search=Answer(answer_number=0, question='What is the main advantage of using automatic insertion for component placement?', answer=\"The provided text focuses heavily on soldering processes in electronics assembly, but doesn't directly address the advantages of *automatic* component placement versus manual placement. While it mentions that hand soldering is slow, laborious, time-consuming, and expensive [Data: Source (37fc8b0316f1342d684c793531ca6c817d1a6f8347aef18379ee8033e1ca7886e6fc93abe10103e0fbc08f3f7dc4ed97d8eb6b79b8cc9f0594f13b5a209ef31d)], and that automated soldering has become vitally important [Data: Source (37fc8b0316f1342d684c793531ca6c817d1a6f8347aef18379ee8033e1ca7886e6fc93abe10103e0fbc08f3f7dc4ed97d8eb6b79b8cc9f0594f13b5a209ef31d)], it does not explicitly state the advantages of automated *insertion* of components. Therefore, I cannot answer your question based on the provided data.\\n\", comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), local_search=Answer(answer_number=0, question='What is the main advantage of using automatic insertion for component placement?', answer='The provided text focuses on soldering processes in electronics assembly, and while it mentions automatic component insertion [Data: Entities (134)], it does not explicitly state the main advantage of using this method. The text highlights that component insertion is a step in the assembly of printed wiring boards, and can be either manual or automatic [Data: Entities (134); Relationships (137, 138)]. Further information would be needed to answer your question about the main advantage of automatic insertion.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), global_search=Answer(answer_number=0, question='What is the main advantage of using automatic insertion for component placement?', answer='Automated soldering, also known as mass soldering, offers significant advantages in electronics assembly [Data: Reports (39)]. Primarily, it provides a cost-effective method for joining components. Furthermore, its main advantage lies in the substantial increase in manufacturing speed, making it particularly beneficial for mass production [Data: Reports (39)]. This efficiency translates to faster turnaround times and potentially lower overall production costs.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), error=''), Method(rag_search=Answer(answer_number=0, question='What are some of the key areas where Cookson Electronics is involved?', answer=\"Based on the provided text, Cookson Electronics is involved in the electronics industry, specifically in the area of soldering assembly [Data: Source unit_text ae763cc1bcce9b8bd537bd165d69f96f03b4b8414239c8d423c789c663fae67120c65dea1a3747378db4b5e795393fb2e9c1e3fa97fab237acc3c39eecb7aa14]. The company's executive vice president highlights the significant advancements in the electronics industry, including computers, CDs, mobile telecommunications, and space travel, attributing much of this progress to innovation in new materials, machines, and techniques [Data: Source unit_text ae763cc1bcce9b8bd537bd165d69f96f03b4b8414239c8d423c789c663fae67120c65dea1a3747378db4b5e795393fb2e9c1e3fa97fab237acc3c39eecb7aa14]. The text emphasizes the growing importance of expertise in soldering assembly due to miniaturization and increased board complexity [Data: Source unit_text ae763cc1bcce9b8bd537bd165d69f96f03b4b8414239c8d423c789c663fae67120c65dea1a3747378db4b5e795393fb2e9c1e3fa97fab237acc3c39eecb7aa14]. Cookson Electronics' contribution to a book on electronics assembly operations further underscores their involvement in this field [Data: Source unit_text ae763cc1bcce9b8bd537bd165d69f96f03b4b8414239c8d423c789c663fae67120c65dea1a3747378db4b5e795393fb2e9c1e3fa97fab237acc3c39eecb7aa14].\\n\", comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), local_search=Answer(answer_number=0, question='What are some of the key areas where Cookson Electronics is involved?', answer=\"Based on the provided text, Cookson Electronics is mentioned in the foreword of a book about soldering in electronics assembly [Data: Sources (3)]. The foreword highlights the significant advancements in the electronics industry, enabled by innovations in new materials, machines, and techniques [Data: Sources (3)]. The text emphasizes the importance of soldering assembly expertise, particularly due to miniaturization, increased board complexity, and the critical need for quality [Data: Sources (3)]. While the foreword mentions Cookson Electronics' involvement, it doesn't specify the exact areas of their involvement beyond the general context of the electronics industry. Therefore, I cannot provide a detailed answer to your question based solely on the provided data.\\n\", comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), global_search=Answer(answer_number=0, question='What are some of the key areas where Cookson Electronics is involved?', answer='I am sorry but I am unable to answer this question given the provided data.', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), error=''), Method(rag_search=Answer(answer_number=0, question='What are the primary functions of actions like bonding and flow in relation to the SI-GC-CU-13 laminate?', answer='I am sorry, but based on the provided text, I cannot answer your question about the primary functions of bonding and flow in relation to the SI-GC-CU-13 laminate. The provided data mentions SI-GC-CU-13 [Data: Source unit_text de4df10495e8805723fd3fc3e38200e07df57f04af9b050235a7a578aff153ed39c76da505d49cfc248e9824175dbb55710b94c162d098d08fcf7ae160bd4d48] and lists some properties, but it does not describe the functions of bonding and flow within that specific laminate. More information is needed to answer your question.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), local_search=Answer(answer_number=0, question='What are the primary functions of actions like bonding and flow in relation to the SI-GC-CU-13 laminate?', answer='Based on the provided data, there is no direct information regarding the specific functions of \"bonding\" and \"flow\" in relation to the SI-GC-CU-13 laminate. The datasets describe SI-GC-CU-13 as a type of printed circuit board laminate [Data: Entities (207); Relationships (227, 230, 231, 228, +more)], mention its testing according to BS 4584 [Data: Entities (209); Relationships (228)], and list its properties (although the properties themselves are not included in the provided data). However, the provided text does not detail the processes of bonding or flow in the context of this specific laminate. More information is needed to answer your question.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), global_search=Answer(answer_number=0, question='What are the primary functions of actions like bonding and flow in relation to the SI-GC-CU-13 laminate?', answer='I am sorry but I am unable to answer this question given the provided data.', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), error=''), Method(rag_search=Answer(answer_number=0, question='What is the significance of the conductivity property of the SI-GC-CU-13 laminate?', answer='I am sorry, but based on the provided text, I cannot answer your question about the significance of the conductivity property of the SI-GC-CU-13 laminate. While the provided data mentions SI-GC-Cu-13 [Data: Source (de4df10495e8805723fd3fc3e38200e07df57f04af9b050235a7a578aff153ed39c76da505d49cfc248e9824175dbb55710b94c162d098d08fcf7ae160bd4d48); Source (86e807f0cd07552efb18b1522b5ebb0f1e29dbafb18ceed16863a0b3a5b419cbc60e1815556c0e98181358e77794b8c03c5d3ec8d5da71105f04d0ca6b64f2c8)], it does not provide information on its conductivity or the significance of that property. The tables list various properties of different laminates, but the specific conductivity data for SI-GC-Cu-13 is missing.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), local_search=Answer(answer_number=0, question='What is the significance of the conductivity property of the SI-GC-CU-13 laminate?', answer='The provided text focuses on the composition and properties of various printed circuit board (PCB) laminates, including SI-GC-CU-13, but it does not explicitly detail the conductivity of SI-GC-CU-13 or its significance. While the documents mention that short circuits are a potential failure mode in PCBs [Data: Reports (5, 30); Relationships (217)], and that SI-GC-CU-13 is a type of printed circuit board laminate [Data: Entities (207); Relationships (227, 230, 231, 228)], there is no information about the conductivity of this specific laminate or its implications for circuit performance or failure. Therefore, I cannot answer your question using only the provided data.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), global_search=Answer(answer_number=0, question='What is the significance of the conductivity property of the SI-GC-CU-13 laminate?', answer='I am sorry but I am unable to answer this question given the provided data.', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), error=''), Method(rag_search=Answer(answer_number=0, question='Explain the impact of LEAD on the environment, specifically its relationship with the ozone layer?', answer=\"I am sorry, but based on the provided text, I cannot answer your question about the impact of lead on the environment and its relationship with the ozone layer. The provided text focuses on soldering in electronics assembly, mentioning the use of lead in solder and the safety concerns associated with it [Data: Source unit_text 7d3ffa016246a868526b8eec181583b31e3a81d21bdc8e3ad63fab473bb54b97351e6029949ea17fe118e6bfe3ae744f830092406537f6a12eba07a1903c5c8a; Source unit_text 6b0b2c3bf96b8bca3abc216941e36c7c28734f7a54ac88220aafd9b8b012d6f71aacd95ed0a6267bb7445ae5e76d356e7136c30c3f12f8769028ae515b28b602; Source unit_text 37fc8b0316f1342d684c793531ca6c817d1a6f8347aef18379ee8033e1ca7886e6fc93abe10103e0fbc08f3f7dc4ed97d8eb6b79b8cc9f0594f13b5a209ef31d; Source unit_text 86e807f0cd07552efb18b1522b5ebb0f1e29dbafb18ceed16863a0b3a5b419cbc60e1815556c0e98181358e77794b8c03c5d3ec8d5da71105f04d0ca6b64f2c8; Source unit_text afa73200da7ba51ff2c2552010436ba997ea1359315ff2ed19af30bb41ecaffa1722657c52ecc5e826d7396f5359014ed175532a44181d3219616000b63a1e55]. However, it does not contain information regarding lead's broader environmental impact or its specific interaction with the ozone layer.\\n\", comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), local_search=Answer(answer_number=0, question='Explain the impact of LEAD on the environment, specifically its relationship with the ozone layer?', answer='I am sorry, but based on the provided text, I cannot answer your question. The provided data mentions lead as a component of solder and discusses its health risks and the shift towards lead-free solder due to environmental concerns and legislation [Data: Entities (1, 5, 126, 147, 248); Relationships (16, 18, 119, 145, 312); Reports (7)]. However, there is no information about the impact of lead on the ozone layer.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), global_search=Answer(answer_number=0, question='Explain the impact of LEAD on the environment, specifically its relationship with the ozone layer?', answer='I am sorry but I am unable to answer this question given the provided data.', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), error=''), Method(rag_search=Answer(answer_number=0, question='What specific requirements are defined by standards in soldering?', answer='Based on the provided text, there is no mention of specific requirements defined by standards in soldering. The documents describe the soldering process itself, including variables like flux, wetting, heat, solderable surfaces, and time [Data: Source unit_text a0c453bc816c51704d6ede3b576507b6ce0fd998fe8bbc7a240d3b23962a0831e8dad3bfa477b88529360bdb9ea4ef01322460768e4b34dd5396d1fc10602d48], the dual functions of mechanical and electrical support [Data: Source unit_text 8b43780905545213bff0b274655b9923084f78821c0092b1fd739fa094683cb39c743151d5b50578fa551819ddf557d546744f53139a47d6e2cce6f9a465e662], and various methods of soldering, including hand and machine soldering [Data: Source unit_text 155d9f79923dc0333938001f69ec89ab3dcb90695d4882498ad831ca4f9e2a5ef1b31df1420aec6616428310c07e769b5e0aecd2f4ae1872242f48409efbafbb; Source unit_text c801548ef8989f1d2fd264b89f2bf266f61fa15e1ec455420a64fbf52f502b1b93e0eb352c6d1679ff61a04d542620a65726838305ad52b3b926518fca978a08]. The texts also touch upon cleaning, quality control, and safety aspects of the soldering process [Data: Source unit_text 6b0b2c3bf96b8bca3abc216941e36c7c28734f7a54ac88220aafd9b8b012d6f71aacd95ed0a6267bb7445ae5e76d356e7136c30c3f12f8769028ae515b28b602; Source unit_text c801548ef8989f1d2fd264b89f2bf266f61fa15e1ec455420a64fbf52f502b1b93e0eb352c6d1679ff61a04d542620a65726838305ad52b3b926518fca978a08]. However, no information regarding specific standards or their requirements is present.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), local_search=Answer(answer_number=0, question='What specific requirements are defined by standards in soldering?', answer='I am sorry, but this question cannot be answered from the given source. While the provided text mentions standards and specifications related to soldering [Data: Reports (1); Entities (80); Relationships (37)], it does not detail the specific requirements defined by those standards. The document refers to the importance of adhering to standards and specifications for quality control in soldering [Data: Reports (1); Entities (71, 80); Relationships (36, 37)], but it does not provide the content of these standards.\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), global_search=Answer(answer_number=0, question='What specific requirements are defined by standards in soldering?', answer='## Soldering Standards and Requirements\\n\\nThis response summarizes key requirements defined by standards in soldering, based on available data.\\n\\n### Material Standards\\n\\nThe British Standard BS 4584 outlines testing procedures for printed circuit board laminate materials. This includes specifications for specific laminate types, such as SI-GC-CU-13 [Data: Reports (5, 29)]. Adherence to this standard ensures the use of appropriate materials in the manufacturing process.\\n\\n### Process Control and Quality\\n\\nEffective quality control in soldering is paramount. This involves implementing statistical process control and visual inspection methods to strive for zero-defect assembly [Data: Reports (1, 13)]. Machine soldering demands precise control to minimize faulty joints, which constitute a significant portion (60%) of assembly defects [Data: Reports (7, 39)]. Inspection and touch-up procedures are essential components of the quality control process.\\n\\n### Soldering Techniques and Materials\\n\\nThe trend towards lead-free solder is driven by environmental concerns [Data: Reports (7, 41)]. Organizations like ITRI are involved in research and development related to lead-free soldering techniques. Successful soldering hinges on proper wetting of the solder and the prevention of oxidation. Protective coatings are often employed to mitigate oxidation issues [Data: Reports (33)].\\n', comprehensiveness_reason='', comprehensiveness_rating=0, diversity_reason='', diversity_rating=0, empowerment_reason='', empowerment_rating=0, directness_reason='', directness_rating=0), error='')]\n", + "\n", + "Evaluating Row 0: What are letter codes in the context of BS 4584?...\n", + "length of prompt: 10807\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': 'The answer acknowledges the lack of direct info...\n", + "\n", + "Evaluating Row 1: How does soldering potentially contribute to peaceful pursuits?...\n", + "length of prompt: 10289\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': 'The answer provides no information whatsoever r...\n", + "\n", + "Evaluating Row 2: How does soldering contribute to the development of intelligent machines?...\n", + "length of prompt: 11261\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': 'The answer only states that it cannot answer th...\n", + "\n", + "Evaluating Row 3: How does LEAD contribute to the depletion of the ozone layer?...\n", + "length of prompt: 8712\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': \"The answer acknowledges the lack of relevant in...\n", + "\n", + "Evaluating Row 4: What is the main advantage of using automatic insertion for component placement?...\n", + "length of prompt: 9967\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': \"The answer correctly identifies the lack of rel...\n", + "\n", + "Evaluating Row 5: What are some of the key areas where Cookson Electronics is involved?...\n", + "length of prompt: 10338\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': \"The answer directly addresses the question by i...\n", + "\n", + "Evaluating Row 6: What are the primary functions of actions like bonding and flow in relation to t...\n", + "length of prompt: 9489\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': 'The answer correctly identifies the lack of inf...\n", + "\n", + "Evaluating Row 7: What is the significance of the conductivity property of the SI-GC-CU-13 laminat...\n", + "length of prompt: 9657\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': 'The answer directly states the lack of informat...\n", + "\n", + "Evaluating Row 8: Explain the impact of LEAD on the environment, specifically its relationship wit...\n", + "length of prompt: 9899\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': \"The answer correctly identifies the lack of rel...\n", + "\n", + "Evaluating Row 9: What specific requirements are defined by standards in soldering?...\n", + "length of prompt: 11562\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': \"The answer directly states that the provided te...\n", + "--- Evaluation Complete ---\n", + "Evaluation results saved to /home/cip/ce/ix05ogym/Majid/LLM/GraphRag/v2/comparison_results.\n", + "\n", + "--- Final Evaluation Results ---\n" + ] + }, + { + "data": { + "image/png": "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hH7++Wf9+OOP+s9//qMVK1akmOePP/5Q69atLV+eU3P3tqenPHnypNru5+cnSVYDXVy4cEHS/f8v8+bNq+vXr1u11a5dW4MHD9aECRMUFhYmk8mkwoULq3r16mrZsqWaN28us9n2v1Hmz5//vu3J9SarX7++ihcvrgMHDujw4cOqWLGipP/7Ut67d++HXne2bNks/758+bJCQkJsql2SRo0apQ8//PC+A23Y+v+evG9v27btgQ8tvvs4fdD/bVrtyUE7rf8Lk8mk/PnzKyoqyiqUP2i5yXr16qUJEyZo3rx5GjlypDw9PXXlyhV99dVX8vDwUI8ePe47PwDnQ5AC4DSSQ01cXJxq1aqVYnryl5eFCxdq9OjRlr/e1qxZUwULFtTvv/+uvXv3qlq1arp8+bI2btwoT09PdejQwWo5SUlJkqRy5cqpbNmy963pueeeS9Hm5eWVZv/Dhw/rP//5j1xcXDRu3Dg1b95cefLkkbe3t0wmk2bPnq3//Oc/aY7elZa0vkgmb8vLL7+sTJky3XcZgYGBNq0ztedIrV69Wu3bt9fKlStVs2ZN9erVy2r6yy+/rOPHj6tZs2YaNGiQSpQoIT8/P7m5uen27dup/qU/vdgTYO73BT2taR9//LF69uypb775Rrt379aePXu0YMECLViwQJUrV9b27dsf+H9hq3v3F5PJpD59+qhXr16aPn26FixYoH379unIkSPKly+fmjVr9tDLLl++vMxms5KSknTw4EGbg9Tq1as1cuRI+fj4aPr06apTp45y5colLy8vmUwmvfvuuxo7dqzN+3zyvl2oUCFVr179vn2LFSuWoi2t/78HhTJ73e/ngiTlzp1bbdq00ZdffqmVK1cqLCxMc+fOVXx8vDp16mQVaAE8HQhSAJzCxYsXLcNUX716VXv27Emz719//aXNmzeradOmkmQZevj999/XggULVK1aNX3xxRdKSEhQu3btUlyilfxFsXr16ikujXpUX331lQzDUJ8+fTRo0KAU01O7vC4wMFAeHh6Kj4/XuXPnVKJEiRR9zp49m+r6QkJC9Mcff2jw4MGqVKnSI9f/IG3atNGQIUP0wQcfaPjw4erYsaP8/f0l/Tsc/X//+19lz55da9askaur9a8YWy8tfJySLxVL63OVZBmSPTX58uVTnz591KdPH0nSwYMH9eqrr+rgwYMaP368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tHLlStWqVUuenp5aunSprl69qtDQUAUHB8vb21ulS5fW8uXLLfN16dJFO3bs0NSpU2UymWQymXT27NkUl/YtXLhQAQEB+u6771S8eHH5+PioUaNGunjxomVZCQkJeuuttxQQEKDAwEANHjxYYWFhatWqlaXP119/rdKlS8vLy0uBgYGqV6+eYmNj7dpmAAAAPD0IUs+o/v37a8+ePVq/fr22bNmiXbt2pRlqkpKS1LJlS127dk07duzQli1bdPr0abVv396q359//qkvv/xS33zzjTZv3qwjR46oV69eluk3btxQWFiYdu/erf3796tw4cJq0qSJbty4Yfd2DBkyRH379tWJEyfUsGFDxcXFqWLFivr222/1yy+/6PXXX1enTp30448/SpKmTp2qqlWrqkePHrp48aIuXryokJCQVJd969YtTZw4UUuWLNHOnTsVERGhgQMHWqaPGzdOS5cu1YIFC7Rnzx7FxMRY3d918eJFhYaG6rXXXtOJEycUHh6uNm3ayDAMu7cXAAAATwfukXoG3bhxQ4sWLdKyZctUt25dSdKCBQuUK1euVPtv27ZNx44d05kzZyyhY/HixSpZsqQOHjyoypUrS5Li4uK0ePFiBQcHS5I+/fRTNW3aVJMmTVLOnDlVp04dq+XOnj1bAQEB2rFjh5o1a2bXtvTr109t2rSxars77PTp00ffffedvvzyS1WpUkX+/v5yd3eXt7e3cubMed9l37lzRzNnzlTBggUlSb1799bo0aMt0z/99FMNHTpUrVu3liRNnz5dGzdutEy/ePGiEhIS1KZNG+XNm1eSVLr0k713DgAAAI7BGaln0OnTp3Xnzh1VqVLF0ubv76+iRYum2v/EiRMKCQmxOnNTokQJBQQE6MSJE5a2PHnyWEKUJFWtWlVJSUk6efKkJCkyMlI9evRQ4cKF5e/vLz8/P928eVMRERF2b0ulSpWs3icmJmrMmDEqXbq0smTJIh8fH3333Xd2rcPb29sSoiQpKChIly9fliRFR0crMjLS6jN0cXFRxYoVLe/Lli2runXrqnTp0mrbtq3mzJmjqKgom+sAAADA04cghXQTFhamo0ePaurUqdq7d6+OHj2qwMBA3b592+5lZsqUyer9hAkTNHXqVA0ePFjbt2/X0aNH1bBhQ7vW4ebmZvXeZDLZdFmei4uLtmzZok2bNqlEiRL6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y9lkMskwDAdVimeRYRg6deqUoqKiLG0+Pj7q2LGjmjVrpvfff18fffSRAysEnEPysRIdHW1p8/X1VadOndSkSRMNHTpU48ePd2CFQNqS74+6c+eOpS0+Pl6SNHDgQL388suaM2eO5s+fr8uXLzukxqcFQQpwkNQGjkhKStLzzz+vEydO6M8//7S0BwQE6LnnnlOdOnW0a9cuzZw5U5I4IwW7pbb/+fn56dVXX9WWLVt0+PBhS7u/v79Kliyphg0bavTo0Zo9e/aTLBVwqNSOFX9/f73yyiv67rvvdOTIEUt7QECASpYsqQYNGuj999/X/Pnzn2SpQKru3YfNZrO8vLxUoUIFzZw5UzExMfLw8LAEq1y5cqlQoUKaPn26ZfRgBrtKHUEKcIC773E6evSofvnlF0VFRcnb21uvvfaaduzYofHjx+v48eOS/j0Ff/bsWbVo0UI5c+bU999/r8TEREduAp5id+9/P//8s/bt22c5u9moUSO5urpq2rRpljB18+ZNnThxQh06dFCPHj20fPlyRUVFcUYUz7y7j5Vjx47pwIEDlmmNGzeW2WzW1KlTdfToUUn/HisnT57UK6+8ou7du2vp0qW6fv06xwoc5u59eNeuXdqzZ49+//13Sf/eI5UrVy5Vq1ZNly9flmEYMgxDp0+f1uTJk9W+fXu99957io+P577sNHCPFOAAyT+QhgwZonnz5snb21suLi5as2aNXnjhBa1cuVJdu3bVL7/8Ijc3N926dUs3b97U119/rZs3b+qLL75QfHy8vL29HbwleBol73+DBg3S4sWLFR8fr1y5cumzzz7Tiy++qOvXr+vTTz9V69atVahQIV25ckVms1lhYWG6ePGidu/erUyZMnFGFM+8u4+VJUuW6J9//lGePHk0ffp01a1bV9evX9f06dPVokULFSlSRJGRkTKbzercubPOnz+vffv2cazAYe4enW/gwIFasWKFoqOjValSJb300kvq3bu3Fi5cqNdff11FixZVqVKldPXqVd25c0fPPfecTpw4oV27drH/3gdBCniC7v7L0M6dO7VixQqtWLFCt2/f1vz58/XCCy9o/fr1qlevnr799lvt3r1bR48eVXBwsN59911J0n//+18VL15crq4cvrBNYmKiXFxcJEnffvutNmzYoIULFyp37twaMGCAunbtqqlTp6p169YqUaKEDh48qN27d6tBgwbq37+/JOn06dMqVKiQEhIS5O7u7sjNAR6bu4+VDRs26JtvvtH8+fOVK1cuvf322+rataumTZuml156SSVKlNCPP/6oPXv26MUXX9Q777wjSTp37pwKFy6shIQEubm5OXJzkMEkP5MyOQAdOHBAW7du1erVqxUXF6cVK1Zo3rx5io+P14ABA7R3715NnTpV169fl5ubmwYNGiSz2awDBw4oKCiIn/f3YTI43ww8dvcOVz5jxgxJUmxsrOWX7o0bN9SrVy+tW7dO33zzjWrVqmW1jJMnT2rBggWaPXu2du7cqVKlSj25DcBT7fLly8qePbvl/ZIlS3ThwgWZzWarkcVatGihY8eOaerUqWrUqJHVL87z589r2rRpmjNnjnbv3s3+h2fSlStXlC1bNsv7pUuX6vz58zKbzRo0aJClvUmTJjp58qSmTZum+vXrWx0rFy5c0NSpUzlW4BD//POPvLy8LO+/+uorrV+/XkFBQZYBUM6fP6+pU6dq69at6tChg4YMGWK1jL/++ksfffSRli9frh07drAP3wcXPAKPWY0aNaxuzo+JidHixYvVu3dvXbhwQdK/p999fX31+eefq2XLlmrdurW2bdtmmef27dtatmyZvvnmG23fvp0fanhorVq10ldffSVJlvs0hg8frvfee89ynXyy9evXq0yZMho4cKBWrVql27dvS/r3vo+ZM2dq7969Cg8PZ//DM6lVq1ZatWqVJFnuFRkyZIjeffddq8F/JGnjxo0qVqyYBgwYoDVr1lhu0o+JidFnn32m3bt3c6zgiXv99dctV68kJSUpMjJSS5cu1aZNm3Tu3DlLv5CQEPXt21f169fXqlWrLPNIUmRkpDZs2KCff/5ZP/zwA/vwA3BGCnjMvvnmGzVo0EAeHh6WttOnT2vQoEHatWuXdu3apSJFilieCxUbG6sOHTooPj5e33//vWWeO3fuKCoqyurMAvAgX3zxhdq1ayd3d3ddv35dAQEBMgxDL774ov744w+tXLlS1apVszpjWr16dQUHB+vLL7+0tF27dk2JiYlWf60HniWLFi1SaGio3N3dFR0dLX9/fyUmJqp27do6e/asVq5cqeeff97qWHn++eeVN29erVy50tJ29epVJSUlcazgiUpMTNTGjRvVqFEjubm56fbt23J3d9exY8c0YcIEbd++XSNH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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "graph_rag_comparison = GraphRagcomparison(root_dir=ROOT_DIR, temperature=TEMPERATURE_SETTING)\n", + "\n", + "evaluation_results = await graph_rag_comparison.answer_questions(\n", + " questions=questions_to_evaluate,\n", + " sleep_interval=5 \n", + ")\n", + "print(evaluation_results)\n", + "graph_rag_comparison.compare_answers(evaluation_results,\n", + " )\n", + "print(f\"Evaluation results saved to {graph_rag_comparison.compare_dir}.\")\n", + "\n", + "graph_rag_comparison.plot_comparison_results()\n", + "\n", + "print(\"\\n--- Final Evaluation Results ---\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "b12bed18", + "metadata": {}, + "source": [ + "## 4. Visualize Results\n", + "- The `plot_comparison_results` method is used to generate visualizations of the comparison results.\n", + "- 4 parquet file will be generated that you can look at the answers and compare them yourself.\n", + "- a plot image will be also created." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5a9ff6e8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- compare_result ---\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
QuestionRAGGraph RAG (Local)Graph RAG (Global)
0What are letter codes in the context of BS 4584?Based on the provided text, several tables lis...I'm sorry, but I cannot answer your question. ...The provided text mentions the use of BS 4584 ...
1How does soldering potentially contribute to p...I cannot answer this question. The provided t...The provided text mentions that soldering, whi...Soldering's Role in Peaceful Applications\\n\\nS...
2How does soldering contribute to the developme...I am sorry, but based on the provided text, I ...Based on the provided text, there is mention o...Soldering plays a vital role in the creation o...
3How does LEAD contribute to the depletion of t...I cannot answer your question using the provid...I'm sorry, but the provided text does not cont...I am sorry but I am unable to answer this ques...
4What is the main advantage of using automatic ...The provided text focuses heavily on soldering...The provided text focuses on soldering process...Automated soldering, also known as mass solder...
5What are some of the key areas where Cookson E...Based on the provided text, Cookson Electronic...Based on the provided text, Cookson Electronic...I am sorry but I am unable to answer this ques...
6What are the primary functions of actions like...I am sorry, but based on the provided text, I ...Based on the provided data, there is no direct...I am sorry but I am unable to answer this ques...
7What is the significance of the conductivity p...I am sorry, but based on the provided text, I ...The provided text focuses on the composition a...I am sorry but I am unable to answer this ques...
8Explain the impact of LEAD on the environment,...I am sorry, but based on the provided text, I ...I am sorry, but based on the provided text, I ...I am sorry but I am unable to answer this ques...
9What specific requirements are defined by stan...Based on the provided text, there is no mentio...I am sorry, but this question cannot be answer...## Soldering Standards and Requirements\\n\\nThi...
\n", + "
" + ], + "text/plain": [ + " Question \\\n", + "0 What are letter codes in the context of BS 4584? \n", + "1 How does soldering potentially contribute to p... \n", + "2 How does soldering contribute to the developme... \n", + "3 How does LEAD contribute to the depletion of t... \n", + "4 What is the main advantage of using automatic ... \n", + "5 What are some of the key areas where Cookson E... \n", + "6 What are the primary functions of actions like... \n", + "7 What is the significance of the conductivity p... \n", + "8 Explain the impact of LEAD on the environment,... \n", + "9 What specific requirements are defined by stan... \n", + "\n", + " RAG \\\n", + "0 Based on the provided text, several tables lis... \n", + "1 I cannot answer this question. The provided t... \n", + "2 I am sorry, but based on the provided text, I ... \n", + "3 I cannot answer your question using the provid... \n", + "4 The provided text focuses heavily on soldering... \n", + "5 Based on the provided text, Cookson Electronic... \n", + "6 I am sorry, but based on the provided text, I ... \n", + "7 I am sorry, but based on the provided text, I ... \n", + "8 I am sorry, but based on the provided text, I ... \n", + "9 Based on the provided text, there is no mentio... \n", + "\n", + " Graph RAG (Local) \\\n", + "0 I'm sorry, but I cannot answer your question. ... \n", + "1 The provided text mentions that soldering, whi... \n", + "2 Based on the provided text, there is mention o... \n", + "3 I'm sorry, but the provided text does not cont... \n", + "4 The provided text focuses on soldering process... \n", + "5 Based on the provided text, Cookson Electronic... \n", + "6 Based on the provided data, there is no direct... \n", + "7 The provided text focuses on the composition a... \n", + "8 I am sorry, but based on the provided text, I ... \n", + "9 I am sorry, but this question cannot be answer... \n", + "\n", + " Graph RAG (Global) \n", + "0 The provided text mentions the use of BS 4584 ... \n", + "1 Soldering's Role in Peaceful Applications\\n\\nS... \n", + "2 Soldering plays a vital role in the creation o... \n", + "3 I am sorry but I am unable to answer this ques... \n", + "4 Automated soldering, also known as mass solder... \n", + "5 I am sorry but I am unable to answer this ques... \n", + "6 I am sorry but I am unable to answer this ques... \n", + "7 I am sorry but I am unable to answer this ques... \n", + "8 I am sorry but I am unable to answer this ques... \n", + "9 ## Soldering Standards and Requirements\\n\\nThi... " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- rag_ratings ---\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
answer_numberquestionanswercomprehensiveness_reasoncomprehensiveness_ratingdiversity_reasondiversity_ratingempowerment_reasonempowerment_ratingdirectness_reasondirectness_rating
01What are letter codes in the context of BS 4584?Based on the provided text, several tables lis...The answer acknowledges the lack of direct inf...6The answer demonstrates some diversity by refe...5The answer empowers the reader by explaining t...7The answer directly addresses the question by ...8
11How does soldering potentially contribute to p...I cannot answer this question. The provided t...The answer provides no information whatsoever ...0No diversity is present; the response only ack...0The answer does not empower the reader; it sim...0It directly states it cannot answer, but this ...0
21How does soldering contribute to the developme...I am sorry, but based on the provided text, I ...The answer only states that it cannot answer t...0No diversity is present; the response only ack...0The answer does not empower the reader; it sim...0It directly states it cannot answer the questi...0
31How does LEAD contribute to the depletion of t...I cannot answer your question using the provid...The answer acknowledges the lack of relevant i...2No diversity is present; the response only sta...0The answer does not empower the reader; it sim...1It directly states its inability to answer due...2
41What is the main advantage of using automatic ...The provided text focuses heavily on soldering...The answer correctly identifies the lack of re...2No diversity of perspectives is offered; the r...1The answer doesn't empower the reader; it simp...1The answer directly states its inability to an...2
51What are some of the key areas where Cookson E...Based on the provided text, Cookson Electronic...The answer directly addresses the question by ...8The answer offers a single, focused perspectiv...5The answer empowers the reader by clearly outl...7The answer directly and clearly addresses the ...9
61What are the primary functions of actions like...I am sorry, but based on the provided text, I ...The answer correctly identifies the lack of in...2The answer lacks diversity; it only states the...1The answer does not empower the reader; it sim...1It directly acknowledges the inability to answ...5
71What is the significance of the conductivity p...I am sorry, but based on the provided text, I ...The answer directly states the lack of informa...2The answer lacks diversity; it only focuses on...1The answer does not empower the reader; it sim...1The answer is direct in stating that it cannot...2
81Explain the impact of LEAD on the environment,...I am sorry, but based on the provided text, I ...The answer correctly identifies the lack of re...1No diversity is present; the response only sta...0The answer doesn't empower the reader; it simp...1It directly states its inability to answer due...2
91What specific requirements are defined by stan...Based on the provided text, there is no mentio...The answer directly states that the provided t...1No diversity is present; the response only foc...1The answer doesn't empower the reader; it simp...1It directly addresses the question by stating ...5
\n", + "
" + ], + "text/plain": [ + " answer_number question \\\n", + "0 1 What are letter codes in the context of BS 4584? \n", + "1 1 How does soldering potentially contribute to p... \n", + "2 1 How does soldering contribute to the developme... \n", + "3 1 How does LEAD contribute to the depletion of t... \n", + "4 1 What is the main advantage of using automatic ... \n", + "5 1 What are some of the key areas where Cookson E... \n", + "6 1 What are the primary functions of actions like... \n", + "7 1 What is the significance of the conductivity p... \n", + "8 1 Explain the impact of LEAD on the environment,... \n", + "9 1 What specific requirements are defined by stan... \n", + "\n", + " answer \\\n", + "0 Based on the provided text, several tables lis... \n", + "1 I cannot answer this question. The provided t... \n", + "2 I am sorry, but based on the provided text, I ... \n", + "3 I cannot answer your question using the provid... \n", + "4 The provided text focuses heavily on soldering... \n", + "5 Based on the provided text, Cookson Electronic... \n", + "6 I am sorry, but based on the provided text, I ... \n", + "7 I am sorry, but based on the provided text, I ... \n", + "8 I am sorry, but based on the provided text, I ... \n", + "9 Based on the provided text, there is no mentio... \n", + "\n", + " comprehensiveness_reason comprehensiveness_rating \\\n", + "0 The answer acknowledges the lack of direct inf... 6 \n", + "1 The answer provides no information whatsoever ... 0 \n", + "2 The answer only states that it cannot answer t... 0 \n", + "3 The answer acknowledges the lack of relevant i... 2 \n", + "4 The answer correctly identifies the lack of re... 2 \n", + "5 The answer directly addresses the question by ... 8 \n", + "6 The answer correctly identifies the lack of in... 2 \n", + "7 The answer directly states the lack of informa... 2 \n", + "8 The answer correctly identifies the lack of re... 1 \n", + "9 The answer directly states that the provided t... 1 \n", + "\n", + " diversity_reason diversity_rating \\\n", + "0 The answer demonstrates some diversity by refe... 5 \n", + "1 No diversity is present; the response only ack... 0 \n", + "2 No diversity is present; the response only ack... 0 \n", + "3 No diversity is present; the response only sta... 0 \n", + "4 No diversity of perspectives is offered; the r... 1 \n", + "5 The answer offers a single, focused perspectiv... 5 \n", + "6 The answer lacks diversity; it only states the... 1 \n", + "7 The answer lacks diversity; it only focuses on... 1 \n", + "8 No diversity is present; the response only sta... 0 \n", + "9 No diversity is present; the response only foc... 1 \n", + "\n", + " empowerment_reason empowerment_rating \\\n", + "0 The answer empowers the reader by explaining t... 7 \n", + "1 The answer does not empower the reader; it sim... 0 \n", + "2 The answer does not empower the reader; it sim... 0 \n", + "3 The answer does not empower the reader; it sim... 1 \n", + "4 The answer doesn't empower the reader; it simp... 1 \n", + "5 The answer empowers the reader by clearly outl... 7 \n", + "6 The answer does not empower the reader; it sim... 1 \n", + "7 The answer does not empower the reader; it sim... 1 \n", + "8 The answer doesn't empower the reader; it simp... 1 \n", + "9 The answer doesn't empower the reader; it simp... 1 \n", + "\n", + " directness_reason directness_rating \n", + "0 The answer directly addresses the question by ... 8 \n", + "1 It directly states it cannot answer, but this ... 0 \n", + "2 It directly states it cannot answer the questi... 0 \n", + "3 It directly states its inability to answer due... 2 \n", + "4 The answer directly states its inability to an... 2 \n", + "5 The answer directly and clearly addresses the ... 9 \n", + "6 It directly acknowledges the inability to answ... 5 \n", + "7 The answer is direct in stating that it cannot... 2 \n", + "8 It directly states its inability to answer due... 2 \n", + "9 It directly addresses the question by stating ... 5 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- local_ratings ---\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
answer_numberquestionanswercomprehensiveness_reasoncomprehensiveness_ratingdiversity_reasondiversity_ratingempowerment_reasonempowerment_ratingdirectness_reasondirectness_rating
02What are letter codes in the context of BS 4584?I'm sorry, but I cannot answer your question. ...This answer simply states that it cannot answe...0No diversity is present; the response only ack...0The answer does not empower the reader; it sim...0It directly states its inability to answer, bu...0
12How does soldering potentially contribute to p...The provided text mentions that soldering, whi...The answer mentions a connection between solde...2The answer offers only one limited perspective...2The answer provides minimal information and do...2It attempts to address the question but fails ...3
22How does soldering contribute to the developme...Based on the provided text, there is mention o...The answer mentions a connection between solde...1The answer shows limited diversity, primarily ...1The answer does not empower the reader; it hig...1The answer acknowledges the question but fails...2
32How does LEAD contribute to the depletion of t...I'm sorry, but the provided text does not cont...Similar to answer 1, it correctly points out t...2No diversity is present; the response only sta...0The answer does not empower the reader; it sim...1It directly states its inability to answer due...2
42What is the main advantage of using automatic ...The provided text focuses on soldering process...Similar to answer 1, this answer acknowledges ...2No diverse perspectives are provided; the resp...1The answer doesn't empower the reader; it only...1The answer directly states that it cannot answ...2
52What are some of the key areas where Cookson E...Based on the provided text, Cookson Electronic...This answer acknowledges Cookson Electronics' ...4Similar to answer 1, this answer lacks diversi...4The answer partially empowers the reader by pr...5The answer is direct in acknowledging the limi...6
62What are the primary functions of actions like...Based on the provided data, there is no direct...Similar to answer 1, this answer correctly poi...2No diversity is present; the response focuses ...1The answer does not empower the reader; it onl...1It directly states the inability to answer due...5
72What is the significance of the conductivity p...The provided text focuses on the composition a...Similar to answer 1, this answer acknowledges ...3This answer shows slightly more diversity by m...2The answer provides a bit more context about t...3The answer is direct in stating it cannot answ...3
82Explain the impact of LEAD on the environment,...I am sorry, but based on the provided text, I ...Similar to answer 1, this response acknowledge...2The answer lacks diversity; it only points out...1The answer provides a little more context by m...2It directly states its inability to answer, bu...3
92What specific requirements are defined by stan...I am sorry, but this question cannot be answer...Similar to answer 1, this answer acknowledges ...1The answer lacks diversity; it only reiterates...1The answer doesn't empower the reader; it only...1It directly states that the question cannot be...5
\n", + "
" + ], + "text/plain": [ + " answer_number question \\\n", + "0 2 What are letter codes in the context of BS 4584? \n", + "1 2 How does soldering potentially contribute to p... \n", + "2 2 How does soldering contribute to the developme... \n", + "3 2 How does LEAD contribute to the depletion of t... \n", + "4 2 What is the main advantage of using automatic ... \n", + "5 2 What are some of the key areas where Cookson E... \n", + "6 2 What are the primary functions of actions like... \n", + "7 2 What is the significance of the conductivity p... \n", + "8 2 Explain the impact of LEAD on the environment,... \n", + "9 2 What specific requirements are defined by stan... \n", + "\n", + " answer \\\n", + "0 I'm sorry, but I cannot answer your question. ... \n", + "1 The provided text mentions that soldering, whi... \n", + "2 Based on the provided text, there is mention o... \n", + "3 I'm sorry, but the provided text does not cont... \n", + "4 The provided text focuses on soldering process... \n", + "5 Based on the provided text, Cookson Electronic... \n", + "6 Based on the provided data, there is no direct... \n", + "7 The provided text focuses on the composition a... \n", + "8 I am sorry, but based on the provided text, I ... \n", + "9 I am sorry, but this question cannot be answer... \n", + "\n", + " comprehensiveness_reason comprehensiveness_rating \\\n", + "0 This answer simply states that it cannot answe... 0 \n", + "1 The answer mentions a connection between solde... 2 \n", + "2 The answer mentions a connection between solde... 1 \n", + "3 Similar to answer 1, it correctly points out t... 2 \n", + "4 Similar to answer 1, this answer acknowledges ... 2 \n", + "5 This answer acknowledges Cookson Electronics' ... 4 \n", + "6 Similar to answer 1, this answer correctly poi... 2 \n", + "7 Similar to answer 1, this answer acknowledges ... 3 \n", + "8 Similar to answer 1, this response acknowledge... 2 \n", + "9 Similar to answer 1, this answer acknowledges ... 1 \n", + "\n", + " diversity_reason diversity_rating \\\n", + "0 No diversity is present; the response only ack... 0 \n", + "1 The answer offers only one limited perspective... 2 \n", + "2 The answer shows limited diversity, primarily ... 1 \n", + "3 No diversity is present; the response only sta... 0 \n", + "4 No diverse perspectives are provided; the resp... 1 \n", + "5 Similar to answer 1, this answer lacks diversi... 4 \n", + "6 No diversity is present; the response focuses ... 1 \n", + "7 This answer shows slightly more diversity by m... 2 \n", + "8 The answer lacks diversity; it only points out... 1 \n", + "9 The answer lacks diversity; it only reiterates... 1 \n", + "\n", + " empowerment_reason empowerment_rating \\\n", + "0 The answer does not empower the reader; it sim... 0 \n", + "1 The answer provides minimal information and do... 2 \n", + "2 The answer does not empower the reader; it hig... 1 \n", + "3 The answer does not empower the reader; it sim... 1 \n", + "4 The answer doesn't empower the reader; it only... 1 \n", + "5 The answer partially empowers the reader by pr... 5 \n", + "6 The answer does not empower the reader; it onl... 1 \n", + "7 The answer provides a bit more context about t... 3 \n", + "8 The answer provides a little more context by m... 2 \n", + "9 The answer doesn't empower the reader; it only... 1 \n", + "\n", + " directness_reason directness_rating \n", + "0 It directly states its inability to answer, bu... 0 \n", + "1 It attempts to address the question but fails ... 3 \n", + "2 The answer acknowledges the question but fails... 2 \n", + "3 It directly states its inability to answer due... 2 \n", + "4 The answer directly states that it cannot answ... 2 \n", + "5 The answer is direct in acknowledging the limi... 6 \n", + "6 It directly states the inability to answer due... 5 \n", + "7 The answer is direct in stating it cannot answ... 3 \n", + "8 It directly states its inability to answer, bu... 3 \n", + "9 It directly states that the question cannot be... 5 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- global_ratings ---\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
answer_numberquestionanswercomprehensiveness_reasoncomprehensiveness_ratingdiversity_reasondiversity_ratingempowerment_reasonempowerment_ratingdirectness_reasondirectness_rating
03What are letter codes in the context of BS 4584?The provided text mentions the use of BS 4584 ...The answer mentions the use of BS 4584 in test...2The answer lacks diversity; it only mentions t...1The answer does not empower the reader; it onl...2The answer is partially direct by mentioning B...3
13How does soldering potentially contribute to p...Soldering's Role in Peaceful Applications\\n\\nS...This answer provides a comprehensive overview ...9The answer offers diverse perspectives by high...8The answer effectively empowers the reader by ...9The answer directly and clearly addresses the ...9
23How does soldering contribute to the developme...Soldering plays a vital role in the creation o...This answer provides a detailed explanation of...9The answer demonstrates good diversity by disc...8The answer effectively empowers the reader by ...9The answer directly addresses the question by ...10
33How does LEAD contribute to the depletion of t...I am sorry but I am unable to answer this ques...The answer is very brief and only states its i...1No diversity is present; the response only sta...0The answer does not empower the reader; it sim...1It directly states its inability to answer.1
43What is the main advantage of using automatic ...Automated soldering, also known as mass solder...This answer focuses on automated *soldering*, ...3The answer lacks diversity; it only provides o...2The answer provides some information about the...3The answer is indirectly related to the questi...4
53What are some of the key areas where Cookson E...I am sorry but I am unable to answer this ques...The answer is essentially an apology and does ...0No diversity is present as the answer offers n...0The answer does not empower the reader in any ...0The answer does not address the question at all.0
63What are the primary functions of actions like...I am sorry but I am unable to answer this ques...This answer is the most concise in stating the...1The answer lacks diversity; it only provides a...0The answer does not empower the reader; it off...0It directly states its inability to answer.4
73What is the significance of the conductivity p...I am sorry but I am unable to answer this ques...This answer is the most concise and provides n...0No diversity is present.0The answer does not empower the reader at all.0It directly states it cannot answer, but offer...1
83Explain the impact of LEAD on the environment,...I am sorry but I am unable to answer this ques...This answer is the most concise in acknowledgi...0No diversity is present; the response simply s...0The answer offers no empowerment to the reader...0It directly states its inability to answer.1
93What specific requirements are defined by stan...## Soldering Standards and Requirements\\n\\nThi...This answer provides a structured overview of ...7The answer covers multiple facets of soldering...7The answer empowers the reader by providing a ...7The answer directly addresses the question by ...9
\n", + "
" + ], + "text/plain": [ + " answer_number question \\\n", + "0 3 What are letter codes in the context of BS 4584? \n", + "1 3 How does soldering potentially contribute to p... \n", + "2 3 How does soldering contribute to the developme... \n", + "3 3 How does LEAD contribute to the depletion of t... \n", + "4 3 What is the main advantage of using automatic ... \n", + "5 3 What are some of the key areas where Cookson E... \n", + "6 3 What are the primary functions of actions like... \n", + "7 3 What is the significance of the conductivity p... \n", + "8 3 Explain the impact of LEAD on the environment,... \n", + "9 3 What specific requirements are defined by stan... \n", + "\n", + " answer \\\n", + "0 The provided text mentions the use of BS 4584 ... \n", + "1 Soldering's Role in Peaceful Applications\\n\\nS... \n", + "2 Soldering plays a vital role in the creation o... \n", + "3 I am sorry but I am unable to answer this ques... \n", + "4 Automated soldering, also known as mass solder... \n", + "5 I am sorry but I am unable to answer this ques... \n", + "6 I am sorry but I am unable to answer this ques... \n", + "7 I am sorry but I am unable to answer this ques... \n", + "8 I am sorry but I am unable to answer this ques... \n", + "9 ## Soldering Standards and Requirements\\n\\nThi... \n", + "\n", + " comprehensiveness_reason comprehensiveness_rating \\\n", + "0 The answer mentions the use of BS 4584 in test... 2 \n", + "1 This answer provides a comprehensive overview ... 9 \n", + "2 This answer provides a detailed explanation of... 9 \n", + "3 The answer is very brief and only states its i... 1 \n", + "4 This answer focuses on automated *soldering*, ... 3 \n", + "5 The answer is essentially an apology and does ... 0 \n", + "6 This answer is the most concise in stating the... 1 \n", + "7 This answer is the most concise and provides n... 0 \n", + "8 This answer is the most concise in acknowledgi... 0 \n", + "9 This answer provides a structured overview of ... 7 \n", + "\n", + " diversity_reason diversity_rating \\\n", + "0 The answer lacks diversity; it only mentions t... 1 \n", + "1 The answer offers diverse perspectives by high... 8 \n", + "2 The answer demonstrates good diversity by disc... 8 \n", + "3 No diversity is present; the response only sta... 0 \n", + "4 The answer lacks diversity; it only provides o... 2 \n", + "5 No diversity is present as the answer offers n... 0 \n", + "6 The answer lacks diversity; it only provides a... 0 \n", + "7 No diversity is present. 0 \n", + "8 No diversity is present; the response simply s... 0 \n", + "9 The answer covers multiple facets of soldering... 7 \n", + "\n", + " empowerment_reason empowerment_rating \\\n", + "0 The answer does not empower the reader; it onl... 2 \n", + "1 The answer effectively empowers the reader by ... 9 \n", + "2 The answer effectively empowers the reader by ... 9 \n", + "3 The answer does not empower the reader; it sim... 1 \n", + "4 The answer provides some information about the... 3 \n", + "5 The answer does not empower the reader in any ... 0 \n", + "6 The answer does not empower the reader; it off... 0 \n", + "7 The answer does not empower the reader at all. 0 \n", + "8 The answer offers no empowerment to the reader... 0 \n", + "9 The answer empowers the reader by providing a ... 7 \n", + "\n", + " directness_reason directness_rating \n", + "0 The answer is partially direct by mentioning B... 3 \n", + "1 The answer directly and clearly addresses the ... 9 \n", + "2 The answer directly addresses the question by ... 10 \n", + "3 It directly states its inability to answer. 1 \n", + "4 The answer is indirectly related to the questi... 4 \n", + "5 The answer does not address the question at all. 0 \n", + "6 It directly states its inability to answer. 4 \n", + "7 It directly states it cannot answer, but offer... 1 \n", + "8 It directly states its inability to answer. 1 \n", + "9 The answer directly addresses the question by ... 9 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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/v7+2rp16zSbzaZpmqZZrVYtLy9PS0lJ0c6ePastXbpU69ixo5aYmKhlZmZqbdq00b755hvNarVqJpNJGzVqlNalSxfNZDJpO3fu1Dp06KAdP35cU1VVKyoq0kaOHKlNnTrVvv4yxcXF2gMPPKA9+OCD2s6dO7WlS5dqPXv21D7//HPNarXal8/MzNQSEhK0o0ePavfcc4/24YcfapqmaTt27NDatGmj5efn2+to1qxZ2oMPPqhpmqadPXtW8/b21tasWaPZbDatsLBQ6969u/btt99qJpNJGzdunDZq1CituLhYs9ls2oIFC7Tg4GDtzJkz2tGjR7UOHTpox44d02w2m/1vVVX1T/tmwoQJWseOHbXU1FRN0zRt586dWrNmzbTY2FitoKBA69Wrl/bdd99pmqZp+/fv11q0aKElJCT8aT1r167VAgMD7eu5lpKSEi0nJ0e7cOGCdurUKe2ZZ57RxowZo5lMJu3ChQta586dtdjYWE3TNM1ms2mzZs3S7r33Xi07O1vTNE1LTEzUYmJitF9//VU7ceKE1qJFC23Lli2aqqpaZmam1qNHD23kyJGapmnanDlztI4dO2qZmZmaqqrasWPHtMjISG3nzp1adna21rVrV+2pp57STCaTvWwPPPCA9vHHH2s2m02Lj4/XWrZsqR04cOAffMPFrU5awqJay8zMZP369QwfPpyUlBSCgoLQ6/Vs2rSJJ598kiFDhvDJJ58wZswY9uzZg6IodOzYkdzcXE6cOEFqairnzp0DoLi4mIKCAtLT0wEICAigdevW9kFeubm5TJ06lZMnT6JpGiUlJaSnp5OdnY3FYuHixYt069YNvV6PXq+na9euxMfHA3D8+HFSUlL497//bW/NnjlzBhcXF6xWK0aj8U9/29GjR/nss89ITk4mNTWVJk2a2MuyefNm5s6dS2lpqX1dDRs2/Mf15urqSufOndHpdLi5uREWFkZmZiYmk4nTp08zfPhwe9dsx44d8fT0BKB+/fq0bNmSF198kYiICGJiYujXr981yw/Qvn17AgMDAWjcuDF+fn7Ex8fTsmVLHnroIX744Qf69+/P999/T7du3ahdu/af1uHm5mav72vRNI1Tp04xbdo0cnNzAUhNTSUsLAyLxfKnz1utVg4ePEhCQgLPPvss8MelhLy8PM6fP09JSQlubm40adIERVHw8fGh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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "graph_rag_comparison.print_comparison_results()\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "myenv", + "language": "python", + "name": "myenv" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples_notebooks/community_contrib/graphrag_comparison/comparison_prompt.py b/examples_notebooks/community_contrib/graphrag_comparison/comparison_prompt.py new file mode 100644 index 0000000000..9814cd3789 --- /dev/null +++ b/examples_notebooks/community_contrib/graphrag_comparison/comparison_prompt.py @@ -0,0 +1,210 @@ +examples = """ +## +Question: +What are the primary functions of actions like bonding and flow in relation to the SI-GC-CU-13 laminate? +## +Answer 1: +The provided data does not contain information about the functions of bonding and flow in relation to the SI-GC-CU-13 laminate. + +The data does provide information about the properties of various laminates, including the SI-GC-CU-13 laminate. However, it does not discuss the specific functions of bonding and flow in relation to this laminate. + +The data does mention that the SI-GC-CU-13 laminate is made of silicone resin, woven glass fabric, and copper conductor [Data: Source unit_text soldering.pdf_13 (13)]. It also provides information about the laminate's thickness, copper weight, and other properties [Data: Source unit_text soldering.pdf_13 (13)]. + +To understand the functions of bonding and flow in relation to the SI-GC-CU-13 laminate, further research would be needed. +## +Answer 2: +Bonding is a crucial process for creating a strong connection between the different layers of laminate material [Data: Reports (314)]. + +The flow of solder is also important for ensuring proper wetting of the surface of a component and the printed circuit board [Data: Reports (109)]. This ensures a strong and reliable connection between the component and the board. + +The flow of electricity through conductors is influenced by the conductivity of the material [Data: Reports (306)]. +## +Answer 3: +The SI-GC-CU-13 laminate is a type of printed circuit board laminate [Data: Entities (324)]. It is a laminate material with a serial number [Data: Entities (324)]. The actions of bonding and flow play a crucial role in creating and maintaining the functionality of this type of laminate. + +**Bonding** refers to the process of connecting layers of laminate materials together [Data: Relationships (314)]. This action is essential in creating multi-layered printed circuit boards, where different layers of laminate are bonded together to create a complex structure [Data: Entities (325)]. In the case of SI-GC-CU-13, bonding helps to create a strong and durable laminate material. + +**Flow** is the movement of a substance from one place to another [Data: Entities (156)]. In the context of printed circuit boards, flow refers to the movement of electricity through the circuit [Data: Relationships (316)]. The SI-GC-CU-13 laminate is designed to allow for the flow of electricity, ensuring that the electronic components on the board can communicate and function properly. + +While the data provided does not explicitly state how these actions relate to SI-GC-CU-13, it does provide general information about bonding and flow in printed circuit boards, which is relevant to understanding the functionality of the SI-GC-CU-13 laminate. +## +Output +[ + { + "Answer_Number": "1", + "Comprehensiveness_Reason": "The answer acknowledges that the provided data does not contain information about bonding and flow, but it mentions basic properties of the laminate without further exploration.", + "Comprehensiveness_Rating": "2", + "Diversity_Reason": "The answer lacks diversity as it focuses solely on stating the absence of information without adding different angles or explanations related to bonding or flow.", + "Diversity_Rating": "3", + "Empowerment_Reason": "The answer does not help the reader make informed judgments since it mostly refers to missing information and suggests further research without any insight into bonding and flow.", + "Empowerment_Rating": "3", + "Directness_Reason": "It is direct in acknowledging the lack of information, but it doesn't address the question in a meaningful way.", + "Directness_Rating": "0" + }, + { + "Answer_Number": "2", + "Comprehensiveness_Reason": "This answer touches on bonding, solder flow, and conductivity, but it is less cohesive and lacks detail compared to Answer 3. It discusses relevant concepts but without directly tying them to the laminate as effectively.", + "Comprehensiveness_Rating": "6", + "Diversity_Reason": "It offers a variety of insights by discussing different types of flow (solder and electricity), but the lack of clear connection to the SI-GC-CU-13 laminate limits its diversity.", + "Diversity_Rating": "6", + "Empowerment_Reason": "The answer provides some useful information about bonding and solder flow, but its fragmented approach makes it less empowering for the reader compared to Answer 3.", + "Empowerment_Rating": "6", + "Directness_Reason": "It somewhat addresses the question but is less focused and direct than Answer 3 in explaining how bonding and flow relate to the SI-GC-CU-13 laminate.", + "Directness_Rating": "6" + }, + { + "Answer_Number": "3", + "Comprehensiveness_Reason": "This answer provides detailed explanations of bonding and flow, connecting these concepts to printed circuit boards and the SI-GC-CU-13 laminate. It discusses bonding in terms of connecting layers and flow as the movement of electricity.", + "Comprehensiveness_Rating": "8", + "Diversity_Reason": "It offers multiple perspectives on bonding (physical connection) and flow (movement of electricity), enriching the reader's understanding of the topic from different angles.", + "Diversity_Rating": "7", + "Empowerment_Reason": "The answer empowers the reader by explaining both bonding and flow in the context of PCBs, helping them understand how these concepts apply to the SI-GC-CU-13 laminate.", + "Empowerment_Rating": "8", + "Directness_Reason": "It directly addresses the question by explaining the roles of bonding and flow in relation to PCBs and links these actions to the laminate in question.", + "Directness_Rating": "9" + } +] +### +Question: +How does soldering potentially contribute to peaceful pursuits? +### +Answer 1: +I cannot answer this question. The provided text focuses on the technical aspects of soldering in electronics assembly, including its history, methods (hand and machine soldering), and quality control. There is no information about how soldering contributes to peaceful pursuits. +Output: +[ + { + "Answer_Number": "1", + "Comprehensiveness_Reason": "It offers no alternative perspectives or insights.", + "Comprehensiveness_Rating": "0", + "Diversity_Reason": "No diversity is present; the response only acknowledges its inability to answer.", + "Diversity_Rating": "0", + "Empowerment_Reason": "The answer does not empower the reader; it simply indicates a lack of information and offers no guidance.", + "Empowerment_Rating": "0", + "Directness_Reason": "it doesn't address the question in a meaningful way.", + "Directness_Rating": "0" + } +] +### + +""" + +eval_system_prompt =""" +There are three responses to a question You need to rate each answer with a number between 0 to 10 and also provide your reason for the rating. + +Negative Points in answers: +- Off-topic or Generalized Content +- Lack of Depth or Detail +- Apologies or Unanswered +- Fragmented or Disorganized +- jumps between topics without clear organization +- Lack of information in text +- Redundancy of information that are not related to the question +- etc +Postive Points in answers: ++ Directly answer the question ++ Avoid superficial and general statements ++ Correct logic in answer related to question ++ Coherence in answer ++ etc + +Your output is a list of JSON: +{{ +Answer_Number: (str) The number of answer. +Comprehensiveness_Reason: How much detail does the answer provide to cover all aspects and details of the question? +Comprehensiveness_Rating: (str) A rating between 0 to 10 +Diversity_Reason: How varied and rich is the answer in providing different perspectives and insights on the question? +Diversity_Rating: (str) A rating between 0 to 10 +Empowerment_Reason: How well does the answer help the reader understand and make informed judgements about the topic? +Empowerment_Rating: (str) A rating between 0 to 10 +Directness_Reason: How specifically and clearly does the answer address the question? +Directness_Rating: (str) A rating between 0 to 10 +}} + +## Examples ## +{examples} +## End of Examples ## +""".format(examples=examples) +eval_user_prompt=""" +## Real Data ## +## +Question: +{question} +## +Answer 1: +{answer_1} +## +Answer 2: +{answer_2} +## +Answer 3: +{answer_3} +## +Output: +""" + + +RAG_SYSTEM_PROMPT=""" + +---Role--- + +You are a helpful assistant responding to questions about data in the tables provided. + + +---Goal--- + +Generate a response of the target length and format that responds to the user's question, summarizing all information in the input data tables appropriate for the response length and format, and incorporating any relevant general knowledge. + +If you don't know the answer, just say so. Do not make anything up. + +Points supported by data should list their data references as follows: + +"This is an example sentence supported by multiple data references [Data: (record ids); (record ids)]." + +Do not list more than 5 record ids in a single reference. Instead, list the top 5 most relevant record ids and add "+more" to indicate that there are more. + +For example: + +"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Sources (15, 16), Reports (1), Entities (5, 7); Relationships (23); Claims (2, 7, 34, 46, 64, +more)]." + +where 15, 16, 1, 5, 7, 23, 2, 7, 34, 46, and 64 represent the id (not the index) of the relevant data record. + +Do not include information where the supporting evidence for it is not provided. + + +---Target response length and format--- + +{response_type} + + +---Data tables--- + +{context_data} + + +---Goal--- + +Generate a response of the target length and format that responds to the user's question, summarizing all information in the input data tables appropriate for the response length and format, and incorporating any relevant general knowledge. + +If you don't know the answer, just say so. Do not make anything up. + +Points supported by data should list their data references as follows: + +"This is an example sentence supported by multiple data references [Data: (record ids); (record ids)]." + +Do not list more than 5 record ids in a single reference. Instead, list the top 5 most relevant record ids and add "+more" to indicate that there are more. + +For example: + +"Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Sources (15, 16), Reports (1), Entities (5, 7); Relationships (23); Claims (2, 7, 34, 46, 64, +more)]." + +where 15, 16, 1, 5, 7, 23, 2, 7, 34, 46, and 64 represent the id (not the index) of the relevant data record. + +Do NOT include information where the supporting evidence for it is NOT provided. If you can not answer based on the provided text just say so and do not continiue. + +---Target response length and format--- + +{response_type} + +Add sections and commentary to the response as appropriate for the length and format. Style the response in markdown. +""" +RESPONSE_TYPE = "multiple paragraphs" \ No newline at end of file diff --git a/examples_notebooks/community_contrib/graphrag_comparison/graphrag_comparison.py b/examples_notebooks/community_contrib/graphrag_comparison/graphrag_comparison.py new file mode 100644 index 0000000000..c8e44d59a9 --- /dev/null +++ b/examples_notebooks/community_contrib/graphrag_comparison/graphrag_comparison.py @@ -0,0 +1,585 @@ + +import pandas as pd +import tiktoken +from json_repair import loads +from comparison_prompt import eval_system_prompt,eval_user_prompt, RAG_SYSTEM_PROMPT, RESPONSE_TYPE +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd + +from graphrag.query.context_builder.entity_extraction import EntityVectorStoreKey +from graphrag.query.indexer_adapters import ( + read_indexer_covariates, + read_indexer_entities, + read_indexer_relationships, + read_indexer_reports, + read_indexer_text_units, +) +from graphrag.query.question_gen.local_gen import LocalQuestionGen +from graphrag.query.structured_search.local_search.mixed_context import ( + LocalSearchMixedContext,build_text_unit_context,LocalContextBuilder +) +from graphrag.query.structured_search.local_search.search import LocalSearch +from graphrag.vector_stores.lancedb import LanceDBVectorStore +from graphrag.query.indexer_adapters import ( + read_indexer_communities, + read_indexer_entities, + read_indexer_reports, +) +import tiktoken +from graphrag.query.indexer_adapters import read_indexer_entities, read_indexer_reports +#from graphrag.query.llm.oai.chat_openai import ChatOpenAI +#from graphrag.query.llm.oai.typing import OpenaiApiType +from graphrag.query.structured_search.global_search.community_context import ( + GlobalCommunityContext, +) +from graphrag.query.structured_search.global_search.search import GlobalSearch + +from graphrag.config.enums import ModelType +from graphrag.config.models.language_model_config import LanguageModelConfig +from graphrag.language_model.manager import ModelManager +from graphrag.config.load_config import load_config +from pathlib import Path + + +from dataclasses import dataclass,replace + +@dataclass +class Answer: + answer_number: int = 0 + question: str = "" + answer: str = "" + comprehensiveness_reason: str = "" + comprehensiveness_rating: int = 0 + diversity_reason: str = "" + diversity_rating: int = 0 + empowerment_reason: str = "" + empowerment_rating: int = 0 + directness_reason: str = "" + directness_rating: int = 0 + + +@dataclass +class Method: + rag_search:Answer=None + local_search:Answer=None + global_search:Answer=None + error:str="" + + + +class GraphRagcomparison: + + # Constants defined at class level + COMMUNITY_REPORT_TABLE = "community_reports" + ENTITY_TABLE = "entities" + COMMUNITY_TABLE = "communities" + RELATIONSHIP_TABLE = "relationships" + COVARIATE_TABLE = "covariates" + TEXT_UNIT_TABLE = "text_units" + COMMUNITY_LEVEL = 2 + default_entity_description = "default-entity-description" + default_text_unit_text = "default-text_unit-text" + + def __init__(self, root_dir: str, temperature: float = 0.0): + + print("Initializing GraphRAGSearch...") + self.root_dir = Path(root_dir) + self.compare_dir = self.root_dir.joinpath("comparison_results") + self.compare_dir.mkdir(parents=True, exist_ok=True) + self.temperature = temperature + self.config = None + self.output_dir = None + self.lancedb_uri = None + + # Models & Encoder + self.rag_model = None + self.local_model = None + self.global_model = None + self.compare_model = None + self.text_embedder = None + self.token_encoder = None + + + # Data + self.entities = None + self.communities = None + self.relationships = None + self.reports = None + self.text_units = None + + # Vector Store + self.description_embedding_store = None + self.text_unit_embedding_store = None + + # Context Builders + self.local_context_builder = None + self.global_context_builder = None + + # Search Objects + self.localsearch = None + self.globalsearch = None + + # Run setup methods + self._load_config() + self._setup_paths() + self._setup_models_and_encoder() + self._load_data() + self.description_embedding_store=self._setup_vector_store(vector_store_collection_name=self.default_entity_description) + self.text_unit_embedding_store=self._setup_vector_store(vector_store_collection_name=self.default_text_unit_text) + self._setup_context_builders() + self._setup_search_engines() + print("Initialization complete.") + + + def run_rag_search(self,question): + + rag_results = self.text_unit_embedding_store.similarity_search_by_text(question,k=5,text_embedder=self.text_embedder.embed,) + context_text="" + + for r in rag_results: + text = r.document.text + id = r.document.id + context_text += f"[Data: Source unit_text {id}]\n{text}\n" + + + system_prompt = RAG_SYSTEM_PROMPT.format( + + context_data=context_text, response_type=RESPONSE_TYPE + ) + prompt = system_prompt.strip() + "\nQuestion: " + question.strip() + + llm_result = self.rag_model.chat(prompt).output.content + print(f"--- Running Normal RAG: {llm_result[:50]} ---") + + return llm_result + + def _load_config(self): + """Loads configuration from the root directory.""" + print("Loading configuration...") + self.config = load_config(self.root_dir) + if not self.config: + raise ValueError(f"Could not load configuration from {self.root_dir}") + print("Configuration loaded.") + + def _setup_paths(self): + """Sets up output directory and LanceDB URI paths.""" + self.output_dir = self.config.output.base_dir + self.lancedb_uri = f"{self.output_dir}/lancedb" + print(f"Output directory set to: {self.output_dir}") + print(f"LanceDB URI set to: {self.lancedb_uri}") + + def _setup_models_and_encoder(self): + """Initializes LLM chat models, embedding model, and token encoder.""" + print("Setting up models and token encoder...") + model_manager = ModelManager() + + chat_config = self.config.models['default_chat_model'] + print(f"Using chat model config: {chat_config}") + self.rag_model = model_manager.get_or_create_chat_model( + name = "rag_search", + model_type=ModelType.OpenAIChat, + config=chat_config, + ) + self.local_model = model_manager.get_or_create_chat_model( + name = "local_search", + model_type=ModelType.OpenAIChat, + config=chat_config, + ) + + self.global_model = model_manager.get_or_create_chat_model( + name="global_search_chat", + model_type=ModelType.OpenAIChat, + config=chat_config, # Using the same config + ) + + self.compare_model = model_manager.get_or_create_chat_model( + name="compare", + model_type=ModelType.OpenAIChat, + config=chat_config, # Using the same config + ) + + # Token Encoder + try: + self.token_encoder = tiktoken.get_encoding("cl100k_base") + except Exception: + print("cl100k_base encoding not found, trying model name...") + self.token_encoder = tiktoken.encoding_for_model("gpt-4-turbo-preview") + print(f"Token Encoder created based on: {'cl100k_base' if 'cl100k_base' in str(self.token_encoder) else llm_model_name}") + + # Embedding Model + embedding_config = self.config.models['default_embedding_model'] + self.text_embedder = model_manager.get_or_create_embedding_model( + name="local_search_embedding", + model_type=ModelType.OpenAIEmbedding, + config=embedding_config, + ) + print("Models and encoder setup complete.") + + def _load_data(self): + """Loads data from parquet files.""" + print("Loading data from parquet files...") + try: + entity_df = pd.read_parquet(f"{self.output_dir}/{self.ENTITY_TABLE}.parquet") + community_df = pd.read_parquet(f"{self.output_dir}/{self.COMMUNITY_TABLE}.parquet") + report_df = pd.read_parquet(f"{self.output_dir}/{self.COMMUNITY_REPORT_TABLE}.parquet") + relationship_df = pd.read_parquet(f"{self.output_dir}/{self.RELATIONSHIP_TABLE}.parquet") + text_unit_df = pd.read_parquet(f"{self.output_dir}/{self.TEXT_UNIT_TABLE}.parquet") + + # Process data using indexer readers + self.entities = read_indexer_entities(entity_df, community_df, self.COMMUNITY_LEVEL) + self.communities = read_indexer_communities(community_df, report_df) # Assuming this signature is correct + + # Handle potential NaNs in relationship degrees + relationship_df.fillna({'combined_degree': 0.0}, inplace=True) # More specific fillna + self.relationships = read_indexer_relationships(relationship_df) + + self.reports = read_indexer_reports(report_df, community_df, self.COMMUNITY_LEVEL) + self.text_units = read_indexer_text_units(text_unit_df) + + print(f"Loaded {len(self.entities)} entities, {len(self.communities)} communities, " + f"{len(self.relationships)} relationships, {len(self.reports)} reports, " + f"{len(self.text_units)} text units.") + except FileNotFoundError as e: + print(f"ERROR: Parquet file not found: {e}. Ensure indexing pipeline has run successfully.") + raise + except Exception as e: + print(f"ERROR loading or processing data: {e}") + raise + print("Data loading complete.") + + + def _setup_vector_store(self,vector_store_collection_name): + """Sets up the LanceDB vector store for entity descriptions.""" + print("Setting up vector store...") + vector_store = LanceDBVectorStore( + collection_name=vector_store_collection_name, + ) + try: + vector_store.connect(db_uri=self.lancedb_uri) + # Test connection (optional but good practice) + test_search = vector_store.similarity_search_by_text( + "test query", k=1, text_embedder=self.text_embedder.embed + ) + print(f"Vector store connected successfully to {self.lancedb_uri} " + f"(collection: {self.default_entity_description}). Test search returned {len(test_search)} result(s).") + return vector_store + except Exception as e: + print(f"ERROR connecting to or querying vector store at {self.lancedb_uri}: {e}") + print("Please ensure LanceDB is running and the collection exists.") + + + + + def _setup_context_builders(self): + """Creates the context builders for local and global search.""" + print("Setting up context builders...") + # Local Context Builder + self.local_context_builder = LocalSearchMixedContext( + community_reports=self.reports, + text_units=self.text_units, + entities=self.entities, + relationships=self.relationships, + covariates=None, # Explicitly None as per original code comment + entity_text_embeddings=self.description_embedding_store, + embedding_vectorstore_key=EntityVectorStoreKey.ID, # Defaulting to ID + text_embedder=self.text_embedder, + token_encoder=self.token_encoder, + ) + print("LocalSearchMixedContext created.") + + # Global Context Builder + self.global_context_builder = GlobalCommunityContext( + community_reports=self.reports, + communities=self.communities, + entities=self.entities, + token_encoder=self.token_encoder, + ) + print("GlobalCommunityContext created.") + print("Context builders setup complete.") + + def _setup_search_engines(self): + """Configures and initializes the LocalSearch and GlobalSearch objects.""" + print("Setting up search engines...") + + # Local Search Configuration + local_context_params = { + "text_unit_prop": 0.5, + "community_prop": 0.1, + "conversation_history_max_turns": 5, + "conversation_history_user_turns_only": True, + "top_k_mapped_entities": 10, + "top_k_relationships": 10, + "include_entity_rank": True, + "include_relationship_weight": True, + "include_community_rank": False, + "return_candidate_context": False, + "embedding_vectorstore_key": EntityVectorStoreKey.ID, + "max_tokens": 12_000, + } + local_llm_params = { + "max_tokens": 2_000, + "temperature": self.temperature, + } + self.localsearch = LocalSearch( + model=self.local_model, # Use the primary chat model + context_builder=self.local_context_builder, + token_encoder=self.token_encoder, + model_params=local_llm_params, + context_builder_params=local_context_params, + response_type="multiple paragraphs", + ) + print("LocalSearch engine configured.") + + # Global Search Configuration + global_context_builder_params = { + "use_community_summary": False, + "shuffle_data": True, + "include_community_rank": True, + "min_community_rank": 0, + "community_rank_name": "rank", + "include_community_weight": True, + "community_weight_name": "occurrence weight", + "normalize_community_weight": True, + "max_tokens": 12_000, + "context_name": "Reports", + } + map_llm_params = { + "max_tokens": 1000, + "temperature": self.temperature, + "response_format": {"type": "json_object"}, + } + reduce_llm_params = { + "max_tokens": 2000, + "temperature": self.temperature, + } + self.globalsearch = GlobalSearch( + model=self.global_model, + context_builder=self.global_context_builder, + token_encoder=self.token_encoder, + max_data_tokens=12_000, + map_llm_params=map_llm_params, + reduce_llm_params=reduce_llm_params, + allow_general_knowledge=False, + json_mode=True, + context_builder_params=global_context_builder_params, + concurrent_coroutines=1, + response_type="multiple paragraphs", + ) + print("GlobalSearch engine configured.") + print("Search engines setup complete.") + + async def run_local_search(self, question: str) -> str: + """Runs a local search query.""" + if not self.localsearch: + raise RuntimeError("LocalSearch engine not initialized.") + + result = await self.localsearch.search(question) + print(f"--- Running GraphRAG Local Search: {result.response[:50]} ---") + return result.response + + async def run_global_search(self, question: str) -> str: + """Runs a global search query.""" + if not self.globalsearch: + raise RuntimeError("GlobalSearch engine not initialized.") + result = await self.globalsearch.search(question) + print(f"--- Running GraphRAG Global Search: {result.response[:50]} ---") + + return result.response + + async def answer_questions(self, questions: list[str], sleep_interval: int = 5): + + results = [] + print(f"\n--- Starting Evaluation of {len(questions)} Questions ---") + for i, question in enumerate(questions): + print(f"\nProcessing Question {i+1}/{len(questions)}: '{question}'") + method = Method() + + try: + # Standard RAG + method.rag_search = Answer(question=question, answer = self.run_rag_search(question)) + + # GraphRAG Local Search + method.local_search= Answer(question=question, answer = await self.run_local_search(question)) + + # GraphRAG Global Search + method.global_search = Answer(question=question, answer = await self.run_global_search(question)) + + except Exception as e: + print(f"ERROR processing question '{question}': {e}") + method.error = str(e) + + results.append(method) + + + return results + + + def compare_answers(self, + methods: list[Method], + + ) -> dict[str, pd.DataFrame]: + + for i, method in enumerate(methods): + method : Method + #print(method) + question = method.rag_search.question + answers = { + 'answer_1': method.rag_search.answer, + 'answer_2': method.local_search.answer, + 'answer_3': method.global_search.answer + } + print(f"\nEvaluating Row {i}: {question[:80]}...") + + #try: + user_prompt = eval_user_prompt.format(question=question, **answers) + prompt = eval_system_prompt + user_prompt + prompt = prompt.lower() + print("length of prompt: ", len(prompt)) + llm_outputs = self.compare_model.chat(prompt) + llm_outputs = loads(llm_outputs.output.content) + print(f"LLM Output Snippet: {str(llm_outputs)[:100]}...") + + for idx, output_rating in enumerate(llm_outputs): + match output_rating["answer_number"]: + case '1': + method.rag_search = replace( method.rag_search, **output_rating) + case '2': + method.local_search = replace( method.local_search, **output_rating) + case '3': + method.global_search = replace( method.global_search, **output_rating) + + + rag_answers = [method.rag_search for method in methods] + local_answers = [method.local_search for method in methods] + global_answers = [method.global_search for method in methods] + + # Create a DataFrame for each rating list + df_rag = pd.DataFrame(rag_answers) + df_local = pd.DataFrame(local_answers) + df_global = pd.DataFrame(global_answers) + + df_rag.to_parquet(self.compare_dir.joinpath(f"rag_ratings.parquet")) + df_local.to_parquet(self.compare_dir.joinpath(f"local_ratings.parquet")) + df_global.to_parquet(self.compare_dir.joinpath(f"global_ratings.parquet")) + + df_compare = pd.DataFrame({ + 'Question': df_rag["question"], + 'RAG': df_rag["answer"], + 'Graph RAG (Local)': df_local["answer"], + 'Graph RAG (Global)': df_global["answer"] + }) + df_compare.to_parquet(self.compare_dir.joinpath(f"compare_result.parquet")) + + print("--- Evaluation Complete ---") + return methods # Return the dataframes + + def plot_comparison_results(self,): + + + filenames = [ + 'rag_ratings', + 'local_ratings', + 'global_ratings' + ] + + ratings_columns = ['comprehensiveness_rating', 'diversity_rating', 'empowerment_rating', 'directness_rating'] + + bar_width = 0.25 + + n_categories = len(ratings_columns) + + x = np.arange(n_categories) + + plt.figure(figsize=(10, 6)) + + sum_per_questions = [] + for i, fn in enumerate(filenames): + # Load the data + rag_ratings = pd.read_parquet(self.compare_dir.joinpath( fn + '.parquet')) + data = rag_ratings[ratings_columns].astype(int) + + bars = data.sum() / data.count() + sum_per_questions.append( data.sum(1) ) + + plt.bar(x + i * bar_width, bars.values, width=bar_width, label=fn) + + sum_per_questions = pd.DataFrame(sum_per_questions) + winners = sum_per_questions.idxmax(0) + w = winners.value_counts() + + # Set x-tick positions and labels + plt.xticks(x + bar_width * (len(filenames) - 1) / 2, ratings_columns, rotation=45) + plt.xlabel('Rating Categories', fontsize=12) + plt.ylabel('Average Ratings', fontsize=12) + plt.title('Average Ratings by Category', fontsize=16) + plt.legend(title='Keys') + + #plt.show() + plt.gcf().savefig(self.compare_dir.joinpath('comparison_plot.png'), bbox_inches='tight') + + + def print_comparison_results(self,): + from IPython.display import display + for fn in ['compare_result','rag_ratings', 'local_ratings', 'global_ratings']: + print(f"\n--- {fn} ---") + display(pd.read_parquet(self.compare_dir.joinpath(fn + '.parquet'))) + + img = plt.imread(self.compare_dir.joinpath('comparison_plot.png')) + plt.imshow(img) + plt.axis('off') + plt.show() + + + + +if __name__ == "__main__": + import asyncio + + + ROOT_DIR = "/home/cip/ce/ix05ogym/Majid/LLM/GraphRag/v2/" # UPDATE THIS PATH + TEMPERATURE_SETTING = 0.2 # Example temperature + + questions_to_evaluate = [ + "What are letter codes in the context of BS 4584?", + "How does soldering potentially contribute to peaceful pursuits?", + "How does soldering contribute to the development of intelligent machines?", + "How does LEAD contribute to the depletion of the ozone layer?", + "What is the main advantage of using automatic insertion for component placement?", + 'What are some of the key areas where Cookson Electronics is involved?', + 'What are the primary functions of actions like bonding and flow in relation to the SI-GC-CU-13 laminate?', + 'What is the significance of the conductivity property of the SI-GC-CU-13 laminate?', + 'Explain the impact of LEAD on the environment, specifically its relationship with the ozone layer?', + 'What specific requirements are defined by standards in soldering?', + 'What is the significance of the "degree of 6" mentioned in relation to printed wiring boards?', + 'Is there any information about the specific types of components that are typically joined using soldering processes?', + "What concepts are connected to wave soldering?", + 'What are the potential dangers associated with wavesoldering systems?', + 'What is the purpose of TABLE 1.2 in relation to letter codes?', + 'How does the time allowed for cooling after soldering impact the joint?', + "what are top 5 important topics in soldering? write it with a number from 1 to 5", + "what are 5 least important topics in soldering? write it with a number from 1 to 5", + "what cause soldification quality decrease?", + "if I have a poor solder can I still reach a high quality soldering? How?", + "give me a comperhensive summary of solidification", + "what is relationship between address and alloy?" + ][:10] + + async def main(): + graph_rag_comparison = GraphRagcomparison(root_dir=ROOT_DIR, temperature=TEMPERATURE_SETTING) + + evaluation_results = await graph_rag_comparison.answer_questions( + questions=questions_to_evaluate, + sleep_interval=5 + ) + print(evaluation_results) + graph_rag_comparison.compare_answers(evaluation_results, + ) + print(f"Evaluation results saved to {graph_rag_comparison.compare_dir}.") + + graph_rag_comparison.plot_comparison_results() + + print("\n--- Final Evaluation Results ---") + + + asyncio.run(main()) \ No newline at end of file