From b9fde23052d7a47e57b9d637460638121fe11f0b Mon Sep 17 00:00:00 2001 From: majidsh97 Date: Thu, 10 Apr 2025 05:02:17 +0200 Subject: [PATCH 1/5] merge_entities --- graphrag/config/defaults.py | 10 +- graphrag/config/models/graph_rag_config.py | 6 +- .../config/models/merge_entities_config.py | 22 ++ graphrag/index/workflows/__init__.py | 5 +- graphrag/index/workflows/factory.py | 1 + graphrag/index/workflows/merge_entities.py | 240 ++++++++++++++++++ graphrag/prompts/index/merge_entities copy.py | 104 ++++++++ graphrag/prompts/index/merge_entities.py | 117 +++++++++ 8 files changed, 502 insertions(+), 3 deletions(-) create mode 100644 graphrag/config/models/merge_entities_config.py create mode 100644 graphrag/index/workflows/merge_entities.py create mode 100644 graphrag/prompts/index/merge_entities copy.py create mode 100644 graphrag/prompts/index/merge_entities.py diff --git a/graphrag/config/defaults.py b/graphrag/config/defaults.py index 3977ed5820..d54289682e 100644 --- a/graphrag/config/defaults.py +++ b/graphrag/config/defaults.py @@ -399,7 +399,13 @@ class VectorStoreDefaults: audience: None = None database_name: None = None - +@dataclass +class MergeEntitiesDefaults: + """Default values for merging entities workflow.""" + enabled: bool = True + eps: float=0.2 + min_samples: int=2 + @dataclass class GraphRagConfigDefaults: """Default values for GraphRAG.""" @@ -439,7 +445,9 @@ class GraphRagConfigDefaults: vector_store: dict[str, VectorStoreDefaults] = field( default_factory=lambda: {DEFAULT_VECTOR_STORE_ID: VectorStoreDefaults()} ) + merge_entities: MergeEntitiesDefaults = field(default_factory=MergeEntitiesDefaults) workflows: None = None + language_model_defaults = LanguageModelDefaults() diff --git a/graphrag/config/models/graph_rag_config.py b/graphrag/config/models/graph_rag_config.py index c4c5b780c3..73aece48a2 100644 --- a/graphrag/config/models/graph_rag_config.py +++ b/graphrag/config/models/graph_rag_config.py @@ -33,6 +33,7 @@ from graphrag.config.models.summarize_descriptions_config import ( SummarizeDescriptionsConfig, ) +from graphrag.config.models.merge_entities_config import MergeEntitiesConfig from graphrag.config.models.text_embedding_config import TextEmbeddingConfig from graphrag.config.models.umap_config import UmapConfig from graphrag.config.models.vector_store_config import VectorStoreConfig @@ -281,7 +282,10 @@ def _validate_reporting_base_dir(self) -> None: description="The basic search configuration.", default=BasicSearchConfig() ) """The basic search configuration.""" - + merge_entities: MergeEntitiesConfig = Field( + description="The merge entities workflow configuration.", default=MergeEntitiesConfig() + ) + def _validate_vector_store_db_uri(self) -> None: """Validate the vector store configuration.""" for store in self.vector_store.values(): diff --git a/graphrag/config/models/merge_entities_config.py b/graphrag/config/models/merge_entities_config.py new file mode 100644 index 0000000000..722f037646 --- /dev/null +++ b/graphrag/config/models/merge_entities_config.py @@ -0,0 +1,22 @@ +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +from graphrag.config.defaults import graphrag_config_defaults + + +class MergeEntitiesConfig(BaseModel): + """The default configuration section for Node2Vec.""" + + enabled: bool = Field( + description="A flag indicating whether to enable merge entities workflow.", + default=graphrag_config_defaults.merge_entities.enabled, + ) + eps: float = Field( + description="eps for DBSCAN clustering algorithm.", + default=graphrag_config_defaults.merge_entities.eps, + ) + min_samples: int = Field( + description="min_samples for DBSCAN clustering algorithm.", + default=graphrag_config_defaults.merge_entities.min_samples, + ) \ No newline at end of file diff --git a/graphrag/index/workflows/__init__.py b/graphrag/index/workflows/__init__.py index 425639be0b..16c67b99d0 100644 --- a/graphrag/index/workflows/__init__.py +++ b/graphrag/index/workflows/__init__.py @@ -42,7 +42,9 @@ from .prune_graph import ( run_workflow as run_prune_graph, ) - +from .merge_entities import ( + run_workflow as run_merge_entities, +) # register all of our built-in workflows at once PipelineFactory.register_all({ "create_base_text_units": run_create_base_text_units, @@ -57,4 +59,5 @@ "finalize_graph": run_finalize_graph, "generate_text_embeddings": run_generate_text_embeddings, "prune_graph": run_prune_graph, + "merge_entities": run_merge_entities, }) diff --git a/graphrag/index/workflows/factory.py b/graphrag/index/workflows/factory.py index b68ccf55e0..c64c48c4eb 100644 --- a/graphrag/index/workflows/factory.py +++ b/graphrag/index/workflows/factory.py @@ -48,6 +48,7 @@ def _get_workflows_list( "create_base_text_units", "create_final_documents", "extract_graph", + *(["merge_entities"] if config.merge_entities.enabled else []), "finalize_graph", *(["extract_covariates"] if config.extract_claims.enabled else []), "create_communities", diff --git a/graphrag/index/workflows/merge_entities.py b/graphrag/index/workflows/merge_entities.py new file mode 100644 index 0000000000..d2f02cc43c --- /dev/null +++ b/graphrag/index/workflows/merge_entities.py @@ -0,0 +1,240 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run_workflow method definition.""" +# %% +from datetime import datetime, timezone +from typing import cast +from uuid import uuid4 +import logging +import numpy as np +import pandas as pd + +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.index.operations.cluster_graph import cluster_graph +from graphrag.index.operations.create_graph import create_graph +from graphrag.index.typing.context import PipelineRunContext, PipelineStorage +from graphrag.index.typing.workflow import WorkflowFunctionOutput +from graphrag.utils.storage import load_table_from_storage, write_table_to_storage +from graphrag.vector_stores.lancedb import LanceDBVectorStore +from graphrag.storage.file_pipeline_storage import FilePipelineStorage + +from sklearn.cluster import DBSCAN +from graphrag.prompts.index.merge_entities import MERGE_ENTITIES_INPUT, MERGE_ENTITIES_SYSTEM + +from graphrag.config.models.language_model_config import LanguageModelConfig +from graphrag.language_model.manager import ModelManager +from graphrag.config.load_config import load_config, Path + +from json_repair import loads +from json import dump + +log = logging.getLogger(__name__) +# from graphrag.language_model.manager import ChatModel +from graphrag.config.embeddings import ( + entity_title_embedding, + #get_embedded_fields, + get_embedding_settings, +) +from graphrag.index.workflows.generate_text_embeddings import generate_text_embeddings + + +async def run_workflow( + config: GraphRagConfig, + context: PipelineRunContext, +) -> WorkflowFunctionOutput: + + llm_config = config.models["default_chat_model"] + llm = ModelManager().get_or_create_chat_model( + name="extract_claims", + model_type=llm_config.type, + config=llm_config, + callbacks=context.callbacks, + cache=context.cache, + ) + # Load entities and relationships + entities = await load_table_from_storage("entities", context.storage) + relationships = await load_table_from_storage("relationships", context.storage) + + if "human_readable_id" not in entities.columns: + entities["human_readable_id"] = entities.index + if "id" not in entities.columns: + entities["id"] = entities["human_readable_id"].apply(lambda _x: str(uuid4())) + # Embed entities.title + embeddings_df = await create_entity_title_embedding(entities, config, context) + embeddings_df = embeddings_df["entity.title"] + + # calculate cosine similarity + embeddings_numpy = embeddings_df["embedding"].values + embeddings_numpy = np.stack(embeddings_numpy, axis=0) + similarity_matrix = cosine_similarity_matrix(embeddings_numpy) + # clustering + embeddings_df["cluster"] = get_dbscan_cluster_labels(similarity_matrix,eps = config.merge_entities.eps,min_samples = config.merge_entities.min_samples) + # find duplicates + llm_json = find_duplicate_entities(llm, embeddings_df, entities) + + with open(config.output.base_dir + '/merged_entities.json', 'w') as f: + dump({"length": len(llm_json), "llm_json": llm_json}, f) + # update + entities, relationships = update_entities_relationships( + entities, relationships, llm_json + ) + + # save + await write_table_to_storage(relationships, "relationships", context.storage) + await write_table_to_storage(entities, "entities", context.storage) + + return WorkflowFunctionOutput( + result={ + "entities": entities, + "relationships": relationships, + } + ) + + +def find_duplicate_entities(llm, embeddings: pd.DataFrame, entities: pd.DataFrame): + prompt_input = get_input_for_prompt(embeddings=embeddings, entities=entities) + prompt = MERGE_ENTITIES_SYSTEM + MERGE_ENTITIES_INPUT.format(input=prompt_input) + response = llm.chat(prompt).output.content + llm_json = loads(response) + return llm_json + + +async def create_entity_title_embedding( + entities, config: GraphRagConfig, context: PipelineRunContext +): + embedded_fields = set([entity_title_embedding]) + config_copy = config.copy() + config_copy.embed_text.target = "selected" + text_embed = get_embedding_settings(config_copy) + + # LANCEDB_URI = f"{config.root_dir}/output/lancedb" + # embeddings_df = load_embeddings_from_default_entity_title(LANCEDB_URI) + + embeddings_df = await generate_text_embeddings( + documents=None, + relationships=None, + text_units=None, + community_reports=None, + entities=entities, + callbacks=context.callbacks, + cache=context.cache, + text_embed_config=text_embed, + embedded_fields=embedded_fields, + ) + + return embeddings_df + + +def update_entities_relationships(entities: pd.DataFrame, relationships, response): + import itertools + + entities = entities.set_index("human_readable_id", drop=False) + entities.index = entities.index.astype(int) + all_ids = [] + new_entities_list = [] + for item in response: + """ + item is llm output + { + "ids": [4, 13], + "entities": ["PCB", "PRINTED CIRCUIT BOARD"], + "final_entity": "PRINTED CIRCUIT BOARD", + "final_description": "A printed circuit board (PCB), also known as a printed wiring board (PWB) or printed board, is a thin board of insulating material used in electronics assembly to hold and connect electronic components. The PCB serves as a substrate, typically made from thermosetting or thermoplastic plastics, reinforced with materials like paper, glass fiber, cotton, or nylon. It features conductive pathways (usually copper) printed on one or both sides, which interconnect components via soldering to lands (pads). These connections are made either through plated through-holes for leaded components or directly onto the surface for surface-mount components. PCBs are manufactured using printing techniques, and the conductive tracks can be created additively (adding tracks) or subtractively (removing excess material from a pre-coated base). They are available in single-sided, double-sided, and multi-layered configurations, and are essential in all electronic assemblies, providing support and pathways for components during the soldering process.", + "final_type": "MATERIAL" + } + """ + if len(item) < 1: + continue + + try: + item["ids"] = list(map(int, item["ids"])) + old_rows = entities.loc[item["ids"], :] + new_id = old_rows["id"].iloc[0] # How to generate a new id? uuid? + human_readable_id = old_rows.index[ + 0 + ] # How to generate a new human readable id? just autoincrement ? + new_title = item["final_entity"] + new_type = item["final_type"] + new_description = item["final_description"] + new_x = old_rows["x"].mean() # How to generate a new x? + new_y = old_rows[ "y"].mean() # How to generate a new y? umap will be generated in the last workflow? + frequency = old_rows["frequency"].sum() + degree = old_rows["degree"].sum() + textunit_ids = old_rows["text_unit_ids"] + textunit_ids = list(itertools.chain.from_iterable(textunit_ids)) + row = { + "id": new_id, + "human_readable_id": human_readable_id, + "title": new_title, + "type": new_type, + "description": new_description, + "text_unit_ids": textunit_ids, + "frequency": frequency, + "degree": degree, + "x": new_x, + "y": new_y, + } + relationships.loc[ + relationships["source"].isin(item["entities"]), "source" + ] = new_title + relationships.loc[ + relationships["target"].isin(item["entities"]), "target" + ] = new_title + # Do we need to update relationships descriptions? I think yes but it may not be necessary + #because we only merge close entities + + new_entities_list.append(row) + all_ids.extend(item["ids"]) + except Exception as e: + log.exception("update_entities_relationships: %s", e) + + + """" + or this version + updated_source = relationships['source'].where( + ~relationships['source'].isin(item['entities']), new_title + ) + + updated_target = relationships['target'].where( + ~relationships['target'].isin(item['entities']), new_title + ) + + updated_relationships = relationships.assign(source=updated_source, target=updated_target) + + """ + entities = entities.drop(all_ids) + entities = pd.concat([entities, pd.DataFrame(new_entities_list)]) + return entities, relationships + + +def cosine_similarity_matrix(X): + norms = np.linalg.norm(X, axis=1, keepdims=True) + X_normalized = X / norms + sim_matrix = np.dot(X_normalized, X_normalized.T) + sim_matrix = np.clip(sim_matrix, -1.0, 1.0) + return sim_matrix + + +def get_dbscan_cluster_labels(similarity_matrix,eps=0.2,min_samples=2): + + dbscan = DBSCAN( + metric="precomputed", eps=eps, min_samples=min_samples + ) # eps=0.2 corresponds to 80% similarity + cosine_distance = 1 - similarity_matrix + labels = dbscan.fit_predict(cosine_distance) + return labels + + +def get_input_for_prompt(embeddings: pd.DataFrame, entities: pd.DataFrame): + text = "" + for cluster_id, group_df in embeddings.groupby("cluster"): + if cluster_id == -1: + continue + row = entities.loc[ + group_df.index, ["human_readable_id", "title", "type", "description"] + ] + text += "cluster:" + str(cluster_id) + "\n" + text += str(row.rename({"human_readable_id": "id"}).to_dict("records")) + "\n" + + return text diff --git a/graphrag/prompts/index/merge_entities copy.py b/graphrag/prompts/index/merge_entities copy.py new file mode 100644 index 0000000000..976f80abe7 --- /dev/null +++ b/graphrag/prompts/index/merge_entities copy.py @@ -0,0 +1,104 @@ +MERGE_ENTITIES_PROMPT = """ +You are given some entities that may need to be mereged if they are the same. +merge only those that have minor differences like plural form such as SOLDERS and SOLDER or SOLDERING PROCESSES and SOLDERING or acronyms like PCB and PRINTED CIRCUIT BOARD. +Do NOT merge entities that have major differences like SC SOLDERING PROCESSES and CS SOLDERING PROCESSES because they are different processes. +Pay attention to the descriptions of the entities. they have descripe the same thing if discriptions are different merge is not required. +Also only merge thoese that have the same type. if the type is different then don't merge. +Examples: +### +input: +{{'entity': 'PROTECTIVE COATINGS', 'type': 'MATERIAL', 'description': 'Coatings applied to components or the printed circuit board to improve solderability or protect against corrosion.', 'id': 21}}, +{{'entity': 'PROTECTIVE COATING', 'type': 'MATERIAL', 'description': 'A protective coating is applied to boards and components to maintain solderability by preventing oxidation of the copper. However, no coating can maintain solderability indefinitely, and the effectiveness depends on the coating type, storage conditions, and coating thickness. Re-testing after storage is recommended.>', 'id': 164}} +output: +[{{ + "ids": [21, 164], + "entities": ["PROTECTIVE COATINGS", "PROTECTIVE COATING"], + "final_entity": "PROTECTIVE COATINGS", + "final_description": "Coatings applied to components or the printed circuit board to improve solderability by preventing oxidation of the copper or protect against corrosion.However, no coating can maintain solderability indefinitely, and the effectiveness depends on the coating type, storage conditions, and coating thickness. Re-testing after storage is recommended.", + "final_type": "MATERIAL" +}}] +### +input: +{{'entity': 'CLEANING', 'type': 'PROCESS', 'description': 'Cleaning, in the context of electronics manufacturing, is a crucial process encompassing several stages. Before soldering, cleaning metallic surfaces ensures proper wetting and a strong solder joint. After soldering, cleaning removes flux residues and other contaminants from the soldered assemblies, including densely populated printed circuit boards. This post-soldering cleaning step is vital for ensuring the quality, reliability, and longevity of the soldered connections, preventing corrosion and maintaining the integrity of the electronic components. The choice of cleaning methods and agents is influenced by environmental concerns, necessitating the use of environmentally friendly options where possible. Cleanliness throughout the entire board manufacturing process, from initial preparation to final assembly, is paramount for optimal performance and reliability.\n', 'id': 11}}, +{{'entity': 'CLEANING PROCESSES', 'type': 'PROCESS', 'description': 'Different methods used for cleaning soldered assemblies.', 'id': 59}}, +output: +[{{ + "ids": [11, 59], + "entities": ["CLEANING", "CLEANING PROCESSES"], + "final_entity": "CLEANING", + "final_description": "Cleaning, in the context of electronics manufacturing, is a crucial process encompassing several stages. Before soldering, cleaning metallic surfaces ensures proper wetting and a strong solder joint. After soldering, cleaning removes flux residues and other contaminants from the soldered assemblies, including densely populated printed circuit boards. This post-soldering cleaning step is vital for ensuring the quality, reliability, and longevity of the soldered connections, preventing corrosion and maintaining the integrity of the electronic components. The choice of cleaning methods and agents is influenced by environmental concerns, necessitating the use of environmentally friendly options where possible. Cleanliness throughout the entire board manufacturing process, from initial preparation to final assembly, is paramount for optimal performance and reliability. Different methods used for cleaning soldered assemblies.", + "final_type": "PROCESS" +}}] +### +input: +{{'entity': 'PCB', 'type': 'MATERIAL', 'description': 'A substrate used in electronics assembly to hold and connect electronic components. The text mentions PCBs in the context of soldering processes.>', 'id': 4}}, +{{'entity': 'PRINTED CIRCUIT BOARD', 'type': 'MATERIAL', 'description': 'A printed circuit board (PCB), also known as a printed wiring board (PWB) or printed board, is a thin board of insulating material serving as a substrate for electronic components. This substrate is typically made of thermosetting or thermoplastic plastics, often reinforced with materials like paper, glass fiber, cotton, or nylon. The PCB features conductive pathways, or traces (usually copper), printed on one or both sides, interconnecting components via soldering to lands (pads). These connections can be made through plated through-holes for leaded components or directly onto the surface for surface-mount components. PCBs are manufactured using printing techniques, and the conductive tracks can be created additively (adding tracks) or subtractively (removing excess material from a pre-coated base). They come in single-sided, double-sided, and multi-layered configurations, and are a key element in all electronic assemblies, providing support and pathways for the components mounted and soldered onto them.\n', 'id': 13}}, +output: +[{{ + "ids": [4, 13], + "entities": ["PCB", "PRINTED CIRCUIT BOARD"], + "final_entity": "PRINTED CIRCUIT BOARD", + "final_description": "A printed circuit board (PCB), also known as a printed wiring board (PWB) or printed board, is a thin board of insulating material used in electronics assembly to hold and connect electronic components. The PCB serves as a substrate, typically made from thermosetting or thermoplastic plastics, reinforced with materials like paper, glass fiber, cotton, or nylon. It features conductive pathways (usually copper) printed on one or both sides, which interconnect components via soldering to lands (pads). These connections are made either through plated through-holes for leaded components or directly onto the surface for surface-mount components. PCBs are manufactured using printing techniques, and the conductive tracks can be created additively (adding tracks) or subtractively (removing excess material from a pre-coated base). They are available in single-sided, double-sided, and multi-layered configurations, and are essential in all electronic assemblies, providing support and pathways for components during the soldering process.", + "final_type": "MATERIAL" +}}] +### +input: +{{'entity': 'COMPONENT/SOLDER (CS) PROCESSES', 'type': 'PROCESS', 'description': 'COMPONENT/SOLDER (CS) PROCESSES encompass two main approaches to soldering components onto printed circuit boards. One method involves placing the component first, followed by the application of solder. The other method reverses this process, applying solder to the component before placement. A detailed explanation of various CS soldering processes can be found in a relevant technical book.\n', 'id': 6}}, +{{'entity': 'SOLDER/COMPONENT (SC) PROCESSES', 'type': 'PROCESS', 'description': 'SOLDER/COMPONENT (SC) processes encompass several methods used primarily in surface mount assembly production. These processes involve joining components to a printed circuit board (PCB) using solder. One common method, often (incorrectly) referred to as reflow, involves applying solder paste (a mixture of solder and flux) to the PCB, placing the components, and then applying heat to melt the solder and create the connection. Alternatively, solder can be applied to the PCB *before* component placement, or the solder can be applied to the component itself before placement onto the prepared PCB. The book details various techniques within these broader categories of SC soldering processes.\n', 'id': 7}}, +{{'entity': 'HAND SOLDERING', 'type': 'PROCESS', 'description': "Hand soldering is a manual process of soldering components onto a printed circuit board (PCB) individually, using a soldering iron. This technique, detailed in Chapter 7, is considered a CS soldering process and is typically performed alongside hand assembly, employing specialized tools and techniques specific to the components being soldered. While offering flexibility for development, prototyping, and rework, hand soldering is slow, laborious, expensive, and its quality is highly dependent on the skill of the operator. Therefore, it's primarily used in these stages and is cost-ineffective for mass production.\n", 'id': 8}}, +{{'entity': 'MASS CS SOLDERING PROCESSES', 'type': 'PROCESS', 'description': 'MASS CS soldering processes are automated processes designed for high-volume, large-scale production. The processes are described in a book as part of a larger discussion on CS soldering.\n', 'id': 9}}, +{{'entity': 'SOLDERING PROCESS', 'type': 'PROCESS', 'description': 'The soldering process is a method of joining materials, typically metallic surfaces such as copper tracks and component leads on printed circuit boards (PCBs), using a filler metal called solder, usually a tin-lead alloy (though modern solders may contain other impurities to modify properties). This process creates both mechanical and electrical connections, offering a cost-effective and relatively simple joining method. Soldering involves melting the solder, typically at temperatures around 185°C (though process temperatures can range from 200°C to 350°C depending on the technique), to form metallic bonds between the joined materials. The process includes several key steps: fluxing (to clean and prepare the surfaces), wetting (ensuring complete solder coverage), heating, and cleaning. Solderability, the ability of a surface to be completely wetted by the solder, is critical for a successful joint. Factors such as oxidation and tarnishing can negatively impact solderability, as can the type of flux used; modern trends favor fluxes with minimal reactivity, increasing the importance of clean board preparation.\n\nVarious soldering techniques exist, categorized broadly as component/solder (CS) and solder/component (SC) processes. CS processes involve placing components before applying solder, while SC processes reverse this order. Specific techniques include dip soldering, drag soldering, wave soldering, hand soldering, mass soldering, infra-red soldering, hot air convection soldering, hot vapor soldering, laser soldering, and light beam soldering. The choice of technique depends on factors such as the type of components, the scale of production, and the thermal characteristics of the PCB. The process can present safety hazards, including burns, electric shocks, and exposure to hazardous materials from the solder and equipment. The quality of the soldering process is paramount to the functionality and reliability of the resulting electronic assemblies.\n', 'id': 12}}, +{{'entity': 'THE SOLDERED JOINT', 'type': 'MATERIAL', 'description': 'The connection formed between components and the printed circuit board using solder.', 'id': 19}}, +{{'entity': 'SOLDER PASTE OR ADHESIVE APPLICATION', 'type': 'PROCESS', 'description': 'The process of applying solder paste to the printed circuit board before placing surface mount components.', 'id': 28}}, +{{'entity': 'USING SOLDER PASTE', 'type': 'PROCESS', 'description': 'The techniques and procedures involved in using solder paste for surface mount soldering.', 'id': 31}}, +{{'entity': 'SOLDER PASTE PARAMETERS', 'type': 'MATERIAL', 'description': 'The properties of solder paste, such as viscosity and particle size, that affect its performance.', 'id': 32}}, +{{'entity': 'CS SOLDERING PROCESSES', 'type': 'PROCESS', 'description': 'Soldering processes where the solder is applied to the component before placement on the printed circuit board.', 'id': 33}}, +{{'entity': 'SC SOLDERING PROCESSES', 'type': 'PROCESS', 'description': 'Soldering processes where the solder is applied to the printed circuit board before the component is placed.', 'id': 38}}, +output: +[ + {{ + "ids": [6, 33], + "entities": ["COMPONENT/SOLDER (CS) PROCESSES", "CS SOLDERING PROCESSES"], + "final_entity": "CS PROCESSES", + "final_description": "COMPONENT/SOLDER (CS) PROCESSES encompass soldering methods where the solder is applied to the component before placement onto the printed circuit board (PCB). This process is used to join components to the PCB, and it can be done in various methods depending on the soldering technique. CS soldering is commonly used in assembly processes and may include both manual and automated techniques.", + "final_type": "PROCESS" + }}, + {{ + "ids": [7, 38], + "entities": ["SOLDER/COMPONENT (SC) PROCESSES", "SC SOLDERING PROCESSES"], + "final_entity": "SC PROCESSES", + "final_description": "SOLDER/COMPONENT (SC) PROCESSES refer to soldering techniques where solder is applied to the PCB before the component is placed. These processes are commonly used in surface mount assembly, including reflow soldering, where solder paste (a mixture of solder and flux) is first applied to the PCB, followed by component placement and heating to create electrical connections. Alternative methods involve applying solder to the PCB or the component itself before placement onto the prepared PCB.", + "final_type": "PROCESS" + }}, + {{ + "ids": [28, 31], + "entities": ["SOLDER PASTE OR ADHESIVE APPLICATION", "USING SOLDER PASTE"], + "final_entity": "SOLDER PASTE APPLICATION", + "final_description": "SOLDER PASTE APPLICATION refers to the process of applying solder paste to a printed circuit board (PCB) before placing surface mount components. Solder paste, a mixture of solder and flux, is critical in ensuring strong and reliable solder joints in surface mount technology (SMT). The application process can be performed using various techniques, including stencil printing and jet dispensing, depending on the production scale and component density.", + "final_type": "PROCESS" + }}, + {{ + "ids": [9, 6], + "entities": ["MASS CS SOLDERING PROCESSES", "COMPONENT/SOLDER (CS) PROCESSES"], + "final_entity": "CS SOLDERING PROCESSES", + "final_description": "MASS COMPONENT/SOLDER (CS) SOLDERING PROCESSES refer to automated, high-volume soldering techniques where solder is applied to the component before it is placed onto the printed circuit board (PCB). These processes are commonly used in large-scale production environments to improve efficiency and consistency in soldering, reducing manual intervention while maintaining quality and reliability.", + "final_type": "PROCESS" + }} +] + +### +input: +{{'entity': 'SOLDER PASTE PARAMETERS', 'type': 'MATERIAL', 'description': 'The properties of solder paste, such as viscosity and particle size, that affect its performance.', 'id': 32}} +{{'entity': 'CS SOLDERING PROCESSES', 'type': 'PROCESS', 'description': 'Soldering processes where the solder is applied to the component before placement on the printed circuit board.', 'id': 33}} +{{'entity': 'SC SOLDERING PROCESSES', 'type': 'PROCESS', 'description': 'Soldering processes where the solder is applied to the printed circuit board before the component is placed.', 'id': 38}} +output: +[{{ + An Empty List, NO MERGE REQUIRED +}}] +### + +input: +{input} +output: +""" + diff --git a/graphrag/prompts/index/merge_entities.py b/graphrag/prompts/index/merge_entities.py new file mode 100644 index 0000000000..2cfa2ad940 --- /dev/null +++ b/graphrag/prompts/index/merge_entities.py @@ -0,0 +1,117 @@ +MERGE_ENTITIES_SYSTEM = """ +You are tasked with analyzing pairs or groups of entities and determining if they should be merged into a single, canonical entity. Your goal is to merge entities that represent the **exact same real-world concept** but differ due to minor linguistic variations. + +**Merging Rules:** + +1. **Primary Condition:** Merge only if the entities definitively refer to the *same specific thing* (e.g., the same specific car model, the same person, the same city). +2. **Allowed Variations for Merging:** + * **Plural vs. Singular:** e.g., `CAR` vs. `CARS` (if descriptions refer generally), `BUILDING` vs. `BUILDINGS`. + * **Acronyms vs. Full Names:** e.g., `NYC` vs. `NEW YORK CITY`, `USA` vs. `UNITED STATES OF AMERICA`. + * **Minor Spelling/Formatting Variations:** e.g., `Dr John Smith` vs. `Dr. John Smith`. + * **Well-Known Aliases/Nicknames (Use with Caution):** e.g., `THE BIG APPLE` vs. `NEW YORK CITY`, but *only if* descriptions strongly confirm they refer to the identical entity. + * **Titles/No Titles (for People):** e.g., `PRESIDENT BIDEN` vs. `JOE BIDEN`, *if descriptions confirm it's the same individual*. +3. **Mandatory Requirements for Merging:** + * **Identical Type:** The `type` attribute MUST be the same for all entities being merged (e.g., all must be `LOCATION`, or `PERSON`, or `VEHICLE`). + * **Compatible Descriptions:** The `description` fields must be consistent and describe the same entity. One description might be more detailed, but they should not contradict each other or describe fundamentally different aspects. Merged descriptions should combine the information logically. +4. **DO NOT MERGE IF:** + * **Different Types:** e.g., `BERLIN` (LOCATION) vs. `BERLINER` (PERSON or FOOD). + * **Different Concepts:** Entities represent distinct things, even if related. e.g., `CAR` vs. `TRUCK`, `PARIS` (City) vs. `FRANCE` (Country), `ENGINE` (Component) vs. `CAR` (Vehicle). + * **Different Specific Entities:** Names are similar but descriptions indicate different individuals, places, or things. e.g., Two people named `John Smith` with different professions described. + * **Significant Name Differences:** Unless it's a confirmed acronym or very well-known alias with supporting descriptions. + * **Contradictory Descriptions:** Descriptions point to different characteristics or facts about the entity. + +**Output Format:** + +If a merge is warranted, output a JSON list containing one object per merge group. Each object should have the following structure: + +```json +[{ + "ids": [list_of_original_entity_ids], + "entities": [list_of_original_entity_names], + "final_entity": "chosen_canonical_entity_name", + "final_description": "combined_and_refined_description", + "final_type": "common_entity_type" +}]''' +If no entities in the input should be merged, output an empty list []. +### +Examples +### +input: +[ + {'entity': 'CAR', 'type': 'VEHICLE', 'description': 'A four-wheeled road vehicle powered by an engine, able to carry a small number of people.', 'id': 10}, + {'entity': 'CARS', 'type': 'VEHICLE', 'description': 'road vehicles designed for transporting people.', 'id': 11} +] +output: +[{ + "ids": [10, 11], + "entities": ["CAR", "CARS"], + "final_entity": "CAR", + "final_description": "A four-wheeled road vehicle powered by an engine, designed for transporting a small number of people.", + "final_type": "VEHICLE" +}] +### +input: +[ + {'entity': 'LOS ANGELES', 'type': 'LOCATION', 'description': 'A sprawling Southern California city and the center of the nation’s film and television industry.', 'id': 101}, + {'entity': 'CALIFORNIA', 'type': 'LOCATION', 'description': 'A state in the Western United States, known for its diverse terrain including cliff-lined beaches, redwood forests, the Sierra Nevada Mountains, Central Valley farmland and the Mojave Desert.', 'id': 103}, + {'entity': 'LA', 'type': 'LOCATION', 'description': 'Common abbreviation for Los Angeles, a major city on the Pacific Coast of the USA.', 'id': 102}, + {'entity': 'SAN FRANCISCO', 'type': 'LOCATION', 'description': 'A hilly city on a peninsula between the Pacific Ocean and San Francisco Bay in Northern California.', 'id': 104}, + {'entity': 'HOLLYWOOD SIGN', 'type': 'LANDMARK', 'description': 'An American landmark and cultural icon overlooking Hollywood, Los Angeles, California.', 'id': 105} +] +output: +[{ + "ids": [101, 102], + "entities": ["LOS ANGELES", "LA"], + "final_entity": "LOS ANGELES", + "final_description": "Los Angeles (LA) is a sprawling Southern California city, a major city on the Pacific Coast of the USA, and the center of the nation’s film and television industry.", + "final_type": "LOCATION" +}] +### +input: +[ + {'entity': 'DR. ANGELA MERKEL', 'type': 'PERSON', 'description': 'German politician who served as Chancellor of Germany from 2005 to 2021. Holds a doctorate in quantum chemistry.', 'id': 30}, + {'entity': 'ANGELA MERKEL', 'type': 'PERSON', 'description': 'Former Chancellor of Germany, leader of the Christian Democratic Union.', 'id': 31}, + {"entity": "BARACK OBAMA","type": "PERSON","description": "44th President of the United States, first African-American president, Nobel Peace Prize laureate.","id": 32} +] +output: +[{ + "ids": [30, 31], + "entities": ["DR. ANGELA MERKEL", "ANGELA MERKEL"], + "final_entity": "ANGELA MERKEL", + "final_description": "Angela Merkel (Dr.) is a German politician and former Chancellor of Germany (2005-2021), former leader of the Christian Democratic Union, holding a doctorate in quantum chemistry.", + "final_type": "PERSON" +}] +### +input: +[ + {'entity': 'BERLIN', 'type': 'LOCATION', 'description': 'The capital and largest city of Germany.', 'id': 40}, + {'entity': 'BERLINER', 'type': 'FOOD', 'description': 'A type of German doughnut often filled with jam.', 'id': 41} +] +output: +[] +### +input: +[ + {'entity': 'JOHN SMITH', 'type': 'PERSON', 'description': 'Captain John Smith was an English explorer important to the establishment of Jamestown.', 'id': 50}, + {'entity': 'JOHN SMITH', 'type': 'PERSON', 'description': 'John Smith is a contemporary musician known for his folk guitar style.', 'id': 51} +] +output: +[] + +### +input: +[ + {'entity': 'GERMANY', 'type': 'LOCATION', 'description': 'A country in Central Europe, member of the EU.', 'id': 60}, + {'entity': 'BAVARIA', 'type': 'LOCATION', 'description': 'A state (Bundesland) in the southeast of Germany.', 'id': 61} +] +output: +[] +### +""" + +MERGE_ENTITIES_INPUT = """ +Real input: +{input} +output: +""" + From 84f774105f392a9691b95883974a4f696c225b40 Mon Sep 17 00:00:00 2001 From: majidsh97 Date: Thu, 10 Apr 2025 20:35:17 +0200 Subject: [PATCH 2/5] Add my contribution --- -d | 0 .semversioner/next-release/minor-20250410183424623609.json | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 -d create mode 100644 .semversioner/next-release/minor-20250410183424623609.json diff --git a/-d b/-d new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.semversioner/next-release/minor-20250410183424623609.json b/.semversioner/next-release/minor-20250410183424623609.json new file mode 100644 index 0000000000..18cd3825f5 --- /dev/null +++ b/.semversioner/next-release/minor-20250410183424623609.json @@ -0,0 +1,4 @@ +{ + "type": "minor", + "description": "Add merge_entities" +} From 174b8706c13f3f8b7eb2339ae3c11ca712f16ca9 Mon Sep 17 00:00:00 2001 From: majidsh97 Date: Thu, 10 Apr 2025 22:41:42 +0200 Subject: [PATCH 3/5] add merge_entities --- graphrag/index/workflows/merge_entities.py | 116 +++++++----------- graphrag/prompts/index/merge_entities copy.py | 104 ---------------- 2 files changed, 46 insertions(+), 174 deletions(-) delete mode 100644 graphrag/prompts/index/merge_entities copy.py diff --git a/graphrag/index/workflows/merge_entities.py b/graphrag/index/workflows/merge_entities.py index d2f02cc43c..0cc2461c50 100644 --- a/graphrag/index/workflows/merge_entities.py +++ b/graphrag/index/workflows/merge_entities.py @@ -11,26 +11,24 @@ import pandas as pd from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.index.operations.cluster_graph import cluster_graph -from graphrag.index.operations.create_graph import create_graph from graphrag.index.typing.context import PipelineRunContext, PipelineStorage from graphrag.index.typing.workflow import WorkflowFunctionOutput from graphrag.utils.storage import load_table_from_storage, write_table_to_storage -from graphrag.vector_stores.lancedb import LanceDBVectorStore -from graphrag.storage.file_pipeline_storage import FilePipelineStorage from sklearn.cluster import DBSCAN from graphrag.prompts.index.merge_entities import MERGE_ENTITIES_INPUT, MERGE_ENTITIES_SYSTEM -from graphrag.config.models.language_model_config import LanguageModelConfig from graphrag.language_model.manager import ModelManager -from graphrag.config.load_config import load_config, Path + + + + + from json_repair import loads from json import dump log = logging.getLogger(__name__) -# from graphrag.language_model.manager import ChatModel from graphrag.config.embeddings import ( entity_title_embedding, #get_embedded_fields, @@ -38,7 +36,6 @@ ) from graphrag.index.workflows.generate_text_embeddings import generate_text_embeddings - async def run_workflow( config: GraphRagConfig, context: PipelineRunContext, @@ -61,6 +58,7 @@ async def run_workflow( if "id" not in entities.columns: entities["id"] = entities["human_readable_id"].apply(lambda _x: str(uuid4())) # Embed entities.title + embeddings_df = await create_entity_title_embedding(entities, config, context) embeddings_df = embeddings_df["entity.title"] @@ -108,8 +106,6 @@ async def create_entity_title_embedding( config_copy.embed_text.target = "selected" text_embed = get_embedding_settings(config_copy) - # LANCEDB_URI = f"{config.root_dir}/output/lancedb" - # embeddings_df = load_embeddings_from_default_entity_title(LANCEDB_URI) embeddings_df = await generate_text_embeddings( documents=None, @@ -129,10 +125,12 @@ async def create_entity_title_embedding( def update_entities_relationships(entities: pd.DataFrame, relationships, response): import itertools - entities = entities.set_index("human_readable_id", drop=False) entities.index = entities.index.astype(int) all_ids = [] new_entities_list = [] + + #entities: ['title', 'type', 'text_unit_ids', 'frequency', 'description'] + #relashionships: ['source', 'target', 'text_unit_ids', 'weight', 'description'] for item in response: """ item is llm output @@ -144,67 +142,43 @@ def update_entities_relationships(entities: pd.DataFrame, relationships, respons "final_type": "MATERIAL" } """ - if len(item) < 1: - continue - - try: - item["ids"] = list(map(int, item["ids"])) - old_rows = entities.loc[item["ids"], :] - new_id = old_rows["id"].iloc[0] # How to generate a new id? uuid? - human_readable_id = old_rows.index[ - 0 - ] # How to generate a new human readable id? just autoincrement ? - new_title = item["final_entity"] - new_type = item["final_type"] - new_description = item["final_description"] - new_x = old_rows["x"].mean() # How to generate a new x? - new_y = old_rows[ "y"].mean() # How to generate a new y? umap will be generated in the last workflow? - frequency = old_rows["frequency"].sum() - degree = old_rows["degree"].sum() - textunit_ids = old_rows["text_unit_ids"] - textunit_ids = list(itertools.chain.from_iterable(textunit_ids)) - row = { - "id": new_id, - "human_readable_id": human_readable_id, - "title": new_title, - "type": new_type, - "description": new_description, - "text_unit_ids": textunit_ids, - "frequency": frequency, - "degree": degree, - "x": new_x, - "y": new_y, - } - relationships.loc[ - relationships["source"].isin(item["entities"]), "source" - ] = new_title - relationships.loc[ - relationships["target"].isin(item["entities"]), "target" - ] = new_title - # Do we need to update relationships descriptions? I think yes but it may not be necessary - #because we only merge close entities - - new_entities_list.append(row) - all_ids.extend(item["ids"]) - except Exception as e: - log.exception("update_entities_relationships: %s", e) - + item["ids"] = list(map(int, item["ids"])) + old_rows = entities.loc[item["ids"], :] + + new_title = item["final_entity"] + new_type = item["final_type"] + new_description = item["final_description"] - """" - or this version - updated_source = relationships['source'].where( - ~relationships['source'].isin(item['entities']), new_title - ) + frequency = old_rows["frequency"].sum() + textunit_ids = old_rows["text_unit_ids"] + textunit_ids = list(itertools.chain.from_iterable(textunit_ids)) + row = { - updated_target = relationships['target'].where( - ~relationships['target'].isin(item['entities']), new_title - ) + "title": new_title, + "type": new_type, + "description": new_description, + "text_unit_ids": textunit_ids, + "frequency": frequency, - updated_relationships = relationships.assign(source=updated_source, target=updated_target) + } + relationships.loc[ + relationships["source"].isin(item["entities"]), "source" + ] = new_title + relationships.loc[ + relationships["target"].isin(item["entities"]), "target" + ] = new_title - """ + + new_entities_list.append(row) + all_ids.extend(item["ids"]) + + + entities = entities.drop(all_ids) - entities = pd.concat([entities, pd.DataFrame(new_entities_list)]) + entities = entities.drop(columns=["human_readable_id", "id"]) + entities = pd.concat([entities, pd.DataFrame(new_entities_list)]).reset_index( + drop=True + ) return entities, relationships @@ -231,10 +205,12 @@ def get_input_for_prompt(embeddings: pd.DataFrame, entities: pd.DataFrame): for cluster_id, group_df in embeddings.groupby("cluster"): if cluster_id == -1: continue - row = entities.loc[ + rows = entities.loc[ group_df.index, ["human_readable_id", "title", "type", "description"] ] - text += "cluster:" + str(cluster_id) + "\n" - text += str(row.rename({"human_readable_id": "id"}).to_dict("records")) + "\n" + text += "[" + "\n" + for index, r in rows.iterrows(): + text += f"{{'entity': '{r['title']}', 'type': '{r['type']}', 'description': '{r['description']}', 'id': {r['human_readable_id']} }}," + "\n" + text += "]" + "\n" return text diff --git a/graphrag/prompts/index/merge_entities copy.py b/graphrag/prompts/index/merge_entities copy.py deleted file mode 100644 index 976f80abe7..0000000000 --- a/graphrag/prompts/index/merge_entities copy.py +++ /dev/null @@ -1,104 +0,0 @@ -MERGE_ENTITIES_PROMPT = """ -You are given some entities that may need to be mereged if they are the same. -merge only those that have minor differences like plural form such as SOLDERS and SOLDER or SOLDERING PROCESSES and SOLDERING or acronyms like PCB and PRINTED CIRCUIT BOARD. -Do NOT merge entities that have major differences like SC SOLDERING PROCESSES and CS SOLDERING PROCESSES because they are different processes. -Pay attention to the descriptions of the entities. they have descripe the same thing if discriptions are different merge is not required. -Also only merge thoese that have the same type. if the type is different then don't merge. -Examples: -### -input: -{{'entity': 'PROTECTIVE COATINGS', 'type': 'MATERIAL', 'description': 'Coatings applied to components or the printed circuit board to improve solderability or protect against corrosion.', 'id': 21}}, -{{'entity': 'PROTECTIVE COATING', 'type': 'MATERIAL', 'description': 'A protective coating is applied to boards and components to maintain solderability by preventing oxidation of the copper. However, no coating can maintain solderability indefinitely, and the effectiveness depends on the coating type, storage conditions, and coating thickness. Re-testing after storage is recommended.>', 'id': 164}} -output: -[{{ - "ids": [21, 164], - "entities": ["PROTECTIVE COATINGS", "PROTECTIVE COATING"], - "final_entity": "PROTECTIVE COATINGS", - "final_description": "Coatings applied to components or the printed circuit board to improve solderability by preventing oxidation of the copper or protect against corrosion.However, no coating can maintain solderability indefinitely, and the effectiveness depends on the coating type, storage conditions, and coating thickness. Re-testing after storage is recommended.", - "final_type": "MATERIAL" -}}] -### -input: -{{'entity': 'CLEANING', 'type': 'PROCESS', 'description': 'Cleaning, in the context of electronics manufacturing, is a crucial process encompassing several stages. Before soldering, cleaning metallic surfaces ensures proper wetting and a strong solder joint. After soldering, cleaning removes flux residues and other contaminants from the soldered assemblies, including densely populated printed circuit boards. This post-soldering cleaning step is vital for ensuring the quality, reliability, and longevity of the soldered connections, preventing corrosion and maintaining the integrity of the electronic components. The choice of cleaning methods and agents is influenced by environmental concerns, necessitating the use of environmentally friendly options where possible. Cleanliness throughout the entire board manufacturing process, from initial preparation to final assembly, is paramount for optimal performance and reliability.\n', 'id': 11}}, -{{'entity': 'CLEANING PROCESSES', 'type': 'PROCESS', 'description': 'Different methods used for cleaning soldered assemblies.', 'id': 59}}, -output: -[{{ - "ids": [11, 59], - "entities": ["CLEANING", "CLEANING PROCESSES"], - "final_entity": "CLEANING", - "final_description": "Cleaning, in the context of electronics manufacturing, is a crucial process encompassing several stages. Before soldering, cleaning metallic surfaces ensures proper wetting and a strong solder joint. After soldering, cleaning removes flux residues and other contaminants from the soldered assemblies, including densely populated printed circuit boards. This post-soldering cleaning step is vital for ensuring the quality, reliability, and longevity of the soldered connections, preventing corrosion and maintaining the integrity of the electronic components. The choice of cleaning methods and agents is influenced by environmental concerns, necessitating the use of environmentally friendly options where possible. Cleanliness throughout the entire board manufacturing process, from initial preparation to final assembly, is paramount for optimal performance and reliability. Different methods used for cleaning soldered assemblies.", - "final_type": "PROCESS" -}}] -### -input: -{{'entity': 'PCB', 'type': 'MATERIAL', 'description': 'A substrate used in electronics assembly to hold and connect electronic components. The text mentions PCBs in the context of soldering processes.>', 'id': 4}}, -{{'entity': 'PRINTED CIRCUIT BOARD', 'type': 'MATERIAL', 'description': 'A printed circuit board (PCB), also known as a printed wiring board (PWB) or printed board, is a thin board of insulating material serving as a substrate for electronic components. This substrate is typically made of thermosetting or thermoplastic plastics, often reinforced with materials like paper, glass fiber, cotton, or nylon. The PCB features conductive pathways, or traces (usually copper), printed on one or both sides, interconnecting components via soldering to lands (pads). These connections can be made through plated through-holes for leaded components or directly onto the surface for surface-mount components. PCBs are manufactured using printing techniques, and the conductive tracks can be created additively (adding tracks) or subtractively (removing excess material from a pre-coated base). They come in single-sided, double-sided, and multi-layered configurations, and are a key element in all electronic assemblies, providing support and pathways for the components mounted and soldered onto them.\n', 'id': 13}}, -output: -[{{ - "ids": [4, 13], - "entities": ["PCB", "PRINTED CIRCUIT BOARD"], - "final_entity": "PRINTED CIRCUIT BOARD", - "final_description": "A printed circuit board (PCB), also known as a printed wiring board (PWB) or printed board, is a thin board of insulating material used in electronics assembly to hold and connect electronic components. The PCB serves as a substrate, typically made from thermosetting or thermoplastic plastics, reinforced with materials like paper, glass fiber, cotton, or nylon. It features conductive pathways (usually copper) printed on one or both sides, which interconnect components via soldering to lands (pads). These connections are made either through plated through-holes for leaded components or directly onto the surface for surface-mount components. PCBs are manufactured using printing techniques, and the conductive tracks can be created additively (adding tracks) or subtractively (removing excess material from a pre-coated base). They are available in single-sided, double-sided, and multi-layered configurations, and are essential in all electronic assemblies, providing support and pathways for components during the soldering process.", - "final_type": "MATERIAL" -}}] -### -input: -{{'entity': 'COMPONENT/SOLDER (CS) PROCESSES', 'type': 'PROCESS', 'description': 'COMPONENT/SOLDER (CS) PROCESSES encompass two main approaches to soldering components onto printed circuit boards. One method involves placing the component first, followed by the application of solder. The other method reverses this process, applying solder to the component before placement. A detailed explanation of various CS soldering processes can be found in a relevant technical book.\n', 'id': 6}}, -{{'entity': 'SOLDER/COMPONENT (SC) PROCESSES', 'type': 'PROCESS', 'description': 'SOLDER/COMPONENT (SC) processes encompass several methods used primarily in surface mount assembly production. These processes involve joining components to a printed circuit board (PCB) using solder. One common method, often (incorrectly) referred to as reflow, involves applying solder paste (a mixture of solder and flux) to the PCB, placing the components, and then applying heat to melt the solder and create the connection. Alternatively, solder can be applied to the PCB *before* component placement, or the solder can be applied to the component itself before placement onto the prepared PCB. The book details various techniques within these broader categories of SC soldering processes.\n', 'id': 7}}, -{{'entity': 'HAND SOLDERING', 'type': 'PROCESS', 'description': "Hand soldering is a manual process of soldering components onto a printed circuit board (PCB) individually, using a soldering iron. This technique, detailed in Chapter 7, is considered a CS soldering process and is typically performed alongside hand assembly, employing specialized tools and techniques specific to the components being soldered. While offering flexibility for development, prototyping, and rework, hand soldering is slow, laborious, expensive, and its quality is highly dependent on the skill of the operator. Therefore, it's primarily used in these stages and is cost-ineffective for mass production.\n", 'id': 8}}, -{{'entity': 'MASS CS SOLDERING PROCESSES', 'type': 'PROCESS', 'description': 'MASS CS soldering processes are automated processes designed for high-volume, large-scale production. The processes are described in a book as part of a larger discussion on CS soldering.\n', 'id': 9}}, -{{'entity': 'SOLDERING PROCESS', 'type': 'PROCESS', 'description': 'The soldering process is a method of joining materials, typically metallic surfaces such as copper tracks and component leads on printed circuit boards (PCBs), using a filler metal called solder, usually a tin-lead alloy (though modern solders may contain other impurities to modify properties). This process creates both mechanical and electrical connections, offering a cost-effective and relatively simple joining method. Soldering involves melting the solder, typically at temperatures around 185°C (though process temperatures can range from 200°C to 350°C depending on the technique), to form metallic bonds between the joined materials. The process includes several key steps: fluxing (to clean and prepare the surfaces), wetting (ensuring complete solder coverage), heating, and cleaning. Solderability, the ability of a surface to be completely wetted by the solder, is critical for a successful joint. Factors such as oxidation and tarnishing can negatively impact solderability, as can the type of flux used; modern trends favor fluxes with minimal reactivity, increasing the importance of clean board preparation.\n\nVarious soldering techniques exist, categorized broadly as component/solder (CS) and solder/component (SC) processes. CS processes involve placing components before applying solder, while SC processes reverse this order. Specific techniques include dip soldering, drag soldering, wave soldering, hand soldering, mass soldering, infra-red soldering, hot air convection soldering, hot vapor soldering, laser soldering, and light beam soldering. The choice of technique depends on factors such as the type of components, the scale of production, and the thermal characteristics of the PCB. The process can present safety hazards, including burns, electric shocks, and exposure to hazardous materials from the solder and equipment. The quality of the soldering process is paramount to the functionality and reliability of the resulting electronic assemblies.\n', 'id': 12}}, -{{'entity': 'THE SOLDERED JOINT', 'type': 'MATERIAL', 'description': 'The connection formed between components and the printed circuit board using solder.', 'id': 19}}, -{{'entity': 'SOLDER PASTE OR ADHESIVE APPLICATION', 'type': 'PROCESS', 'description': 'The process of applying solder paste to the printed circuit board before placing surface mount components.', 'id': 28}}, -{{'entity': 'USING SOLDER PASTE', 'type': 'PROCESS', 'description': 'The techniques and procedures involved in using solder paste for surface mount soldering.', 'id': 31}}, -{{'entity': 'SOLDER PASTE PARAMETERS', 'type': 'MATERIAL', 'description': 'The properties of solder paste, such as viscosity and particle size, that affect its performance.', 'id': 32}}, -{{'entity': 'CS SOLDERING PROCESSES', 'type': 'PROCESS', 'description': 'Soldering processes where the solder is applied to the component before placement on the printed circuit board.', 'id': 33}}, -{{'entity': 'SC SOLDERING PROCESSES', 'type': 'PROCESS', 'description': 'Soldering processes where the solder is applied to the printed circuit board before the component is placed.', 'id': 38}}, -output: -[ - {{ - "ids": [6, 33], - "entities": ["COMPONENT/SOLDER (CS) PROCESSES", "CS SOLDERING PROCESSES"], - "final_entity": "CS PROCESSES", - "final_description": "COMPONENT/SOLDER (CS) PROCESSES encompass soldering methods where the solder is applied to the component before placement onto the printed circuit board (PCB). This process is used to join components to the PCB, and it can be done in various methods depending on the soldering technique. CS soldering is commonly used in assembly processes and may include both manual and automated techniques.", - "final_type": "PROCESS" - }}, - {{ - "ids": [7, 38], - "entities": ["SOLDER/COMPONENT (SC) PROCESSES", "SC SOLDERING PROCESSES"], - "final_entity": "SC PROCESSES", - "final_description": "SOLDER/COMPONENT (SC) PROCESSES refer to soldering techniques where solder is applied to the PCB before the component is placed. These processes are commonly used in surface mount assembly, including reflow soldering, where solder paste (a mixture of solder and flux) is first applied to the PCB, followed by component placement and heating to create electrical connections. Alternative methods involve applying solder to the PCB or the component itself before placement onto the prepared PCB.", - "final_type": "PROCESS" - }}, - {{ - "ids": [28, 31], - "entities": ["SOLDER PASTE OR ADHESIVE APPLICATION", "USING SOLDER PASTE"], - "final_entity": "SOLDER PASTE APPLICATION", - "final_description": "SOLDER PASTE APPLICATION refers to the process of applying solder paste to a printed circuit board (PCB) before placing surface mount components. Solder paste, a mixture of solder and flux, is critical in ensuring strong and reliable solder joints in surface mount technology (SMT). The application process can be performed using various techniques, including stencil printing and jet dispensing, depending on the production scale and component density.", - "final_type": "PROCESS" - }}, - {{ - "ids": [9, 6], - "entities": ["MASS CS SOLDERING PROCESSES", "COMPONENT/SOLDER (CS) PROCESSES"], - "final_entity": "CS SOLDERING PROCESSES", - "final_description": "MASS COMPONENT/SOLDER (CS) SOLDERING PROCESSES refer to automated, high-volume soldering techniques where solder is applied to the component before it is placed onto the printed circuit board (PCB). These processes are commonly used in large-scale production environments to improve efficiency and consistency in soldering, reducing manual intervention while maintaining quality and reliability.", - "final_type": "PROCESS" - }} -] - -### -input: -{{'entity': 'SOLDER PASTE PARAMETERS', 'type': 'MATERIAL', 'description': 'The properties of solder paste, such as viscosity and particle size, that affect its performance.', 'id': 32}} -{{'entity': 'CS SOLDERING PROCESSES', 'type': 'PROCESS', 'description': 'Soldering processes where the solder is applied to the component before placement on the printed circuit board.', 'id': 33}} -{{'entity': 'SC SOLDERING PROCESSES', 'type': 'PROCESS', 'description': 'Soldering processes where the solder is applied to the printed circuit board before the component is placed.', 'id': 38}} -output: -[{{ - An Empty List, NO MERGE REQUIRED -}}] -### - -input: -{input} -output: -""" - From 59d2f9cdc7df5bcbed2fb40e4672c2db79fa0ed7 Mon Sep 17 00:00:00 2001 From: majidsh97 Date: Sat, 12 Apr 2025 20:04:26 +0200 Subject: [PATCH 4/5] graphrag comparision --- ...compare_rag_localsearch_globalsearch.ipynb | 1315 +++++++++++++++++ .../comparision_prompt.py | 210 +++ .../graphrag_comparision.py | 585 ++++++++ 3 files changed, 2110 insertions(+) create mode 100644 examples_notebooks/community_contrib/graphrag_comparision/compare_rag_localsearch_globalsearch.ipynb create mode 100644 examples_notebooks/community_contrib/graphrag_comparision/comparision_prompt.py create mode 100644 examples_notebooks/community_contrib/graphrag_comparision/graphrag_comparision.py diff --git a/examples_notebooks/community_contrib/graphrag_comparision/compare_rag_localsearch_globalsearch.ipynb b/examples_notebooks/community_contrib/graphrag_comparision/compare_rag_localsearch_globalsearch.ipynb new file mode 100644 index 0000000000..8f329d6c78 --- /dev/null +++ b/examples_notebooks/community_contrib/graphrag_comparision/compare_rag_localsearch_globalsearch.ipynb @@ -0,0 +1,1315 @@ +{ + "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_comparision\n" + ] + } + ], + "source": [ + "import os\n", + "import sys\n", + "print(os.getcwd())\n", + "sys.path.append(os.getcwd())\n", + "from graphrag_comparision import GraphRagComparision\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "8b4d141e", + "metadata": {}, + "source": [ + "## 2. Define Questions for Comparision\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": null, + "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 Comparision\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": 5, + "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", + "{'Index': 0, 'id': '7d3ffa016246a868526b8eec181583b31e3a81d21bdc8e3ad63fab473bb54b97351e6029949ea17fe118e6bfe3ae744f830092406537f6a12eba07a1903c5c8a', 'human_readable_id': 1, 'text': \"6G a®*: s +. i 2 a <, s e Ged SECOND EDITION\\n\\nSoldering in Electronics Assembly\\n\\nThis Page Intentionally Left Blank\\n\\nSoldering in Electronics Assembly Mike Judd and Keith Brindley Newnes \\n\\nNewnes\\n\\nNewnes An imprint of Butterworth-Heinemann Linacre House, Jordan Hill, Oxford OX2 8DP 225 Wildwood Avenue, Woburn, MA 01801-2041 A division of Reed Educationa and Professional Publishing Ltd RQ A member of the Reed Elsevier plc group First published 1992 Second edition 1999 © Mike Judd & Keith Brindley 1992, 1999 All rights reserved. No part of this publication may be reproduced in any material form (including photocopying or storing in any medium by electronic Means and whether or not transiently or incidentally to some other use of this publication) without the written permission of the copyright holders except in accordance with the provisions of the Copyright, Design and Patents Act 1988 or under the terms of a licence issued by the Copyright Licensing Agency Ltd, 90 Tottenham Court Road, London, England W1P 9HE. Applications for the copyright holders’ written permission to reproduce any part of this publication should be addressed to the publishers. British Library Cataloguing in Publication Data A catalogue record for this book is available from the British Library Transferred to digital printing 2006 ISBN 0 7506 35452 Printed and bound by Antony Rowe Ltd, Eastbourne a Typeset and produced by Co-publications, Loughborough POR EVERY TITLE THAT WE PUBLISH, BUTTERWORTH -HEINENANN ‘WILL PAY FOR BTCV TO PLANT AND CARE FOR A TREE.\\n\\nContents Foreword Preface Acknowledgements 1 Soldering process Time on its side Printed circuit board Soldering Soldering processes Component/solder (CS) processes Solder/component (SC) processes Cleaning Quality Safety 2 Electronics assemblies Joints Through-hole joints Surface mounted components Surface mounted joints Assembly variations Assembly classification 3 Solder Metallurgical properties of tin/lead alloys The soldered joint Solderability Protective coatings 4 Lead-free solder What's needed in the future? Lead-free soldering- now a hot topic! The age of lead-free soldering is approaching fast ITRI 5 Flux Need for flux How fluxes work Categorization of fluxes Choosing a flux Application of fluxes SC soldering process flux 6 Solder paste Solder paste or adhesive application Dispensing Pin transfer Using solder paste Solder paste parameters 7 CS soldering processes Hand soldering Mass CS soldering processes Inert atmosphere soldering Handling assemblies Solder pots and pumps Solder pot heaters Soldering Soldering process monitoring vii ix xiii 1 2 5 8 16 18 19 21 21 22 23 23 27 35 36 43 49 51 51 56 66 72 81 81 83 87 88 89 9O 91 92 98 99 107 109 109 118 122 123 124 127 127 134 136 136 146 147 148 163 \", 'n_tokens': 791, 'document_ids': array([0]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", + " 'f8bc9ce4-e610-4af7-987c-0fac3320e2a1',\n", + " 'e952e1ef-2084-447b-873c-11a506d2e102',\n", + " '8003f3bd-9f55-44b8-ab53-52d74eec0ac5',\n", + " '13c0089d-a10b-43e4-976a-eb2329e57a47',\n", + " '611056a8-b545-4b1b-885a-cee47ad71be2',\n", + " 'ba9a83b2-feee-4c92-854a-9d1fe90ce2f6',\n", + " '2057e211-2cb1-4797-8a8a-38759089f686',\n", + " '7c41c47a-f47e-4e3e-8a0b-7a5ea5febf5d',\n", + " '388162ba-01b5-4daf-8f65-6655b2b149bd',\n", + " '22e0f524-c864-4fe0-af15-c86238c23da1',\n", + " 'fa219be6-faee-48c6-8d6d-f4e194979914',\n", + " 'bd3a93e3-1708-4b43-a5b6-02c18ddb0329',\n", + " 'de05b0d0-ba24-4956-b678-f5a5c3d933dd',\n", + " 'eb5e09f7-c3ee-46f6-aea5-504410b47dc1',\n", + " '27883d1a-c69a-4720-bbbe-b6c8629949f1',\n", + " '495d549f-5afb-4f71-b57e-10bd2221a683',\n", + " '5bf56cb9-b4d3-4b58-b60c-a10f931f85ea',\n", + " '9683a1d3-c348-46d1-9f4f-2fba6488fcbf',\n", + " '37a01771-b6d5-47a5-865c-935eb3455dde',\n", + " '1b8b1726-f5eb-408a-bb60-f154ac1a641e',\n", + " '0352909a-429e-44f0-afd3-005439bf5b69',\n", + " 'ac466ecc-8434-4bb6-8d24-a573225bf7d1',\n", + " 'a639de25-536f-4013-9236-95fdf640b6c0',\n", + " 'be165139-18e7-452e-979b-9df06d8cd7e7'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", + " '31e3f92c-3b87-4ba8-9ba4-668c7adb4ab3',\n", + " '45159296-5abb-4502-84ef-1c05e0cef833',\n", + " 'cf4a050f-daa1-4982-8f47-b67c2394bba6',\n", + " '0c67c26a-1743-48e4-bd22-5df18f23713e',\n", + " '2a1f6681-8e33-4399-a683-d32d9c92220f',\n", + " '52ba87ba-30df-4572-b629-01cea97a8fc8',\n", + " '2f6fc2b8-4252-4bec-87b8-738c43102ff7',\n", + " '1e5fe333-7ff9-4d91-ac92-be4de964e71c',\n", + " 'c361fb6f-7dbf-467b-adc6-ec0569264b74',\n", + " '9c017557-6d8e-4269-a16c-87f6bbfaaf78',\n", + " '4a872177-9a07-4c66-b5af-8f10a7ec36fd',\n", + " '0db19ffd-925e-45a4-bf34-bd8fa784d488',\n", + " 'c940d07a-ee4f-4035-9fb7-58068725d1f1',\n", + " 'f8df0954-2534-4233-81cb-0ee8b1412066',\n", + " '430337c7-46ca-42c8-92fb-6141bca2532b',\n", + " '3ab2a46a-668f-4523-9b78-a004d8ab7587',\n", + " 'f2b195de-15ec-436c-903c-140f3a557105',\n", + " 'c4a0bb98-068e-4541-9231-9baa025b73c2',\n", + " '733ae557-9b8c-4b57-81a4-64230097b24b',\n", + " '490b32aa-7019-4da0-8a83-083c2e8276ba',\n", + " 'fb48a435-440b-4c52-96f3-0d70c8efbbd2',\n", + " '50d5a820-5a96-48b5-8186-7a6ce3172082',\n", + " '587c8805-3091-4f02-b768-8080ab2e35aa',\n", + " '8ae4683a-3222-4c18-afcb-749a383f51e1'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[0]\n", + "document_ids\n", + "{'Index': 1, 'id': '14f4fff73279d8f8977a09b19e81c9d7e77b01d29d1bf76d1381eb15668aec855b2f2ded0b8d102c47f6e913e215358918d718ab28c32b448d5f7471035278a7', 'human_readable_id': 2, 'text': \"Foreword\\n\\nPreface\\n\\nAcknowledgements\\n\\n1 Soldering process\\n\\nTime on its side\\n\\nPrinted circuit board\\n\\nSoldering\\n\\nSoldering processes\\n\\nComponent/solder (CS) processes\\n\\nSolder/component (SC) processes\\n\\nCleaning\\n\\nQuality\\n\\nSafety\\n\\n2 Electronics assemblies\\n\\nJoints\\n\\nThrough-hole joints\\n\\nSurface mounted components\\n\\nSurface mounted joints\\n\\nAssembly variations\\n\\nAssembly classification\\n\\n3 Solder\\n\\nMetallurgical properties of tin/lead alloys\\n\\nThe soldered joint\\n\\nSolderability\\n\\nProtective coatings\\n\\n4 Lead-free solder\\n\\nWhat's needed in the future?\\n\\nLead-free soldering- now a hot topic!\\n\\nThe age of lead-free soldering is approaching fast\\n\\nITRI\\n\\n5 Flux\\n\\nNeed for flux\\n\\nHow fluxes work\\n\\nCategorization of fluxes\\n\\nChoosing a flux\\n\\nApplication of fluxes\\n\\nSC soldering process flux\\n\\n6 Solder paste\\n\\nSolder paste or adhesive application\\n\\nDispensing\\n\\nPin transfer\\n\\nUsing solder paste\\n\\nSolder paste parameters\\n\\n7 CS soldering processes\\n\\nHand soldering\\n\\nMass CS soldering processes\\n\\nInert atmosphere soldering\\n\\nHandling assemblies\\n\\nSolder pots and pumps\\n\\nSolder pot heaters\\n\\nSoldering\\n\\nSoldering process monitoring\\n\\nvii\\n\\nix\\n\\nxiii\\n\\n1\\n\\n2\\n\\n5\\n\\n8\\n\\n16\\n\\n18\\n\\n19\\n\\n21\\n\\n21\\n\\n22\\n\\n23\\n\\n23\\n\\n27\\n\\n35\\n\\n36\\n\\n43\\n\\n49\\n\\n51\\n\\n51\\n\\n56\\n\\n66\\n\\n72\\n\\n81\\n\\n81\\n\\n83\\n\\n87\\n\\n88\\n\\n89\\n\\n9O\\n\\n91\\n\\n92\\n\\n98\\n\\n99\\n\\n107\\n\\n109\\n\\n109\\n\\n118\\n\\n122\\n\\n123\\n\\n124\\n\\n127\\n\\n127\\n\\n134\\n\\n136\\n\\n136\\n\\n146\\n\\n147\\n\\n148\\n\\n163\\n\\nvi\\n\\n8 SC soldering processes Heat application Infra-red soldering Hot air convection Hot vapour soldering Laser soldering Light beam soldering Heated collet or hot bar Miscellaneous SC soldering processes Comparison of soldering processes 9 Profiling soldering processes Profiles Infra-red soldering temperature profiles Hot vapour soldering temperature profiles Heated collet temperature profiles Optimizing temperature profiles 10 Cleaning soldered assemblies The Montreal Protocol Why clean at all? Contamination Classifications of cleaner Cleaning processes Contamination testing Comparing the cleaning options Avoiding problems -soldering quality 1 1 Have problems occurred? Statistical process control Solutions to problems Criteria for the assessment of soldered joints Characteristics of soldered joints Classification of soldered joints Features of solder joints on surface mounted boards X-ray inspection Visual inspection standards Photographic guide to defects 12 Standards & specifications Why comply with standards Reference to standards Levels of standards Standards organizations and bodies Standards for electronics assembly manufacture Guide to relevant worldwide standards Glossary References Further reading Worldwide addresses Appendix 1 Why not blame the machine? Appendix 2 Problems & solutions Appendix 3 Soldering safety Appendix 4 Comparing soldering processes & machines Index 165 165 167 173 174 178 182 182 185 186 187 187 192 193 194 195 199 199 200 2 02 2 04 208 21 8 22 1 223 224 224 227 228 229 230 230 232 235 236 275 275 2 76 2 76 277 2 80 283 299 31 1 31 3 323 333 339 343 361 366 \", 'n_tokens': 830, 'document_ids': array([1]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", + " 'f8bc9ce4-e610-4af7-987c-0fac3320e2a1',\n", + " '8003f3bd-9f55-44b8-ab53-52d74eec0ac5',\n", + " '13c0089d-a10b-43e4-976a-eb2329e57a47',\n", + " '611056a8-b545-4b1b-885a-cee47ad71be2',\n", + " 'ba9a83b2-feee-4c92-854a-9d1fe90ce2f6',\n", + " '22e0f524-c864-4fe0-af15-c86238c23da1',\n", + " 'fa219be6-faee-48c6-8d6d-f4e194979914',\n", + " 'bd3a93e3-1708-4b43-a5b6-02c18ddb0329',\n", + " 'de05b0d0-ba24-4956-b678-f5a5c3d933dd',\n", + " 'eb5e09f7-c3ee-46f6-aea5-504410b47dc1',\n", + " '27883d1a-c69a-4720-bbbe-b6c8629949f1',\n", + " '495d549f-5afb-4f71-b57e-10bd2221a683',\n", + " '0352909a-429e-44f0-afd3-005439bf5b69',\n", + " 'ac466ecc-8434-4bb6-8d24-a573225bf7d1',\n", + " 'a639de25-536f-4013-9236-95fdf640b6c0',\n", + " 'be165139-18e7-452e-979b-9df06d8cd7e7',\n", + " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", + " '2f5ca7ba-3b22-4fdd-b9ae-e330b4e964e6',\n", + " 'b427ea2e-64f4-4161-84fc-7dd16dba7f13',\n", + " '41915d84-d583-4ddf-a00e-4fd0ff4ce5c5',\n", + " '3dc411c3-fd19-4003-99e3-a1722276d830',\n", + " '47e5c563-f98b-4222-b35e-f269e0f4350e',\n", + " '392d7299-540d-4c35-ba4a-324012ff3a7f',\n", + " '15d87b31-6e6b-4e5c-a983-e0ca5b70d01d',\n", + " 'aadc1a35-ec28-4d1c-ab4b-4494f6579166',\n", + " '6b6ec3fc-c0e2-4838-b103-5e4c052dc856',\n", + " 'a10e633f-cf08-4f79-bbe2-c11d402c6035',\n", + " 'eebe25d2-690d-47ac-a146-448df85e18d9',\n", + " 'b34ff31f-95e4-488f-9cf7-ee4d475d4d64',\n", + " 'e1934cbc-e4f1-48d4-aa26-68d71d771770',\n", + " '693f6eb7-7652-41f9-83fc-491f1853856b',\n", + " 'b653759d-1ee9-4250-b714-d13084df16f4',\n", + " '52ce59e6-49bc-4f7c-930d-3cf18d3189dd',\n", + " '6b0d2390-f76d-490f-8999-1bdc5c8c506c',\n", + " '7a8cb01b-72a5-496d-9eab-baa6ef712163',\n", + " '0dcc54be-9e38-4aec-8203-282a62ff77a0',\n", + " '63f69a79-ee77-4a16-9d89-7c5ffffb9ce5',\n", + " '0abf033c-1c31-4cfd-a45f-2a6e58ee4c1a',\n", + " 'cd035b5c-1d8c-43b4-9d4a-dbad721f16a6',\n", + " 'bf4bb60b-63b3-44b8-9e94-06a6120276ed',\n", + " '0b6fdd52-3fc4-4ae8-b580-2ec9bc45e70c',\n", + " '7bb73c46-3d94-4969-ad9b-9d3ad19def7d',\n", + " 'eb2d8262-a98d-45e6-9897-44d591383225',\n", + " '4dc46b94-5eed-4b58-8b6d-da6be8ade043',\n", + " 'c90b24a0-41b3-4d3c-bf34-9a19bf99cc26',\n", + " 'd5293d1f-98ae-4f0a-823c-e26fd57b12da',\n", + " 'fdb40283-64ad-4ab9-be6b-da189a1fe786',\n", + " '15de5f0c-ffa1-4e55-b975-0c85b087abe6',\n", + " '9ebeae91-0f27-4cfb-be24-7fd80f01a030',\n", + " '253f2c1c-b709-41cf-a8c0-840471116287',\n", + " 'fe786081-9266-4425-938f-1dccfbf99414',\n", + " 'fcc06f7f-b599-4768-8bd5-ff4715b05844',\n", + " 'a635812d-39bc-416f-ac5d-70b341178cc1',\n", + " '9db7a51d-9c6b-4d5f-8776-133af8512e49',\n", + " '5ee2ea9d-3fdd-410e-8bf9-7e67239292da',\n", + " 'c8ea2682-b86f-4373-a84c-65f1c0ed6568',\n", + " '2164a1c5-9d3a-4d35-92c4-a5d3dee7a0a9',\n", + " 'b602317e-aca6-4aaa-9b03-464a6b43beee',\n", + " '72fd3011-11ce-4d92-90bd-9a0f4288b709',\n", + " '983e5452-4913-4826-8d30-e356b7491e1e',\n", + " '1025af61-7e82-4b88-aad8-a7b04c915b71',\n", + " 'c5037e97-01c6-42bc-ab0d-175254a8d67b',\n", + " '5e3b9439-2c17-4dc0-9e4c-8551fec03517',\n", + " 'ed99a341-8c87-4cef-a9a7-4b38b6c1ce2d',\n", + " 'c39c4b6e-8704-4ba4-bb0e-e836a402e986',\n", + " 'ff189b82-d71d-4d2a-86db-e0f1ec868ac1',\n", + " '49363281-e61d-4046-9363-8beeaff9378d',\n", + " '8d0aa0a6-14a3-4c63-b574-0b8baac78bcd',\n", + " '6d9c9dbe-2738-4236-8b4c-d429bbb355d7',\n", + " '74f6fe01-0e7a-4d70-a13b-5bab3d0285b6',\n", + " '0059b5cb-f480-482c-a5e5-a216ff0a3514',\n", + " '113978f9-c184-4c23-843e-d3cbc0570248',\n", + " '29df9302-7cb8-4e72-867a-ac86dd2ded79',\n", + " '9b143e57-91b3-41f8-8d17-06ee60772f48',\n", + " '38ea11b3-6c9d-4bf3-8d00-42615e255430',\n", + " 'ebe4300a-6321-45db-82d4-497a0fb5dbcc',\n", + " '810eed2d-7fb1-479e-a7a6-a4ba7f6f4300',\n", + " '2a17ae14-9ab0-4bc2-8142-a312ebe9fb1d',\n", + " 'bde4364a-8181-493c-8cc9-7136b22513f1',\n", + " 'c4bf00ee-8429-45e1-98b2-ea65ca6692df',\n", + " '5e0465e4-0a1f-48d8-87df-2e747372cd12',\n", + " '6d5ac72c-ea75-4f94-9143-8f7d5074a2b5'], dtype=object), 'relationship_ids': array(['3ab2a46a-668f-4523-9b78-a004d8ab7587',\n", + " 'fb48a435-440b-4c52-96f3-0d70c8efbbd2',\n", + " 'a34cb6b0-15f5-4223-a5d6-2e0050c37832',\n", + " '8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", + " 'bdb96077-cda0-4f45-8704-fd634f5c37fc',\n", + " 'cb608748-833b-482b-b94e-2b7bf2ea2886',\n", + " 'ed1972aa-4579-4adc-afdf-d59a505f197d',\n", + " '1d5c441c-bda7-4c5a-bea3-ab90d7f4b167',\n", + " 'cd30b9fc-e6af-4fb9-a988-d252a3130a83',\n", + " 'c600f8bb-52ee-4222-953d-2cf92234e1af',\n", + " '54d006a9-16b4-49d0-bd23-f33fd8f5fda0',\n", + " 'b5fb65a3-fdf5-4831-be4f-bd356ef16dd6',\n", + " 'fdb000f3-0b58-4cc5-ab60-2b2b76c8c9fd',\n", + " '367b7dd0-8864-47f1-a9b0-d7155becbd76',\n", + " '8396269b-667f-4bed-9de8-3c1aa7336590',\n", + " 'f5886912-3c11-4e86-afe6-f45421d6efee',\n", + " '9ceaf9e7-0282-4acc-8c6f-e9bef14f7149',\n", + " 'fd678a1b-67b2-44e9-84f1-f8e8a5d0b8fc',\n", + " '67567a08-d2a5-45e4-b99b-650cffb14acd',\n", + " '910fc289-52a2-405b-b6d1-f8157ad030d0',\n", + " 'ad72c761-58e4-4ece-9d23-c85b160506eb',\n", + " '0fafc243-2cc5-4d0c-b036-abbb03f45354',\n", + " 'bf20f949-b7fd-4796-95bb-32bf0a60b452',\n", + " 'a42fcb2d-9bd5-4c6a-9589-5ae163759101',\n", + " '53ab441d-54e1-42ed-a182-49b798be9f66',\n", + " '63775c4f-2161-48d2-becf-60b858c2c629',\n", + " 'f6d761c3-ad10-403e-97d8-6d10c74e159d',\n", + " '336264f7-bf6f-4f12-b2a4-dd3f53c27e96',\n", + " '02672dad-a887-4634-8007-5b04cb2d1cb6',\n", + " '95b7f8bb-d955-4d92-862d-106a8e503cc0',\n", + " '54fb97a5-9897-4beb-86eb-a4c9fac3eaa9',\n", + " 'd6a56d92-4fd6-47a6-97e1-6e8495b65c68',\n", + " '950b2cc8-ae46-44bf-8350-cbdd34e2894f',\n", + " '881e38e5-c6f6-479e-8ac0-cad558237fea',\n", + " '590e4288-0a97-458f-8d84-915a8c1d7eb7',\n", + " '16467289-aa6c-4723-be81-2b153c9c76e0',\n", + " '759950bc-e92a-43ca-be5c-fd7e7abf2fe3',\n", + " 'ab98c6e7-b409-451c-9ed3-3a963cd7aa28',\n", + " '834f3ca9-38dd-4254-a250-d02f3f64ff22',\n", + " '84dd6e62-5f1b-46f8-97cd-da1c790d6881',\n", + " '6f62eac3-55ea-4255-be57-3eed01655225',\n", + " '0c799f96-4759-4072-a7b1-bc4ac928162b',\n", + " '114c93d2-7191-4160-838d-bff0e7a32802',\n", + " '09d925be-12fe-4bb5-a1ef-ebd23c1b15fb',\n", + " '1e5cbdd6-bf94-44ba-975c-772668cffcb2',\n", + " 'b783b716-9559-4d0a-b170-63dd11940ef2',\n", + " '226f0cc6-821a-46e5-a6e3-acf760455308',\n", + " '3a3e69bb-7a8f-40b4-9cfb-0f7f2e160b6f',\n", + " '6f25c1ec-e14f-4d24-9696-1e493cfdf44f'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[1]\n", + "document_ids\n", + "{'Index': 2, 'id': '92c05da8037b6c845429a632ab63ae0e3aaa22558e0267021364d553beb46b73d60970ecf60c41365c0673ec404fac962a5d8bf7d99aafdb4305dc6b22bd46f9', 'human_readable_id': 3, 'text': '8 SC soldering processes\\n\\n9\\n\\n10\\n\\n1 1\\n\\n12', 'n_tokens': 15, 'document_ids': array([2]), 'entity_ids': array(['fdd6402f-1ef3-4daf-acc4-6ed786d40ca1'], dtype=object), 'relationship_ids': None, 'covariate_ids': array([], dtype=object)}\n", + "[2]\n", + "document_ids\n", + "{'Index': 3, 'id': 'ae763cc1bcce9b8bd537bd165d69f96f03b4b8414239c8d423c789c663fae67120c65dea1a3747378db4b5e795393fb2e9c1e3fa97fab237acc3c39eecb7aa14', 'human_readable_id': 4, 'text': \"Appendix 1\\n\\n366\\n\\nForeword by David Crimp, Executive Vice President, Europe Alpha Metals division of Cookson Electronics As the World enters the third millennium we can look back over recent years and see the incredible advances made within our industry over a relatively short time. Not many years ago there were no computers, no CDs, no mobile telecommunications, and space travel was limited to science fiction --even radio networks have really only grown up within a lifetime. Much of the technology advances of our age have been made possible thanks to the innovation of the electronics industry which, with its development of new materials, machines and techniques, continues to grow on a global basis. We tend to take such things for granted, but now developing countries too are sharing in the electronics boom. With further miniaturisation, increased board complexity and quality becoming even more critical, expertise in soldering assembly is a prerequi- site, for both engineers and new recruits to the electronics business. Soldering in electronics assembly is a complex skill, relying on the combination of personal expertise, quality materials, and efficient equip- ment. Quality management systems have helped raise the production yields, while equipment and materials technologies continue to keep abreast of the industry requirements. But behind all this are the engineers and it's they, working with their suppliers, who are the key players in the growth of our industry in the future. This book is written to provide a useful reference for engineers involved with the practical side of electronics assembly operations, and will prove interesting for a wide range of readers, in the broadest sectors of our industry. I am pleased to be able to contribute to this important book, on behalf of Cookson Electronics. For over a century the electronics divisions within \", 'n_tokens': 485, 'document_ids': array([3]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " '4d3d514b-6ce9-499c-aed9-81847ebd624f',\n", + " '081ffd38-b9b7-4b1d-a950-f23adbe000a2',\n", + " '70f8a13d-349c-4f34-8d55-c6a008a6b45d',\n", + " 'a4f49b38-42a3-48c6-9373-00793e001049',\n", + " '597ff0d1-5ab7-4896-ba9a-81a262e73e46',\n", + " '8eb9da90-175c-4916-b86b-2f23471fedca',\n", + " '670323e3-1999-4c16-93d2-a568c66ebc75',\n", + " '5793ea85-4c66-4047-87b9-71c374d6a2e3',\n", + " '9cb18a30-1895-48e5-88bf-adb810424118',\n", + " '0f57f45a-8494-4270-937b-d35e5dd6dd3d',\n", + " 'ffb98d88-7ed4-4910-87e4-df8979e6273b',\n", + " 'bc9849aa-5b32-495d-bcd7-0c4a45815c1d',\n", + " '12851f3b-37f1-4d48-85a1-5155409bd1c9',\n", + " '1f14c5b8-4a60-461f-ab1b-62c3c87e6245',\n", + " 'f802b1e8-7ae9-40bc-abfa-8cdd2cff8113',\n", + " '961a226d-b96b-49cf-a7cc-41734f2a77eb',\n", + " '331696a6-78fc-4951-b223-a91e4c8bc1cb',\n", + " '88b5761f-9ef4-4179-972f-79f45971ec5d',\n", + " '6ad73d20-e8bb-4da8-b9d5-d1f02e22d59e',\n", + " 'be92a637-8cf1-48dc-9dc6-8645b85f6f04',\n", + " 'd5428c95-6ea9-4e2d-bb2e-912437d9ea70'], dtype=object), 'relationship_ids': array(['17fd1bbc-e538-4fe0-8f1b-73673236c881',\n", + " 'f72ed6ef-5ffb-47d1-8165-fd4908bec70b',\n", + " '75fa0561-ffb1-4c06-9d60-14fc73894b80',\n", + " '1a90627c-d74a-4a29-9a40-371bd857466e',\n", + " '1264f04d-bced-4147-a991-b966d14f6581',\n", + " 'f8d0fba1-4b25-47af-b50d-b0ec5bfe9130',\n", + " 'ca3e7e09-809f-4f7c-a0b1-4c0124441b92',\n", + " '633b8938-4f6d-42a0-aa7d-14b4bccedac9',\n", + " '33b7c6d8-f7e7-4162-83d5-6b54c2a99337',\n", + " '029f5aba-02ff-40e7-938a-181c30823b28',\n", + " '51bf3b0d-5b43-43aa-8db3-5076514a76ea',\n", + " '6a540629-8a34-4e0d-adcb-8f0005b29d75',\n", + " 'ff0516bb-10b8-47d8-8014-05030622d186',\n", + " '9d728a5b-b3a3-4e39-999f-34c188cf103c',\n", + " '17a5d402-40b7-41c7-bd26-c2dadc0663fb',\n", + " '828c63f2-0c17-455b-b360-01b5ba138c30',\n", + " '08299e42-aa32-46ef-9562-a0ee3dc4b575',\n", + " '71d2c2bb-f755-433b-9682-aa3b236117b6',\n", + " 'f2dae476-6d6a-4d04-bb74-f5027b5f0296',\n", + " 'f2f02266-bd41-43e2-94bb-c976706bbba2',\n", + " '5df48913-2bc1-4fb0-88ad-9000abaff8c8',\n", + " '9bc828d1-af43-4a2f-ae13-54d876e45c5f',\n", + " '72a6494d-4ed5-4be9-b1e6-23de08120e68',\n", + " 'a88cad08-4ef6-42bc-b44f-c19c3adc2d69'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[3]\n", + "document_ids\n", + "{'Index': 4, 'id': 'ea8856414e3a2ac5dfabb597298c62c56ffc434664014e2cd113bfeb44174ddda32192b70457a36fd84de9203d28d4a1f3dc81fd9ead60f4e5c1f29d441f2287', 'human_readable_id': 5, 'text': 'by\\n\\n186 SC SOLDERING PROCESSES\\n\\n186 SC SOLDERING PROCESSES Photo 8.6 Hot gas/air soldering machine, used typically in rework or individual component placement (Planer Industrial) @ soldering irons — conventional soldering irons with specially shaped tips. Comparison of soldering processes All SC soldering processes are compared in Appendix 4, along with CS soldering processes.\\n\\nPreface Electronics assembly is about components that are soldered onto a printed circuit board. Soldering, as a principle in electronics assembly, is straight- forward and simple m two metal surfaces (component termination and a connecting pad on printed circuit board track) are joined by metallic bonds created by molten solder between them. Solder joints are supported by the solder when it solidifies, and the solder allows electrical contact between metals in the joints. Surface mounted components are changing, they are becoming smaller and lighter and in the case of ICs due to the increased demands of functionality, they also have a greater number of leads. This dimensional and weight change is driven by the increase in demand of portable products. Table I shows the growth in unit terms for portable products over the coming years. The other sectors illustrated harsh environment, low cost/high value and high performance cut across the traditional market boundaries and focus more on the products technology requirement (Figure I). Increasingly, a number of companies are adopting one particular pack- aging strategy m that of small form-factor components ideal for portable products. These are increasingly being used in larger electronic systems such as exchanges, base stations etc as a company wishes to adopt one packaging strategy and hence assembly strategy for all types of products that they manufacture. This has obvious benefits with regards to stock holding Table 1 Total equipment quantities by global technology roadmap sectors 1997-2007 1997 2 0 0 2 2 0 0 7 x lO 6 % x l O 6 % x lO 6 1710 4480 57.2 Portables 45.1 7480 % ! 63.3 High performance 460 12.2 840 10.7 990 8.4 Harsh environment 275 7.3 670 8.6 1190 10.0 Low cost, high volume 1340 35.4 1840 23.5 2160 18.3 Total 3785 1 0 0 . 0 7830 1 0 0 . 0 1 1 8 2 0 100.0 ', 'n_tokens': 667, 'document_ids': array([4]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " 'b427ea2e-64f4-4161-84fc-7dd16dba7f13',\n", + " '7230bde1-afc2-4019-a4c1-d18dbece2ef3',\n", + " '72995119-aab8-43a8-938f-1be094b4b4f8',\n", + " 'ed120a52-c8db-4f2a-88e9-d755d1657025',\n", + " '9d966b7d-65cc-4a39-acf0-79d6094372ae',\n", + " '7bf9a917-dbf5-4c00-b6aa-c514c715a13a',\n", + " '4d3be32e-83b2-443d-9e2d-d45c0558ed26'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", + " '3389b889-6d0b-4f1d-9e38-3a6e03d1459b',\n", + " '4d2fa8a2-8210-4376-a7a1-eee751c29705',\n", + " '52fdd534-255f-432c-8b31-3ba151477b4c',\n", + " 'c0125d50-26f1-4398-88db-e362f6364061',\n", + " '0d4b2580-9fd1-4d67-a2ae-ace802607269',\n", + " '4ab3651c-334e-40ed-9f9d-7fa82a1aba41',\n", + " '44d6e2fb-b2ec-4ee8-bac4-9e5127bd29fe',\n", + " 'cdcf8d96-84bf-40b9-92f7-3d89ededa3c5',\n", + " '1d301503-7364-4071-bd1c-a8389970b6e8',\n", + " 'a50ef15e-3483-4a4e-8ed9-361b1c38bce3'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[4]\n", + "document_ids\n", + "{'Index': 5, 'id': 'e08c9138e652cbe6eb1810c16545023d6f699af201d54397216f4607f7195da8cfde002db66c0e2c71642db6dfb507b3bb0696b62d738be13deb7303ce11db3b', 'human_readable_id': 6, 'text': \"x PREFACE\\n\\nFigure 1 Global technology roadmaps (BPA, 1998) and handling of parts as well as set up time for assembly equipment such as pick and place machines. Figure 2 illustrates worldwide trends and movements away from through- hole components towards surface mount and a third format termed minimalist packaging. Minimalist packaging is the ultimate packaging technology. The future challenge for soldering and assembly technology is to manage the Figure 2 Worldwide trends from through-hole components towards surface mounted components (BPA, 1998) \\n\\nGLOBAL (Showing MARKET SECTORS\\n\\nTECHNOLOGY Typical Systems)\\n\\nROADMAPS SECTORS\\n\\nSystems,\\n\\nTECHNOLOGY\\n\\nHarsn Environment Systems Low Cost/High Volume Systerns\\n\\nTotal Packages (Bn) 58.17\\n\\nPREFACE xi attachment of through-hole, surface mount and minimalist packages on the same board. There are many instances where, particularly with through hole connectors, these older technology products will remain due to costs or robustness. Small components and greater lead counts make soldering to printed circuit boards more and more difficult. New soldering techniques and modifications of existing techniques are required to meet the challenge of smaller surface mount and minimalist packages. Our job in writing this book is to show all this. While looking at the principle of soldering, which has remained fixed since man first used molten metal to join two other metals (first known use of solder is Roman pipework, where sections of lead pipe were joined by melting their ends together), we also show how the techniques to fulfill the soldering process can change and, indeed, are changing with the requirements placed by components and printed circuit board assemblies on them. More than anything else these days (and in the future), state of component and printed circuit board technologies means soldering has to be clean and precise. In the distant past, when components were huge and printed circuit board tracks were wide, soldering was often a case of throwing sufficient molten solder at a board to make an adequate joint. Joints were initially made by hand. This is no longer the case. With minute component terminations and tracks, too much solder can be devastating. On the other hand, too little solder will not make a joint at all. Even if economic considerations were not important, joints can no longer be made by hand because hand soldering cannot guarantee adequate results with such small joints. Control of soldering systems has to be precise and closely monitored. Soldering and, inevitably, its control must be performed by machines. While it's impossible to summarize all we have to say, in this short preface, it is possible to make a list of points which our book, hopefully, spotlights. Overleaf we present the 10 rules of machine soldering. \\n\\nhighest qual- produces\\n\\n10 rules of machine soldering 1 machine soldering, correctly controlled, produces highest qual- ity joints at lowest cost 2 machine soldering is a process and, like all processes, produces consistent results if properly controlled 3 touch-up of faulty soldered joints is costly, unretiable and unne- cessary 4 anything that reduces solder joint defects is cost effective 5 design. handling, assembly and maintenance are ail parts of the soldering process and must be properly controlled 6 solderability of printed circuit boards and components accounts for 60% of all faulty soldered joints 7 never use parts which fail solderability testing: the ultimate cost is too high 8 soldering problems are solved by process control — not more inspection and touch-up 9 everyone concerned with the soldering process must be formally and properly trained 10 zero-defect soldering is the lowest cost soldering.\", 'n_tokens': 947, 'document_ids': array([5]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " '0352909a-429e-44f0-afd3-005439bf5b69',\n", + " '8b4319f2-5d66-4554-9a5a-3c07d2d6fa64',\n", + " '281befb9-444d-447d-9998-739064315ed2',\n", + " 'e1878d90-8bf1-4f38-aabc-7b97fbcf04d2',\n", + " 'c60ab2cf-310c-4a04-a5e2-e66d1d891018',\n", + " '208036b8-51d9-484e-b7ed-9e7970ab6072',\n", + " '2cce6e88-2cf9-4a9e-bd24-cb711029b725',\n", + " 'abd2f69b-4822-4189-ae74-89e05fab856d',\n", + " '74748602-b8ce-4f2c-8a2a-ced24ffdf195',\n", + " 'd76ac487-ff25-4320-951a-42664aa335bb'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", + " '792d025d-f636-4bf0-bf6c-ea43a6dad618',\n", + " 'ca3ebcca-f074-4c16-a393-7e3ecd993f4c',\n", + " 'fd098a96-aa4a-46a3-8116-2ec254e5b798',\n", + " '56717c5d-231c-4d30-b3bf-fd11fb5e51e0',\n", + " '822fe3d1-c096-4455-baf2-82bf3fde8f37',\n", + " 'e265ec56-d497-4a6f-b444-30e47c8138ce',\n", + " '03dbfe81-71c7-4126-a573-23cffe62c1ff',\n", + " '13ee7450-8e1c-43db-b792-1c394005913f',\n", + " '9668cd85-7bc6-4de5-b67e-867f75113ac0',\n", + " 'dbd8f2b4-aa42-4235-82fe-c4d7b888c9f8',\n", + " '460dbca8-1e47-4ac9-9e23-272c67027e24',\n", + " 'a914f0a3-a447-48e0-8976-69e7763219c1',\n", + " '1bdea2b2-4e45-4254-93eb-f7de80597683',\n", + " 'ca1974ef-9315-4ea1-ba85-39456b6aeac6'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[5]\n", + "document_ids\n", + "{'Index': 6, 'id': 'fe32f9e377e349a3fed1de96003dc98ffbfee6c43cba3346e1cb49889a5d41b6daa12f935807ea37b3d9776ef25683068aedcbba3b5a07a8038efb09b6c8e579', 'human_readable_id': 7, 'text': \"controlled, produces and, like all processes, is costly, unretiable\\n\\n1 machine soldering, correctly ity joints at lowest cost 2 machine soldering is a process consistent results if properly 3 touch-up of faulty soldered cessary 4 anything that reduces solder 5 design. handling, assembly soldering process and must be\\n\\nPano ee SRE ae\\n\\njoint defects and\\n\\nof printed circuit all faulty soldered parts which fail\\n\\nis too high 8 soldering inspection 9 everyone and properly 10 zero-defect\\n\\nare touch-up with soldering is the\\n\\nAcknowledgements We'd like to thank a number of people who have helped us in major ways, as we have researched and written this book. In no particular order of priority, gratitude goes to: Mark Hutton; BPA UK Don Elliott; Elliott Technologies, Canada Alan Keyte, Nokia, formerly with Motorola, UK Andrew Nicholson, Alpha Metals, UK Fred Thorns, Alpha Metals, UK Phil Fulker; Invicta Contract Engineering, UK Colin Lea; National Physical Laboratory, UK William Dowa/Rich Burke/Keith Favre; Speedline Electrovert, USA Alan Roberts and Claude Legault; Speedline Electrovert, USA Chris Davies/Craig Lazinsky; Speediine Camelot, USA Steve Harper; Speedline MPM, UK many people within the Electrovert group worldwide. Finally, special thanks go to Bob Willis of Electronic Presentation Services in the UK, for help and guidance throughout. This book is dedicated to a respected man, considered by many to be a guru in electronics soldering. Paul Bud, Technical Director of Electrovert is sadly missed. He was a kind man anda gentleman, always willing to listen and pass on his wide knowledge of soldering, communicating in many languages. He was an inspiration to us all. in his memory, we hope the book proves helpful to all who read it.\", 'n_tokens': 387, 'document_ids': array([6]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " 'c60ab2cf-310c-4a04-a5e2-e66d1d891018',\n", + " '6204bc96-50b6-4a22-a57e-4a78f0341fa7',\n", + " 'ddd9180e-193c-4ed2-a1fd-113286301f11',\n", + " 'af586f19-c17d-405b-ad82-b0f61f2e6ab9'], dtype=object), 'relationship_ids': array(['de7677fa-84f8-44db-8383-8f034fa7093a',\n", + " '332f3816-cb6e-41d7-82cd-667ba5f7d256',\n", + " '1afb1c75-387d-4c43-a29a-dc8423dc60b1',\n", + " '0787db22-0d09-428b-a508-02fa6f6d6c1e',\n", + " '2d75c6c5-8beb-4e06-8da0-a5afd1c34248'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[6]\n", + "document_ids\n", + "{'Index': 7, 'id': '52589ff3ffc9f0522adcbdf3bffa9fd756d813c86babfbc8df4556f46e35f594b5213db8d551b0d3be278e293259e78b9851add38abf5546dbba29daeed69b55', 'human_readable_id': 8, 'text': \"Acknowledgements\\n\\nThis book is dedicated to a respected man, considered by many to be a guru in electronics soldering. Paul Bud, Technical Director of Electrovert is sadly missed. He was a kind man anda gentleman, always willing to listen and pass on his wide knowledge of soldering, communicating in many languages. He was an inspiration to us all. in his memory, we hope the book proves helpful to all who read it.\\n\\nThe science of soldering has been known for many years. It is, indeed, a simple process of bringing parts to be joined together with solder, flux and heat. How to do this and to achieve a satisfactory result, though, is both a science and an art, when each by itself may vary. Methods and the principle used as years go by form a most fascinating subject. Bob Willis, Electronic Presentation Services Solder is truly a magnificent trifle, it gets little respect from management yet it holds the entire electronics industry together. Thus another book on soldering is very welcome! Howard H Manko, Manko Associates After nearly 4000 years, soldering remains as much an art as a science. Progress is still accelerating in this field of electronic technology, forcing us m again and again m to rethink the idea of quality. Soldering first forged weapons, but now it may help us develop intelligent machines towards assisting mankind in peaceful pursuits. Armin Rahn, rahn-tec Consultants The more we know about soldering electronics assemblies, the more we discover what we don't know. We may argue about the best solder fillet shapes, the benefits of controlling the solder joint microstructure, or the required cleanliness level of flux residues, but it is the practice of soldering that is of the essence: almost anyone can solder - - but few can solder well. Colin Lea, National Physical Laboratory Printed wiring boards are the primary means of interconnecting circuit components. As such they have contributed greatly to the growth of electronics. Assembly and connection of printed wiring b o a r d s - also called printed circuits and etched w i r i n g - involve a sequence of three basic operations. They are (1) manual or automatic insertion of electronic components, (2) metallurgical joining (soldering) of component leads or terminals to printed conductors, and, usually (3) a cleaning operation to remove flux and other residual contaminants. In view of the interest of electronic equipment manufacturers in this subject and the increasing importance of electronics in industry and elsewhere, a review of the state of the art as it currently exists and discussion of the effects of recent developments in the field are in order. Paul Bud (October 1980), then Vice President of Electrovert Inc \", 'n_tokens': 715, 'document_ids': array([7]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", + " 'ba9a83b2-feee-4c92-854a-9d1fe90ce2f6',\n", + " 'f6597ab9-ad3b-40e9-8402-08c0cc2cadc5',\n", + " '95d9931c-ed18-42fc-a2ee-f870d415f503',\n", + " 'a41a72c0-ff5a-408d-8f41-15935db4a4c9',\n", + " 'd2042af0-1b33-4264-9858-c22713079a0b',\n", + " 'f3cbbe17-19b9-472f-9109-a58fb233ef52',\n", + " '9173f6dc-c626-4edb-bcb4-ece061fcb5e9',\n", + " '89ab2a8e-4ea3-49c2-a5d5-65a8c06c4066',\n", + " '35566d46-4047-4809-a1b8-cf774048c10c',\n", + " '6c9e0cbd-2f11-4eb7-8e63-210caa7b8757',\n", + " '59e537c6-28da-403b-b0d5-bb4d1eae6461'], dtype=object), 'relationship_ids': array(['52ba87ba-30df-4572-b629-01cea97a8fc8',\n", + " 'c9c1d874-1c75-4447-8441-3296880046cd',\n", + " 'da9dd12f-8cdc-40f5-9500-5f0037df0001',\n", + " 'f8c98654-0784-4426-a01f-50e9594a897e',\n", + " '85c380c2-09cd-4a05-89b6-b2bb76598d55',\n", + " 'a10226a9-e7de-4ed3-87d9-24948347d69b',\n", + " 'c19136d7-8d3c-405a-8050-35a186c99585',\n", + " '70c15ec2-9eb8-4a9b-ab0c-7362310d6b77',\n", + " '3e7c1a9f-9c0b-4097-a6a3-3bbd203d6cdd',\n", + " 'bd91ec21-3212-4977-a2ac-6237e33d455b',\n", + " 'bfb38148-58a1-4e9a-8f98-39bff8ba7918',\n", + " '22972b60-a76e-4287-989d-8ef1b8d2c468',\n", + " '21e38eef-20bd-439a-86a6-2035a27a7cbd',\n", + " '82479e7b-848c-4c60-b60c-b2c5bb75a99b',\n", + " 'a83ef05b-47bb-4530-8ac0-fa2fe0be5823'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[7]\n", + "document_ids\n", + "{'Index': 8, 'id': '8b43780905545213bff0b274655b9923084f78821c0092b1fd739fa094683cb39c743151d5b50578fa551819ddf557d546744f53139a47d6e2cce6f9a465e662', 'human_readable_id': 9, 'text': '1 Soldering process This chapter could be seen as just another introduction to soldering — it does, after all, explain in a fairly basic manner all important aspects of soldering in electronics assemblies. In this light many people may be tempted to skip it. However, this would be a mistake as it also explains philosophy behind the complete book. Further, it discusses main features and illustrates fundamental premises upon which we have based our text. Finally it also serves as a guide indicating where relevant and important information is to be found within the rest of the book. We strongly advise this chapter is looked at bearing all this in mind. Soldering, in principle though not in practice, is a reasonably straightfor- ward process, used in the electronics industry to bond components to- gether, forming one or more electrical connections. From this description, it’s easy to see that soldering serves two functions: @ mechanical support — holding components of an assembly together @ electrical support — forming required electrical connections within a circuit. Most components in an assembly use the mechanical support of soldered joints alone to give adequate fixing into the assembly. A few isolated components (notably, larger, heavier components) may require additional mechanical support, in the form of straps, nuts, bolts and so on. Where possible, however, such large components should be designed out (that is, care should be taken when designing a circuit not to use such components) of an assembly to keep extra procedures and cost to a minimum. On the other hand, all components may use solder as electrical support to form required electrical connections. No other method has yet been devised to take the place of solder in all assemblies to the same level of performance, cost and ease of operation.', 'n_tokens': 348, 'document_ids': array([8]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " '3ae49303-e478-4317-8c86-88a3c09ef83e',\n", + " 'f91789cc-62ef-4fe3-b7d2-72b3aca6d2ee'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", + " 'a7205d48-e2af-426d-8af3-c10263766412',\n", + " 'a6a5ccec-2c90-4a1e-a9ea-6927c9015ed0',\n", + " '949afa01-41cf-4eda-8f25-ce193a98164c',\n", + " '5900e2da-7ea6-4c64-b56b-23183fb8081f'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[8]\n", + "document_ids\n", + "{'Index': 9, 'id': '37fc8b0316f1342d684c793531ca6c817d1a6f8347aef18379ee8033e1ca7886e6fc93abe10103e0fbc08f3f7dc4ed97d8eb6b79b8cc9f0594f13b5a209ef31d', 'human_readable_id': 10, 'text': \"2 SOLDERING PROCESS\\n\\nTime on its side Solder in one form or another has been around for a long time. The Romans are known to have used solder to form joints in their plumbing systems and, indeed, the word plumbing refers to the use of lead (from the Latin plumbum meaning lead) as a jointing compound. Nowadays, of course, pure lead plumbing is no longer considered, instead solder m which is an alloy of mostly tin and lead - - is used. It's interesting to note that certain countries are already in the process of altering legislation to prevent lead being used in any plumbing where drinking water is present. Solder has been adopted by the electronics industry as the best method of making joints within assemblies and, for many years, this jointing process was undertaken manually-- hand soldering. Inevitably hand soldering is a slow, laborious, time-consuming and hence expensive process as each component must be soldered into position to the printed circuit board individually. Quality and repeatability of joints depend almost totally on the individual operator. This clearly makes cost of large-scale electronics assembly production uneconomical and unsatisfactory. Generally, there- fore, hand soldering of electronics assemblies is undertaken only in devel- opment and prototype stages, although there remains a situation in which small-volume production of electronics assemblies is economical. Hand soldering is used regularly in rework stages of manufacture, where assem- blies need to be partially disassembled for repair and service purposes. Because of this situation we need to consider hand soldering and so it is discussed in Chapter 7. For the last 40 years or so, various methods of automating soldering processes have been developed. It's easy to see how vitally important automated soldering of assemblies has become, by remembering that the space programme of getting a man on the moon could not have been achieved without it. Paul Bud, to whom this book is dedicated, related an interesting fact about NASA printed circuit boards used in spacecraft. Had NASA's assemblies been hand soldered, joints would have held more solder with the result that assemblies would have been 10% heavier. So many assemblies are used in spacecraft that with this additional weight, the three astronauts (totalling, say, 250 kg) could not have been carried! Until just recently, however ~ say, the last ten years ~ soldering of really only one type of electronics assembly was in the main undertaken. This assembly type, a typical joint of which is illustrated in Figure 1.1, is commonly called the through-hole printed circuit board, simply because the components feature leads which are inserted through holes in the printed circuit board. Copper track interconnections exist between holes which \", 'n_tokens': 758, 'document_ids': array([9]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " 'bd3a93e3-1708-4b43-a5b6-02c18ddb0329',\n", + " '2cce6e88-2cf9-4a9e-bd24-cb711029b725',\n", + " 'a3d65e7a-ab75-48f9-a89e-9821b4bd708e',\n", + " '53195e4e-b3dc-4bf0-bca2-727585db2359',\n", + " 'aa1d110d-5c01-4545-ab2a-747a8abc377e'], dtype=object), 'relationship_ids': array(['9b7b1824-0d17-4739-9fd1-38e4e015928a',\n", + " '7c970ca5-3dbe-4b4b-83de-b88dfdeb6fd9',\n", + " '2d350acf-a67b-4201-81c5-de297dfc85fd',\n", + " '2fd53fac-52d3-43e6-b52d-8225973cb51e',\n", + " '337abf51-293e-4d91-9955-8252095a1be0',\n", + " 'd4bd15bd-20d2-4fef-8964-03199da1b0a1',\n", + " '2906daa9-c83f-4053-893c-b34562374829'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[9]\n", + "document_ids\n", + "{'Index': 10, 'id': 'f9a518c2e9b9918af9a7e591c7046ddf1ab3c6587d0e6636ca0de33c7c26051f89db955009c25fd9b7255d2235c5358d900cd48b1999cbc34492f22f0f48ea1e', 'human_readable_id': 11, 'text': \"TIME ON ITS SIDE 3\\n\\nmake up the circuit of an assembly and component leads are soldered to the copper, so that mechanical and electrical support is provided with each solder joint. Note that, in this ideal joint, solder has been drawn inside the hole during the soldering operation mthis occurs by capillary action. Solder between the copper track and the component lead is called the fillet. Emergence of a different type of electronics assembly m surface mounted assemblies or SMAs ~ however, is altering the face of soldering processes used. So much is surface mount technology (SMT) changing soldering that, at present, somewhere around 50% of all electronics assemblies use at least a few surface mounted components (SMCs ~ also sometimes called surface mounted devices or SMDs). In 1980 the figure was, to all practical purposes outside of Japan, zero. This change in assembly technology has only been possible with developments bringing a parallel change in soldering technology. Changes in component technology, too, are pushing many companies along the surface mount route ~ a growing number of components simply cannot be obtained in through-hole forms and are only available as surface mounted components. Figure 1.1 Soldered joint formed between a component lead and copper track on a plated through- hole printed circuit board \\n\\nEmergence of a different type of electronics assembly m surface mounted\\n\\nComponent\\n\\nComponent lead fillet \\\\ Printed circuit board base material track Plated through-hole\\n\\nCopper\\n\\n4 SOLDERING PROCESS\\n\\nFigure 1.2 shows a typical surface mounted assembly joint, in which a surface mounted component is soldered to a printed circuit board. Differ- ence between this and the through-hole assembly joint of Figure 1.1 is immediately a p p a r e n t - surface mounted assemblies do not use holes to locate component leads prior to soldering. Indeed, surface mounted com- ponents do not have leads, a fact which prompts another descriptive term for them - - leadless components - - in contrast with components used in through-hole assemblies which are often called leaded components. While we're defining terms, we may as well go on to point out where leaded components are inserted into a printed circuit board, leadless components are loosely said to be onserted onto a board. From this description it's easy to see that surface mount technology is based on a marriage of standard through-hole techniques with hybrid assembly techniques (hybrid assemblies are those in which film-based components are combined with ieadless discrete components on a ceramic or similar substrate). These two main assembly types are only categories, and within each category there are many variations, each with specific solder joint concerns and requirements. Relevant variations, joint types and solder processes are detailed in Chapter 2. Figure 1.2 Soldered joints formed between component terminals and copper track on a surface mount assembly printed circuit board \", 'n_tokens': 796, 'document_ids': array([10]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " '2f5ca7ba-3b22-4fdd-b9ae-e330b4e964e6',\n", + " '376b5875-649a-4513-a4aa-cc48a8d2733e',\n", + " '1016f308-5d80-46be-8e84-fe2f01c80c66',\n", + " '6858b6b1-657c-4901-bd45-9e2fedbae425',\n", + " 'fe144ecb-62bc-4c59-b504-59e3202d6784',\n", + " '971b8a47-bf20-400b-8b65-9a2c41fac590',\n", + " 'ca7d96d3-f55c-4765-aecc-4c557de793c8',\n", + " '7cce963a-538c-41a5-8b1b-0bf2b7d6bf26',\n", + " '541c276c-ac8f-478c-89b5-27369ca60357'], dtype=object), 'relationship_ids': array(['c9c1d874-1c75-4447-8441-3296880046cd',\n", + " 'b24b24d9-895f-457b-a8d7-44b9e1882bbf',\n", + " 'a5a92ba0-3d1a-45cf-a254-b1c258a5dc79',\n", + " 'a7772634-a4f3-4504-8114-3f2f36b72cb4',\n", + " '01f66ca3-1a63-4316-8c25-6370ddafa713',\n", + " '0218d2ff-4b39-4bc6-a9f1-a866e4093082',\n", + " 'd9630ea4-1698-4b6e-a968-04e71c6496b4',\n", + " '992e5c5f-7603-4033-b499-ba3efbc39c3a',\n", + " 'a7264c8b-b4ad-4c94-8e61-759cd2855fe6',\n", + " '7ca38ca7-4a3f-42b5-9bb9-eb90c59693c2',\n", + " 'ef35f499-9bf5-4118-bec4-8eb679b7ade2',\n", + " '0ec956c3-cdd9-461b-a397-4c74bbd8cee2',\n", + " '913d92b2-40c2-40d9-82d9-b5707070a749',\n", + " '1dc3479a-a47d-411f-9d8f-81124a2d1be1'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[10]\n", + "document_ids\n", + "{'Index': 11, 'id': '0b867f205500a2c79562e026e65343126e94bfbb00a4a4529a949244b77b6dce3471a1ffd07703ef8883e26b6b65d5bf778e6b121ddf2a3612070e9793f5cea0', 'human_readable_id': 12, 'text': 'PRINTED CIRCUIT BOARD 5 Printed circuit board Electronics assemblies are based on use of a printed circuit board of one form or another, to hold components. Construction of these printed circuit boards is critical to soldering processes, in that different printed circuit board types have different thermal characteristics, which can greatly affect how they must be soldered. In principle, a printed circuit board (PCB), sometimes called a printed wiring board (PWB), or simply printed board, comprises: a base, which is a thin board of insulating material supporting all the components which make up a circuit; conducting tracks, usually copper, on one or both sides of the base making up the interconnections between components. Compo- nent connecting leads are electrically connected in some form of permanent or semi-permanent way, usually by soldering, to lands, sometimes called pads — the areas of track specially designated for component connection purposes. If lands have holes drilled or punched through the board to facilitate component mounting, the board is a through-hole printed circuit board. If lands have no holes the board is a surface mounted printed circuit board. To clarify, the term printed is somewhat misleading, as tracks are not printed directly onto the board. It refers instead to just one stage within the whole printed circuit board manufacturing process, where the conducting track layout, sometimes called pattern or image, may be produced using some form of printing technique. Printed circuit boards can be made in one of two main ways. First, in an additive process, the conductive track may be added to the surface of the base material. There’s a number of ways in which this can be done. Second, in a subtractive process, where base material is supplied with its whole surface covered with a conductive layer, track pattern is defined, and excess conductive material is removed, leaving the required track. Sometimes, both processes may be combined to produce printed circuit boards with more than one layer of conductive track. Printed circuit board types There are three main categories of printed circuit boards: @ single-sided — in which copper track is on just one side of the insulating base material. In a through-hole single-sided printed circuit board (Figure 1.3a), components are situated on the non-track side of the circuit board while their leads go through the through-holes to the other side, where they are soldered to lands. In a surface mounted printed circuit board,\\n\\n6 SOLDERING PROCESS Hole through board Component Component lead / -— Base material Ar Solder” UL Land Hole through board Component | : Component leads Base | J be cg Track material N 6 tallized layers i -_ = b j Land Solder [7 Fe y (b) Plated through: ! holes (vias) ii Component on underside Component Through via RN Buried via Track N i. \\\\ \\\\ Metallized layers“ Solder Blind via Land U Metallized layer (c) Figure 1.3 Three main categories of printed circuit board (a) single-sided: track is present on only one side of the base and components are usually mounted on the other. Component leads connect through holes in the board to lands in the track (b) double-sided: track is on both sides of the board. Components are usually on just one side, but might be on both. Metallized holes or vias through the board are used to connect track on each side (c) multi-layered: tracks are layered and laminated together. Components may be on one or both sides. Vias are used to connect berween layers components — and their leads or terminals — are situated on the same side of the board as the copper track @ double-sided — in which copper track is on both sides of the insulating base material. In a through-hole double-sided assembly, components are', 'n_tokens': 773, 'document_ids': array([11]), 'entity_ids': array(['4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", + " '2f5ca7ba-3b22-4fdd-b9ae-e330b4e964e6',\n", + " '2e94ccbc-39b2-4d60-b3b3-439c432585d1',\n", + " '2e05066a-c303-4404-b7cb-2df794aa0571',\n", + " 'abe5853e-fba8-4e18-8ac9-ddb7ab386254',\n", + " '667a25dd-1844-4784-98a9-85c621f68c73',\n", + " '2a66f7c2-7d27-4327-b1df-4dd38324e0de'], dtype=object), 'relationship_ids': array(['e3353237-814b-4736-bb5f-57411dc61cea',\n", + " '67297d52-b3f4-4760-9602-e4df22c8e9cc',\n", + " '37c7d0f7-1446-4a84-a774-0e32518af8fa',\n", + " '5588affb-72a3-4b06-b5ac-c65e968c7573',\n", + " 'c67e0999-67d8-4acb-988a-49fa73ee23d5',\n", + " '4ffbc362-7c14-4563-a9b0-c9b1288f0d5e',\n", + " '958799e9-27ac-47bf-95e7-3459eea640fc',\n", + " 'fc465597-7bfa-413f-97ad-d07da5893e81',\n", + " '27ed4255-9c4c-44d5-afd3-d23128e8b25e'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[11]\n", + "document_ids\n", + "{'Index': 12, 'id': 'afa73200da7ba51ff2c2552010436ba997ea1359315ff2ed19af30bb41ecaffa1722657c52ecc5e826d7396f5359014ed175532a44181d3219616000b63a1e55', 'human_readable_id': 13, 'text': '6 SOLDERING PROCESS\\n\\nHole through board Component Component lead / -— Base material Ar Solder” UL Land Hole through board Component | : Component leads Base | J be cg Track material N 6 tallized layers i -_ = b j Land Solder [7 Fe y (b) Plated through: ! holes (vias) ii Component on underside Component Through via RN Buried via Track N i. \\\\ \\\\ Metallized layers“ Solder Blind via Land U Metallized layer (c)\\n\\nPRINTED CIRCUIT BOARD 7 usually (though not always) situated on just one side, and soldered on the other (Figure 1.3b). Where through-holes are required to interconnect top and bottom copper track layers, they are plated inside hole barrels with copper, and are called plated through vias. Where a component lead also goes through a via it is called a plated through-hole (PTHs). In a surface mounted double-sided assembly, components are on the same side as boards are soldered. Components may be mounted on both sides of the board. Note, however, a circuit track on one side of the board is not connected to track on the other side unless plated through-holes are used @ multi-layered — in which several circuit track layers are incorporated into a single board, laminated together with insulating layers between each copper layer. (Figure 1.3c). Plated through-holes can be used for either component terminal connection, or purely as electrical connections {in which case they are called vias). Vias passing from one outside track to the other are called through vias, while those connecting internal track layers are called blind, or buried vias. As many as 30 orso layers are typically made into a multi-layered printed circuit board of around 2 mm thickness. Maximum known to the authors is a board with 60 layers, although boards like this are unusual and very costly. Printed circuit board base materials There are many materials used to make printed circuit boards. Generally, for common applications, materials are of thermosetting or thermoplastic plastics, reinforced for rigidity. Reinforcement materials include sheet paper, glass fibre cloth, cotton fabric and nylon. Fillers can be added to influence characteristics. Table 1.1 lists common printed circuit board laminates, according to British Standard BS 4584 and IEC 249 classifications. Where applicable, classifications according tothe commonly known ANS! NEMA LI standard — which, incidentally, does not exist anymore — are also listed for information. To aid clarification of letter codes, Table 1.2 lists codes along with descriptions. Physical and electrical properties of printed circuit board are also standardized by BS 4548 and IEC 249. These are listed in Table 1.3. While the most common material in printed circuit board laminate production is currently woven glass fabric reinforced epoxide resin, it is worth noting that a trend towards flexible polyimide forms of printed circuit boards is taking place in many consumer products — purely for cost purposes. This trend is expected to continue.', 'n_tokens': 634, 'document_ids': array([12]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", + " '2f5ca7ba-3b22-4fdd-b9ae-e330b4e964e6',\n", + " '376b5875-649a-4513-a4aa-cc48a8d2733e',\n", + " '1016f308-5d80-46be-8e84-fe2f01c80c66',\n", + " '94493206-f114-40bc-b604-94211c699494',\n", + " '539b485d-f50b-4ea5-af49-aa695ab6d299',\n", + " '58984dc6-6d47-40f0-b524-840c26f1e605',\n", + " '14a439aa-d30c-49f5-a2e0-39834229ef34',\n", + " 'a2c0a444-c823-486c-83da-9108962bb488',\n", + " 'f2b521ae-5633-482e-97b3-566d23c2b1ab',\n", + " '9780c27b-97f5-4da8-a328-4b8ee7cb767a',\n", + " '6e4c20fc-8a0f-4079-b598-42cfbc1ffda5',\n", + " '849a4bc7-4990-43d6-96ea-c7c4a6dd00a8',\n", + " 'a38c3b8c-cd70-494e-b1c7-68d031b45d50',\n", + " '6393ee7a-eabd-47c5-bf81-f0d232faec86',\n", + " 'f591080a-530f-410f-9c0e-5ec0ac15d3ac'], dtype=object), 'relationship_ids': array(['a34cb6b0-15f5-4223-a5d6-2e0050c37832',\n", + " '8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", + " 'eee8269b-1ccc-4abc-9f66-d0b2e0898525',\n", + " '219c6313-0e8d-46c0-8f3b-8e276cce1d78',\n", + " '45ee10ab-f264-4d64-af1f-cdc970658181',\n", + " 'c6379c2b-92f2-4c17-862f-06a57e3bcb9b',\n", + " 'e9ccdb15-87a1-47f9-91ec-f8718e7f4617',\n", + " '3bb2c48b-8c9d-40e3-96bf-06c3a57ac4ec',\n", + " '5951c936-27b2-4684-b436-ef731c1455b5',\n", + " '332a2299-2d2b-453d-a102-7874fa211715',\n", + " 'a32845b2-2dc6-4d01-8b09-d7df08e2a652',\n", + " '2006abf7-697a-41ed-bd02-fe7761220fcf',\n", + " 'ffcfe70b-aa11-47d2-a9b4-f14d8829d290',\n", + " '069e6dc3-5438-4b46-9419-89ab524803bb',\n", + " 'c38db5cf-c3c3-4c25-8b5d-7670d6b270c1',\n", + " '8f471fbe-c1fa-4dd2-8a06-edfbac2a6d3a',\n", + " '0cb247b7-2512-433c-ac1f-d2f059228753',\n", + " 'a6a841f8-7e90-4570-95d1-e2f7d7817fe2',\n", + " '3bbb70c3-7ad1-4bb0-9578-c766db5bc6b7',\n", + " 'a3958ef5-9e40-46c8-b295-bf7e82fbffed',\n", + " '4757edd6-889b-4c9e-b9f2-da18b698ba13'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[12]\n", + "document_ids\n", + "{'Index': 13, 'id': '86e807f0cd07552efb18b1522b5ebb0f1e29dbafb18ceed16863a0b3a5b419cbc60e1815556c0e98181358e77794b8c03c5d3ec8d5da71105f04d0ca6b64f2c8', 'human_readable_id': 14, 'text': '8 SOLDERING PROCESS Table 1.1 Common printed circuit board laminate materials, listed alpha- betically by BS/IEC laminate code classification. Where applicable, the non- existent NEMA LI 1 classification is also listed . . . . Classification Base materials NEMA LI1 BS 4584/IEC 249 II I im I EP-GC Epoxide resin, woven glass fabric, bonding sheet for multi-layer printed circuit boards Epoxide resin, non-woven EP-GCA-Cu glass filaments in addition to woven glass fabric, copper conductor G-10, G-11, FR-4, Epoxide resin, woven glass EP-GC-Cu FR-5, CEM- 1, fabric, copper conductor CEM-3 X, XP, XPC, XX, Phenolic resin, woven glass PF-CP-Cu XXP, XXPC, XXX, fabric, copper conductor XXXP, XXXPC, FR-2 Polyethylene terephthalate PETP-F (polyester) films, adhesive coated cover sheet for flexible printed circuit boards Polyethylene terephthalate PETP-F-Cu (polyester), flexible, copper conductor PI-F Polyimide film, adhesive coated cover sheet for flexible printed circuit boards Polyimide, flexible, copper PI-F-Cu conductor Si-GC-Cu Silicone resin, woven glass fabric, copper conductor Soldering Soldering is unique in that it provides the functions of mechanical and electrical support cheaply and easily. Solders used for electronics assembly melt at temperatures around 185~ or so, therefore quite simple equipment (a soldering iron, say) can be used to create individual soldered joints. Joints are formed by metallic bonds between the metals in the joint area (usually the copper track of a circuit board and component leads) and the solder. Modern solder is an alloy, usually of tin and lead (although other alloys are occasionally used, and selected impurities may be added to a conventional tin/lead solder to create changes in properties, as required), \\n\\n8 SOLDERING PROCESS\\n\\n.\\n\\n.\\n\\n.\\n\\n.', 'n_tokens': 560, 'document_ids': array([13]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", + " '94493206-f114-40bc-b604-94211c699494',\n", + " '93e7813e-38f4-4829-ab26-38d800c3a3d0',\n", + " 'fccb74a6-7455-4715-a1a5-af20f97e0637',\n", + " '01083577-7bf5-4f4e-be34-b5d324bf42bc',\n", + " '23ada268-7c73-4204-a564-0401851b7f81',\n", + " '43951aac-5f0e-47e3-b932-be4b424eee33',\n", + " '7a87b484-5d29-49e0-b4d8-6a11bfb27ecf'], dtype=object), 'relationship_ids': array(['8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", + " '40352a88-51c2-40e3-8bb9-a4ed5cb2a1b9',\n", + " '6b747922-8cf5-49ea-b003-2102803cc6a3',\n", + " '2c24aac4-cdf1-4e94-b2ba-386288646ff6',\n", + " 'd9584886-82d3-4cff-a117-aa8f9119689a',\n", + " '859f0a2a-2e28-4de7-92f6-42bd8a8d38d9',\n", + " '9fca2d0a-cbfb-4231-b8ec-02ec6ee9ddab',\n", + " '1c9c04ac-2251-4813-977c-7766d2e8db38',\n", + " '0395d320-7f6c-422f-9a3e-61134b592d77',\n", + " '6b399287-be0f-4b58-a0c6-11e724a2e3b8',\n", + " '73323f3e-b0e5-40c3-a596-4ec35da1f06d'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[13]\n", + "document_ids\n", + "{'Index': 14, 'id': '1a59e1c00640a2839652f1862c3b5afd4d510fceb6129128176dd7f45e1f3634871cb63dd617a074f90cf18529362616e6e8cfc4380e9c6cbc3bb934183ff2d1', 'human_readable_id': 15, 'text': 'G-10, G-11, FR-4,\\n\\nX, XP, XPC, XX,\\n\\nXXP, XXPC, XXX,\\n\\nXXXP, XXXPC,\\n\\nfabric, copper conductor\\n\\nSoldering\\n\\nSOLDERING 9 Table 1.2 Letter codes for printed circuit board types NEMA LI1 Description Letter code BS 4584/IEC249 I I II Cellulose paper CP Copper conductor Cu EP Epoxide resin Flexible F Woven glass fabric GC Woven glass fabric with reinforce- GCA ments of non-woven glass filaments Polyethylene terephthalate (polyes- PETP ter) Phenolic resin PF Polyimide PI Silicone resin Si Flame retardant FR Glass fabric reinforced G Punchable, if heated to between 50 P and 80~ PC Cold punchable, above 25~ Paper reinforced, poor electrical X characteristics XX Paper reinforced, fair electrical characteristics Paper reinforced, good electrical XXX characteristics which melts at a lower temperature than either of the metals to be joined this means that joints can be made to metals which form the leads of otherwise quite fragile components. Further, the reasonably low melting point means many joints may be soldered at the same time with little fear of damaging components. On the other hand, where many joints are to be formed simultaneously, equipment becomes rather more elaborate, simply because of the problems associated with handling solder in molten bulk. Note also that lead in solder may not have a very long life. Legislation may exist in the long-term, to prevent the use of lead as a constituent of solder. The process of soldering only occurs on certain surfaces, usually metallic, and does not occur on insulating surfaces- this means solder may be applied in excess. Alternatives to soldering ~ welding, conductive adhe- s i v e s - require much more complex equipment. In the case of welding, the greater heat required to create a welded joint precludes welding many joints en masse. Even welding joints consecutively may damage the component being welded. In the case of conductive adhesives, accuracy is extremely i m p o r t a n t - adhesive will adhere to conductors and insulators alike so if it conducts also, short circuits are probable. ', 'n_tokens': 595, 'document_ids': array([14]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " '2cce6e88-2cf9-4a9e-bd24-cb711029b725',\n", + " '94493206-f114-40bc-b604-94211c699494',\n", + " '539b485d-f50b-4ea5-af49-aa695ab6d299',\n", + " '93e7813e-38f4-4829-ab26-38d800c3a3d0',\n", + " 'fccb74a6-7455-4715-a1a5-af20f97e0637',\n", + " '01083577-7bf5-4f4e-be34-b5d324bf42bc',\n", + " '23ada268-7c73-4204-a564-0401851b7f81',\n", + " '7a87b484-5d29-49e0-b4d8-6a11bfb27ecf',\n", + " '6d3d25a3-eb39-4695-981d-ab271d0e39e2',\n", + " '88b58a69-e708-42be-8ff3-1ee979707da2',\n", + " '82b15790-e102-4110-8a33-1bac8facba56',\n", + " 'c5d69bb9-8b43-4239-a9c6-dea0bb999d63',\n", + " '1c4f4636-ee3d-4bad-8c92-23d372420775',\n", + " '223e031e-2f17-44c5-9f17-64f9d9be8aa0',\n", + " '324ee029-1a64-4ab4-b9df-18612987f0c7',\n", + " 'ca9b8ee4-e16c-4148-9c2b-0d1f9c1acdd0',\n", + " 'bb1cc416-d2dc-462e-a121-5dd775666bcc',\n", + " 'fdc93acc-bff3-45a2-837e-5bae1cfb926a',\n", + " '85509413-24bd-4589-b44b-905d4444731b',\n", + " '55a5f869-e9fc-4abb-bd06-8d1eb8194738',\n", + " 'aae0917e-f034-456e-8762-b4a4db48dcde',\n", + " 'aaa57c8d-ba94-439b-8d0c-62b7e2b96ffa',\n", + " '4a5e3682-73ef-420f-bd35-af99e9276dc8',\n", + " '7dd57760-e886-47e4-a738-dc5516e36c2a',\n", + " 'a294b01d-8ee3-4747-9634-bed3e72332b6',\n", + " 'cb49507f-9f33-43e8-af3e-79c47be0da8f'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", + " '2d350acf-a67b-4201-81c5-de297dfc85fd',\n", + " 'df5be79d-40b1-4cc1-9aed-4d628daf9769',\n", + " '7e09c411-eda6-4d5b-bf1f-db7c02e9fcdd',\n", + " '854eb166-3293-4bd4-8191-b375ab65de9d',\n", + " '9bd122e8-ea17-4de0-82bd-fa334dba7558',\n", + " '1717b061-4b0a-482a-b58c-07136913c93b',\n", + " 'f77de575-5475-4e0a-be04-15ff4a7152c0',\n", + " 'b476171c-19bb-47eb-9c1a-6b7f66773085',\n", + " '6796f568-80df-4fa1-bb53-6078c6e56ec8',\n", + " '9990f77c-9ed8-4e25-8226-21a9d5e40367',\n", + " '40d197ce-e4e6-4c9d-9bd2-a98f73c98b3c',\n", + " '09212d1c-ee31-4d8f-973e-469493d5f3dc',\n", + " '0def4a3d-f583-4475-87b2-b069cf3b036c',\n", + " '8d0a7c45-5ce3-4947-9281-ebf1ef4eb629',\n", + " '82c19143-7d3a-4afc-b0ba-f41404712e50',\n", + " '9b77d87e-8dcd-4e50-8ab3-a74998a27140'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[14]\n", + "document_ids\n", + "{'Index': 15, 'id': '0d7dc0d9676baa2f9771b10139516bef4c57f6e546d2d67d5d46167b846bc4c79bd06505419f3bb5fd9cd0d111e1183040c0ecd491324d60d8fc412f421380c4', 'human_readable_id': 16, 'text': 'SOLDERING 9', 'n_tokens': 5, 'document_ids': array([15]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233'], dtype=object), 'relationship_ids': None, 'covariate_ids': array([], dtype=object)}\n", + "[15]\n", + "document_ids\n", + "{'Index': 16, 'id': 'f556aa8295501d597ea20c10678fc60e0f028ffdb5e687d7b81783b66fac900a5a0d69ec5fb918a79c255b846a950713169e934e7c4388f728840c3e61fe73c9', 'human_readable_id': 17, 'text': \"ments of non-woven glass filaments\\n\\ncharacteristics\\n\\nit conducts also, short circuits are probable.\\n\\ns\\n\\ne\\n\\nt\\n\\na\\n\\n0\\n\\n0\\n\\n0\\n\\n5\\n\\n5\\n\\nn\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\ni\\n\\nm\\n\\na\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\nl\\n\\n0\\n\\n0\\n\\n0\\n\\n5\\n\\n2\\n\\n2\\n\\n0\\n\\n0\\n\\nd\\n\\n1\\n\\n3\\n\\n3\\n\\n2\\n\\n8\\n\\n8\\n\\n8\\n\\n7\\n\\nr\\n\\na\\n\\no\\n\\n5\\n\\n5\\n\\nb\\n\\n7\\n\\n7\\n\\nt\\n\\n9\\n\\n9\\n\\n3\\n\\n9\\n\\n6\\n\\n6\\n\\n6\\n\\n6\\n\\n3\\n\\n7\\n\\ni\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\nu\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\nc\\n\\nr\\n\\ni\\n\\nc\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n7\\n\\n5\\n\\n7\\n\\nd\\n\\n0\\n\\n0\\n\\n1\\n\\n1\\n\\n0\\n\\n1\\n\\n3\\n\\n3\\n\\ne\\n\\n~\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\nt\\n\\n0\\n\\n0\\n\\nn\\n\\ni\\n\\nr\\n\\np\\n\\nd\\n\\n5\\n\\n5\\n\\n5\\n\\na\\n\\n0\\n\\n0\\n\\n1\\n\\n1\\n\\n0\\n\\n1\\n\\n5\\n\\n5\\n\\n,\\n\\nl\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\ni\\n\\n.\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\nc\\n\\n0\\n\\n0\\n\\nn\\n\\no\\n\\n5\\n\\n5\\n\\n5\\n\\nm\\n\\nTable 1.3 Summarized properties of common clad printed circuit board laminates (s} au 8uruang a8vsaan :Aryiqoununp yp (:4UNW) yiSuass xapy (AUN) -1u8 7G] ‘Bunvjd saifo yBuais aag (4UN4) -4U8 ZG] ‘aansodxa iuaajos saifo ysSuaas jaa (,4UNY) U8 ZS] ‘Iway Kap saifo wBuans jaa (UN) ,2u8 ZS] yous way saifo ysSuads jaag (N) M8 Cog ‘yISuads ffo-]Ng (N) 448 ZG] “ys8uadss ffo-rng Papis-aqqnop ‘wu 9°] 13 COE ‘isin dof anjoa a Papis-ap8uis ‘wiu 9°] ‘18 COE ‘simu sof anjoa a Papis-ajqnop ‘arpununy wu gf ',.w3 Cog ‘Mog sof anjpa p Papis-ap8uis ‘appunupy uu g°f ',4u8 Cog ‘Mog sof anjpa p anjDA WNUMIXDU ‘TuasUDdT SSOT anjon wnwixou ‘Apaninasad (wes) anjoa wmurunu ‘X419002a4 pup inay dwop saifo Anausisas aunjor (wasp) anpos unururt ‘4D, 001 40 DoSZI 12 Kyausisas aunjop, (GW) anjoa wnununu ‘k19a02a4 pup ray dwvp saifo auvisisaa aovfing (OW) anjos wn ‘45.001 40 Do$Z] 10 aouvisisas aovfing (Uw) -1u3 CoE 1 ptof fo aaunisisay Laminate 300 300 250 0.9 0.9 0.9 1.1 23 20000 5.5 0.04 100 1000 50000 500 50000 3.5 3.5 EP-GCA-Cu-16 3.5 500 50000 EP-GC-Cu-2 10 10 11 23 0.04 100 20000 5.5 EP-GC-Cu-3 11 23 100 20000 5.5 0.04 0.375 0.375 1,05 1.05 1.05 0.5 10° 10° 100* 1000 15* 3.6 3.5 3.5 3.5 3.5 3.5 PETP-F-Cu-9 82 0.6 0.6 0.6 1.05 1.05 1.05 1.05 1.05 1.05 PF-CP-Cu-5 15 15 10 82 30. 13 «10 «45 = «45 30 13° «10 «64545 0.08 61 5.5 0.06 61 10* 500 7 15* 1000 PF-CP-Cu-6 70 80 1600 100* 1000 PF-CP-Cu-8 PF-CP-Cu-14 PI-F-Cu-10 0.375 0.375 0.5 0.5 10° 105 50000 100 0.7 18 14 63 63 07 15 0.008 23 10000 4 3.5 Si-GC-Cu-13 Notes: Numbers at end of laminate code are serial numbers, indicating the part of BS 4584 which applies. Tests as defined by BS 4584 Part I.\", 'n_tokens': 1200, 'document_ids': array([16]), 'entity_ids': array(['7dd57760-e886-47e4-a738-dc5516e36c2a',\n", + " 'f5c8921c-c699-41de-b3cc-326083603847',\n", + " '3c9dfd31-d15c-4a11-87f5-548fd7559540',\n", + " 'ac29c565-4fb8-406a-b065-2996b10bcd59',\n", + " '0c16c5a2-f649-48a4-9d90-70b60cf67f68',\n", + " 'aed3fac6-3ada-4e29-abb4-f4d84f378e4d',\n", + " '9e8acec3-51dc-4af4-9fba-11ce8c18120e',\n", + " '637c3cca-3d87-4745-8885-8b5cc472820d',\n", + " 'd5fa6976-d479-42cd-b783-7dd116cae248',\n", + " '79cbca31-e454-4ff3-8cc5-405177a28f2d',\n", + " '53fa842c-56d9-43d4-a710-27f4175b5be1',\n", + " '983d6252-0a96-4462-bb84-4f9190ca063a',\n", + " '313aa6b5-9a08-4ad2-b031-dbb3bfa7669b'], dtype=object), 'relationship_ids': array(['79311ffd-af30-450a-a1dd-8f37a1deb783',\n", + " 'f8018f47-0394-4317-b661-c390db5f3845',\n", + " 'ca684eba-c21f-459e-a9ab-5320b44e0eca',\n", + " 'b6d81ed4-b869-4ddf-b17d-bb3c4d700ca6',\n", + " 'f9d70230-f816-4042-b8d3-420ef978bc79',\n", + " '8695c374-f48c-470a-a600-0e4aea031fc9',\n", + " '2ec72e4d-4036-41b2-975a-eaf1b233b18c',\n", + " '51dcdeea-90b3-463b-8de7-dce6cc383c4d',\n", + " '5222b841-f477-4332-8640-d723ab973830',\n", + " '428714ca-463c-4018-8f7a-0f4a7edaaf32',\n", + " 'ebf977b7-3e83-4696-8fa3-058fc0c7c7a4',\n", + " '4407114b-b2d7-4ce5-a4d5-3b4c8cbc89c5'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[16]\n", + "document_ids\n", + "{'Index': 17, 'id': 'de4df10495e8805723fd3fc3e38200e07df57f04af9b050235a7a578aff153ed39c76da505d49cfc248e9824175dbb55710b94c162d098d08fcf7ae160bd4d48', 'human_readable_id': 18, 'text': '-10 0.375 0.375 0.5 0.5 10° 105 50000 100 0.7 18 14 63 63 07 15 0.008 23 10000 4 3.5 Si-GC-Cu-13 Notes: Numbers at end of laminate code are serial numbers, indicating the part of BS 4584 which applies. Tests as defined by BS 4584 Part I. Letter codes as defined in Table 1.2.\\n\\n0\\n\\n0\\n\\n0\\n\\n1\\n\\n1\\n\\n1', 'n_tokens': 122, 'document_ids': array([16]), 'entity_ids': array(['e64be43c-eec3-4b43-9ada-1626c2ae562c',\n", + " 'cee3b8ea-313a-4439-b852-19415641f7be',\n", + " 'f9ad3d3d-9ba7-4808-8fea-4fa02dec8684'], dtype=object), 'relationship_ids': array(['8e9ae737-6718-4295-878c-8dfcbcb0626e',\n", + " 'd37b3443-8010-431f-97ef-eba31cc44e4c',\n", + " 'e0aad12c-be96-4f24-9feb-9ae2018f3fbd',\n", + " '39e5b213-f464-4bc4-9e4a-2c04347a9d24'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[16]\n", + "document_ids\n", + "{'Index': 18, 'id': '56e599f7cd1b7256d3c64ec639f6ce724ab2ad77cd243a35f7aa4f9cd734f0191208bef3db111b9e04355cce8cc3070b09199c0021500ef43760065dbc14160c', 'human_readable_id': 19, 'text': 'm\\n\\n.\\n\\n.\\n\\n1\\n\\n1\\n\\n0\\n\\n0\\n\\no\\n\\nc\\n\\nf\\n\\n0\\n\\n0\\n\\n0\\n\\ni\\n\\no\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n3\\n\\n9\\n\\n9\\n\\n9\\n\\n4\\n\\n4\\n\\n4\\n\\n4\\n\\n6\\n\\ns\\n\\ne\\n\\n.\\n\\ns\\n\\ni\\n\\ne\\n\\nt\\n\\ni\\n\\nr\\n\\n0\\n\\n0\\n\\n0\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n3\\n\\nl\\n\\ne\\n\\np\\n\\n6\\n\\n6\\n\\n6\\n\\n4\\n\\n4\\n\\n4\\n\\n4\\n\\n6\\n\\np\\n\\np\\n\\no\\n\\na\\n\\nr\\n\\nh\\n\\np\\n\\n4\\n\\n4\\n\\n4\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n4\\n\\nc\\n\\n~\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\ni\\n\\nd\\n\\nh\\n\\ne\\n\\nw\\n\\nz\\n\\ni\\n\\n4\\n\\nr\\n\\n8\\n\\n8\\n\\n8\\n\\n3\\n\\n3\\n\\n8\\n\\n3\\n\\n3\\n\\n~\\n\\na\\n\\n8\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n5\\n\\nm\\n\\n4\\n\\nm\\n\\nS\\n\\nu\\n\\n5\\n\\n5\\n\\nB\\n\\n5\\n\\n5\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n~\\n\\nS\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n3\\n\\n3\\n\\n3\\n\\n3\\n\\nf\\n\\no\\n\\nt\\n\\n3\\n\\nr\\n\\n3\\n\\n3\\n\\n3\\n\\n1\\n\\n3\\n\\n1\\n\\n1\\n\\n1\\n\\n.\\n\\na\\n\\n2\\n\\n2\\n\\n2\\n\\n6\\n\\n1\\n\\n6\\n\\n6\\n\\n6\\n\\n2\\n\\np\\n\\ne\\n\\ne\\n\\nh\\n\\n8\\n\\nl\\n\\nb\\n\\n4\\n\\n4\\n\\n4\\n\\nt\\n\\n7\\n\\n6\\n\\n8\\n\\n0\\n\\n7\\n\\n0\\n\\n0\\n\\n0\\n\\na\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\ng\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\nT\\n\\nn\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\ni\\n\\nt\\n\\na\\n\\nc\\n\\ni\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\nd\\n\\n,\\n\\n~\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n5\\n\\n5\\n\\nn\\n\\n5\\n\\n7\\n\\n7\\n\\n4\\n\\n5\\n\\n6\\n\\n4\\n\\n4\\n\\ni\\n\\n,\\n\\ns\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\nr\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\ne\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\nb\\n\\n6\\n\\n6\\n\\n0\\n\\n6\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n,\\n\\n0\\n\\n0\\n\\nm\\n\\n~\\n\\ng\\n\\n1\\n\\n1\\n\\n1\\n\\n~\\n\\n1\\n\\n2\\n\\n2\\n\\n2\\n\\n5\\n\\n5\\n\\n5\\n\\nu\\n\\nn\\n\\nl\\n\\n0\\n\\n0\\n\\n0\\n\\na\\n\\n\"\\n\\n\"\\n\\n0\\n\\n.\\n\\n0\\n\\n0\\n\\n5\\n\\n5\\n\\ni\\n\\n0\\n\\n0\\n\\nP\\n\\nr\\n\\n~\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n,\\n\\n1\\n\\n1\\n\\n.\\n\\ne\\n\\ns\\n\\n.\\n\\ne\\n\\n.\\n\\n.\\n\\n2\\n\\nr\\n\\n.\\n\\n0\\n\\n0\\n\\n0\\n\\n1\\n\\n0\\n\\na\\n\\n.\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n1\\n\\n0\\n\\ni\\n\\nt\\n\\ne\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n.\\n\\n0\\n\\n5\\n\\n5\\n\\nr\\n\\n~\\n\\nd\\n\\ne\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\na\\n\\nl\\n\\no\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\nP\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n.\\n\\nb\\n\\nc\\n\\na\\n\\n4\\n\\n0\\n\\nT\\n\\ne\\n\\n\"\\n\\n\"\\n\\n.\\n\\n8\\n\\n0\\n\\n0\\n\\nt\\n\\n0\\n\\n0\\n\\n0\\n\\n\"\\n\\n\"\\n\\n5\\n\\na\\n\\nn\\n\\n0\\n\\n0\\n\\n5\\n\\n0\\n\\n5\\n\\n0\\n\\n.\\n\\n0\\n\\n.\\n\\n,\\n\\nn\\n\\n4\\n\\n9\\n\\n.\\n\\ni\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n5\\n\\n5\\n\\ni\\n\\nd\\n\\nm\\n\\nS\\n\\ne\\n\\nB\\n\\na\\n\\nn\\n\\nl\\n\\n6\\n\\n5\\n\\ni\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\ny\\n\\nf\\n\\nf\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\ne\\n\\nb\\n\\n3\\n\\n3\\n\\n3\\n\\n3\\n\\n3\\n\\no\\n\\n3\\n\\n3\\n\\n3\\n\\n3\\n\\n3\\n\\nd\\n\\nd\\n\\nd\\n\\ns\\n\\ne\\n\\nn\\n\\na\\n\\nn\\n\\ne\\n\\n6\\n\\ni\\n\\ns\\n\\n1\\n\\nf\\n\\nt\\n\\ne\\n\\n4\\n\\na\\n\\n9\\n\\ne\\n\\n3\\n\\n2\\n\\nd\\n\\n3\\n\\n1\\n\\nu\\n\\nd\\n\\n1\\n\\n6\\n\\n5\\n\\n8\\n\\ns\\n\\ni\\n\\no\\n\\n0\\n\\nu\\n\\nC\\n\\nu\\n\\nr\\n\\nu\\n\\ns\\n\\n1\\n\\nc\\n\\nC\\n\\nu\\n\\nu\\n\\nu\\n\\nu\\n\\nu\\n\\ne\\n\\na\\n\\nC\\n\\nC\\n\\ne\\n\\nC\\n\\nC\\n\\nC\\n\\nC\\n\\nA\\n\\nb\\n\\nr\\n\\nC\\n\\nt\\n\\nu\\n\\ns\\n\\nF\\n\\ne\\n\\nm\\n\\na\\n\\nC\\n\\nC\\n\\nC\\n\\nt\\n\\nt\\n\\nC\\n\\nP\\n\\nP\\n\\nP\\n\\nP\\n\\nC\\n\\ns\\n\\nt\\n\\nn\\n\\n:\\n\\nP\\n\\nu\\n\\nG\\n\\nG\\n\\nG\\n\\ne\\n\\ne\\n\\nC\\n\\nC\\n\\nC\\n\\nC\\n\\ns\\n\\ni\\n\\nG\\n\\nN\\n\\nF\\n\\nT\\n\\nL\\n\\nT\\n\\ne\\n\\nm\\n\\nt\\n\\nP\\n\\nP\\n\\nP\\n\\nE\\n\\nF\\n\\nF\\n\\nF\\n\\nF\\n\\na\\n\\no\\n\\nI\\n\\ni\\n\\nE\\n\\nE\\n\\nE\\n\\nP\\n\\nP\\n\\nS\\n\\nP\\n\\nP\\n\\nP\\n\\nP\\n\\nL\\n\\nN\\n\\nSOLDERING 11 Requirements of the soldering process There are a few important points to be understood when studying the soldering process. In its simplest form, soldering is uncomplicated. Production of a soldered joint requires only that the parts to be soldered are positioned to remain relatively immobile. The surfaces are then', 'n_tokens': 1200, 'document_ids': array([17]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233'], dtype=object), 'relationship_ids': array(['e392a126-318f-42a9-a79b-57c933396592'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[17]\n", + "document_ids\n", + "{'Index': 19, 'id': 'a0c453bc816c51704d6ede3b576507b6ce0fd998fe8bbc7a240d3b23962a0831e8dad3bfa477b88529360bdb9ea4ef01322460768e4b34dd5396d1fc10602d48', 'human_readable_id': 20, 'text': '\\n\\nF\\n\\na\\n\\no\\n\\nI\\n\\ni\\n\\nE\\n\\nE\\n\\nE\\n\\nP\\n\\nP\\n\\nS\\n\\nP\\n\\nP\\n\\nP\\n\\nP\\n\\nL\\n\\nN\\n\\nSOLDERING 11 Requirements of the soldering process There are a few important points to be understood when studying the soldering process. In its simplest form, soldering is uncomplicated. Production of a soldered joint requires only that the parts to be soldered are positioned to remain relatively immobile. The surfaces are then heated to allow coverage with molten solder, and the solder is allowed to cool and solidify. However, controlling this process are five variables: @ flux @ wetting @ heat @ solderable surfaces @ time. Flux In most cases, a substance called flux is used in the process, primarily to clean thesurfaces to be soldered and so aid wetting. However clean they are, all metals (with the exception of the noble metals) oxidize to form an oxide layer on their surfaces. Other tarnish products may occur, too. Presence of any tarnish layer will prevent wetting. Flux reacts with the tarnish layers, leaving a pure base metal surface for the solder to wet. A secondary function of the flux is to reduce the solder’s surface tension, so increasing the solder fluidity and aiding wetting. Another is to protect the metal surface during subsequent heating. Heat Application of heat is a prime requirement of any soldering process: solder has a melting point of, typically, around 185 °C. So, to enable its application, the solder has to be heated to at least this temperature. This can be done, in the three extremes, by: @ heating the joint before solid solder is applied (for example, when hand soldering) @ heating the solder until molten before application to the joint (say, in wave soldering) @ applying solder to the joint, then heating both (say, simple infra-red soldering techniques). While techniques exist formed by just one of the three extremes, many', 'n_tokens': 409, 'document_ids': array([17]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", + " 'f6597ab9-ad3b-40e9-8402-08c0cc2cadc5',\n", + " '1e1d9248-6728-4bb6-8815-5881e3bc8ccf',\n", + " '1d1f23b1-85c7-4713-9237-5252052a1fc0',\n", + " '70a5ae8e-88f6-462f-bc8e-3398563a98b1'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", + " '31e3f92c-3b87-4ba8-9ba4-668c7adb4ab3',\n", + " 'bbe7a523-3103-44aa-9a50-138f7965e1f0',\n", + " '0bdfdb0f-b85d-42d1-a246-c0348befe9b7',\n", + " '0a862684-6405-43e5-b3b3-fd496d659b1c',\n", + " 'ca2e5b46-d130-4981-81f0-6d5184242032',\n", + " 'd8c8a490-eb20-4b1a-8751-ddc4375c4038',\n", + " '953fdc56-f4f1-47f5-86ea-bbd082793226',\n", + " '269b070d-f55c-4be8-83ac-a5e6c1ce7bfa'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[17]\n", + "document_ids\n", + "{'Index': 20, 'id': '65940240cc8ba7ba8a918c0bdb7d4bc7bcc2bc625efcaf67cd8188f2ae96aff8d9781ebf0b3517316db2c377da04986bb9e96289d6ad80a570867d75403fe6a5', 'human_readable_id': 21, 'text': \"SOLDERING 11\\n\\n12 SOLDERING PROCESS soldering processes are elaborate mixtures of two or all three. Note, it is not a prerequisite that the joint be heated prior to application of solder although, for convenience, it often is. Wetting Wetting is the process in soldering where the solder comes into direct metallic contact with the metals to be soldered together into a joint, forming a specific alloy of solder and metal at the junction. In turn, this implies a joint's metallic surfaces should be so clean that metallic contact can be made. Often, the term intermetailic is used to describe the bond which occurs between solder and metal when the solder wets the metal (as in intermetailic bond). This is incorrect: it is, in fact, a strict metallurgic term referring to intermetallic compounds, compounds of elements whose atoms have an so high an affinity that their extremely high affinity for each other ~ presence denies bonding of other elements by other means. To appreciate the difference between intermetallic compounds and alloys it's important to realize that intermetallic compounds have fixed stoichiornetric ratios. Alloys, on the other hand, have ratios of metals which can vary. Wetting occurs when solder comes into intimate contact with the metal atoms. If the metal surface is perfectly clean and metal atoms are present, then the solder wets the metal, forming a bond with the metal atoms at the interface (Figure 1.4). Once this interfacing bond, an intermetallic com- pound as it happens, has been created it cannot be removed. If, on the other hand, the metal is unclean in any way, say, it is oxidized (Figure 1.5) such that metal atoms are not present on the surface, then wetting cannot occur ~ in a s imi lar way to which a drop of water on a greasy surface will remain as a droplet. Figure 1.4 Intimate contact between solder and a metal surface occurs when wetting takes place. An intermetallic compound is formed at the interface between the two \", 'n_tokens': 628, 'document_ids': array([18]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " 'ba9a83b2-feee-4c92-854a-9d1fe90ce2f6',\n", + " '16238137-d2e4-4317-9714-26121f9d0791',\n", + " '6fa7c0df-6ed8-4359-9e01-ed6e7894574a',\n", + " 'fa6d4e6f-287b-482d-857e-d957d01573c1',\n", + " 'c36aa806-38ca-4f03-b719-0e6424439baa'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", + " '52ba87ba-30df-4572-b629-01cea97a8fc8',\n", + " 'bbe7a523-3103-44aa-9a50-138f7965e1f0',\n", + " '10fd896d-d40a-4cca-82ad-38970e91b020',\n", + " 'd5d1d33a-5d97-4b32-bde1-24f923873199',\n", + " '48b9579e-e423-4d5b-9364-e09139329be2',\n", + " '8800987a-ac89-49d5-98eb-0ecc9b8fe66e',\n", + " '97e5386b-eb32-4dd2-a5d2-30fe884ec221',\n", + " '4e3d3993-5ded-4d5b-8c56-fe3be22332cc',\n", + " 'd704fbac-1aeb-456a-982c-7b498d35abda',\n", + " 'e6fbba99-9e7d-4f4f-bd40-a1f2e1cd2611',\n", + " '9ca21521-dccb-46c6-aec1-d3129ee44a9f',\n", + " '6bb3be5b-f292-490c-ac6b-59f30675bb0e'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[18]\n", + "document_ids\n", + "{'Index': 21, 'id': '7667a8c72d42588978049d5ad2bf08a0fa0fbddc88c2fae6ff011dda087c13f87eb2c27a5c84fe55a2ada4ca66f77fc3fc9109cf3b7603a88235095a1d069309', 'human_readable_id': 22, 'text': '12 SOLDERING PROCESS\\n\\nSy ebay. ee Dae aa ee Solder / Interfacing alloy Base material\\n\\nFigure 1.5 If a contaminant such as oxide is present on the metal surface prior to soldering, no intermetallic compound is formed so wetting cannot take place In context with the wetting of metals, two other terms need to be defined. The first is non-wetting, where part or all ofthe metal to be soldered is devoid of solder. Usually this occurs where a contaminant or oxide has been left on the metal surface, so preventing the necessary alloy bond between metal and solder layer. The second is dewetting, where the alloy bond has occurred, but where the solder withdraws from the metal and forms dispersed, irregular droplets. Further solder cannot accumulate due to the high surface tension formed. Where dewetting occurs, it is sometimes difficult to determine; a simple visual check may not be sufficient. Both problems are usually caused by lack of cleanliness, although dewetting can also occur when large amounts of intermetallic compounds form. Cleaning There are two areas in which cleaning may need to take place in the soldering process. First, the metallic surfaces to be soldered together must be perfectly clean, in order that solder can wet the metals involved. Second, residues left after soldering may need to be removed. These are usually cleaning. Both are discussed in Chapter I0. Another pre-assembly area where cleaning is important, often out of the hands of the assembler, is cleanliness during board manufacture. Where an assembler simply buys-in ready-made boards, problems of cleanliness during manufacture may be difficult to isolate, and even more difficult to eliminate. Cleanliness of ready-made boards is of vital importance when \\n\\nSOLDERING 13\\n\\nBase material\\n\\nCleaning', 'n_tokens': 511, 'document_ids': array([19]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " 'ba9a83b2-feee-4c92-854a-9d1fe90ce2f6',\n", + " '849a4bc7-4990-43d6-96ea-c7c4a6dd00a8',\n", + " '16238137-d2e4-4317-9714-26121f9d0791',\n", + " '9feede66-ae26-49d7-a068-820c8276d903',\n", + " 'a91a287b-1981-4430-ab2d-cc5c22ecd17f',\n", + " '54148607-f6c4-411a-8279-f183b9832f75',\n", + " 'b04ef07d-d434-47d4-b07a-3b9162f9c734',\n", + " '77da5373-47d2-4cda-8b58-8d009b14d8fa'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", + " '52ba87ba-30df-4572-b629-01cea97a8fc8',\n", + " '982c3c90-2a0e-485b-9209-c38124f1bda5',\n", + " 'ad9e4d02-04bd-40fe-bb9c-826e6adb16b8',\n", + " 'c4c45d51-c0e1-484d-9c16-e6b976e8581d',\n", + " '55b87631-d7de-4bff-a7aa-3197eda64f49',\n", + " '94b18d2e-a5a0-4a5e-a15e-c222ccd36326',\n", + " 'b8b89be6-9b20-4b6b-974c-b7770df8e86d',\n", + " 'f9f3eeb2-aa28-4d65-951b-bf1fbe777fc2',\n", + " '09f3d4a3-0d12-4c8c-be46-c300d99ef861',\n", + " '38538fc2-a5bb-4bba-97c7-b4dc5de729e2',\n", + " 'fa9d24b7-4534-431d-8f99-9aec4b67ed26'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[19]\n", + "document_ids\n", + "{'Index': 22, 'id': 'dc2e8c15b5d493aae744d85bca7bab1092d1731d5bae9ea33a0a54253a8278901dc3b48cac40d81662101ce96239c8306e09450e4ccb5995003ff1c7b477d188', 'human_readable_id': 23, 'text': '14 SOLDERING PROCESS\\n\\ncertain fluxes (those with little reactional activity) are used. Modern trends indicate greater usage of such fluxes in the future, so clean boards are correspondingly more important. Solderable surfaces Solder will only join certain surfaces. Generally, in electronics assembly, these surfaces are of just one main type of metal\" copper. (Occasionally iron, nickel iron and brass parts are found in assemblies.) Copper is, of course, an Photo 1.1 Non-wetting, showing where copper surface is not wetted at all, so surface is visible (Alpha Metals) Photo 1.2 Dewetting, showing surface which is originally wetted, followed by withdrawal of solder, leaving an alloy bond on the copper surface (Alpha Metals) \\n\\nSOLDERING 15 extremely good electrical conductor and so is ideal for the purpose. It does, however, oxidize fairly easily in air and is generally protected somehow to prevent oxidation (which may prevent soldering taking place) prior to soldering. Ability of a surface to be completely wet by solder is scientifically measured as its solderability and the term is one of the most important in the subject of soldering. In other words, it refers to how well and how uniform the interfacing alloy bond between solder and metal is made. It fol lows that solderabil ity is concerned with every\\'aspect of the soldering process (ie, fluxing, wetting, heating, cleaning), and the main aspects of board manufacture, too (ie, copper plating, tin/lead plating, solder resist application). Further, solderability generally decreases with age, as tarnish- ing of the metals involved occurs naturally in normal atmosphere. One of the major problems of guaranteeing adequate solderability is the difficulty in measuring exactly what solderability is. Not so very long ago, solder joint quality (and hence, solderability of the metals involved) was determined by an over-simple visual check: the joint\\'s brightness and smoothness was thought an indicator of joint quality. Indeed, it sometimes still is. However, modern joints on surface mounted assemblies, say, are Photo 1.3 A computer-controlled solderability tester (Multicore) ', 'n_tokens': 630, 'document_ids': array([20]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", + " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", + " '376b5875-649a-4513-a4aa-cc48a8d2733e',\n", + " '6fa7c0df-6ed8-4359-9e01-ed6e7894574a',\n", + " '50cc1756-bfce-437f-ab0c-ca6368a9e1f9',\n", + " 'f0ce31ec-05fe-4305-8c95-7bfb766c7f18',\n", + " '99a096ae-40fc-406e-8a7d-850b5fc9e14b',\n", + " 'ba50cb78-2373-4e6b-a2ca-0e8e6ee16c06',\n", + " 'adf3db2b-4979-4010-9eb6-62dacbacdb3e',\n", + " '05e26331-0862-46a5-9117-25d6346d22f3',\n", + " 'ecef816c-96fc-42bb-8baa-234980fab402',\n", + " 'd315670e-e20f-4edc-ba59-117ed74ea47e'], dtype=object), 'relationship_ids': array(['8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", + " 'bdb96077-cda0-4f45-8704-fd634f5c37fc',\n", + " '06a68485-55a0-4e2c-aa0d-e0abd343d1f3',\n", + " '6e78c6d8-9344-4d23-bb8b-5e0b34dde0dc',\n", + " '936ac527-fba5-4991-b43e-95000cd6c374',\n", + " 'cae79a00-4197-44a0-bb98-32dee32ce53c',\n", + " '3b9c37b8-3907-429b-9d9f-6a80279a67dd',\n", + " 'f8a46cc2-84e0-49b1-81ef-b83fe1d012f6',\n", + " 'a8b11f29-2bad-4d36-96bf-3435cc7c32c5',\n", + " '4ceba80c-a835-4638-9e4b-906474df120a',\n", + " '503121c9-e402-4105-9ded-2d7cfef85427',\n", + " '19f5ffa5-e765-4c77-97a7-5e6febe8ee58',\n", + " '6facf63d-a0da-44f3-b0da-cedc2783bd93'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[20]\n", + "document_ids\n", + "{'Index': 23, 'id': '155d9f79923dc0333938001f69ec89ab3dcb90695d4882498ad831ca4f9e2a5ef1b31df1420aec6616428310c07e769b5e0aecd2f4ae1872242f48409efbafbb', 'human_readable_id': 24, 'text': \"SOLDERING 15\\n\\n16 SOLDERING PROCESS rarely bright and certainly never smooth, yet are known to be joints of perfect quality. In effect, solder joint quality can never be determined by appearance of the outside layer of the solder. Actual quality is determined solely by what has happened at the interface between the solder and the metal. As this is impossible to view, visual inspection consequently serves little purpose in assuring joint quality. More cohesive tests for solderability and for joint quality are discussed in Chapter 3. Once a board or component is known to have an acceptable solderability, it is usual to coat it with a substance known as a protective coating, in an attempt to maintain solderability. Protective coatings come in many forms, but their simple task is to cover the copper with a layer of material which doesn't oxidize so readily, yet still allows copper to be soldered to. This is only an attempt, note, as no coating can maintain solderability indefinitely. Extent to which solderability de- creases under storage conditions depends primarily on the protective coating used, but also on the storage conditions and the thicknesses of coatings, so estimates of solderable iifespans, that is, shelf-life, can only be approximate. Boards should be re-tested for soiderability after storage, before use. Protective coatings are discussed in Chapter 3. Soldering processes A number of methods exist by which electronics assembly soldering processes may be categorized, the first is whether soldering is performed by hand or by machine. Hand soldering Hand soldering is usually performed alongside hand assembly. It involves use of purpose-built tools and specific operations, which depend primarily on the components being soldered. As a complete process, hand soldering is discussed later in Chapter 7. Machine soldering Machine soldering methods are, very simply, methods to solder compo- nents into or onto a board en masse. For this reason, they are often called mass soldering methods. Primary aim of mass soldering methods is to speed up the manufacture of electronics assemblies. Another method by which soldering processes may be categorized is by the mass soldering process used. There are two main categories of mass soldering processes: \", 'n_tokens': 608, 'document_ids': array([21]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", + " 'bd3a93e3-1708-4b43-a5b6-02c18ddb0329',\n", + " 'c60ab2cf-310c-4a04-a5e2-e66d1d891018',\n", + " '3ada60a3-da51-43db-888e-a9b604db6d0d',\n", + " 'ee7c327a-149f-469a-b850-76aff2a632f9'], dtype=object), 'relationship_ids': array(['4a872177-9a07-4c66-b5af-8f10a7ec36fd',\n", + " '03dbfe81-71c7-4126-a573-23cffe62c1ff',\n", + " '5c54d43d-8b7b-4daf-9fa1-9e9f2dc11240',\n", + " '340dcaf4-c567-40e5-8ebe-29b212e0ba68',\n", + " 'ef7bfd85-5804-4653-8b1e-1c228be2dc17'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[21]\n", + "document_ids\n", + "{'Index': 24, 'id': 'bd395976d923e5edc5ef0d815c8f4233285af367e3fe2dc647e9b3614a3ef71841c8262b9f6ffe0c0a47753420ccd58f455fe951d64e4e505cab488c2fec30c6', 'human_readable_id': 25, 'text': \"16 SOLDERING PROCESS\\n\\nSOLDERING PROCESSES 17 Q those processes which rely on the insertion or onsertion of components prior to application of solder m from here called component/solder (CS) processes m sometimes, graphically, called flow or wave soldering processes Q those processes which rely on the onsertion of components after the application of solder ~ from here called solder/component (SC) processes sometimes called reflow soldering processes. The term reflow is, however, a misnomer as it implies previously molten solder is reheated until molten once more. In many cases a solid form of solder in a paste mixture is used in SC soldering processes which, correctly therefore, cannot be referred to as reflow processes. At this point it's worth reinforcing what we've just stated. We're introducing new terms into an area already crowded with expressions describing various applications and processes in the soldering of electronics assem- blies. All we're trying to do with these new terms is to clarify the complex area. Put simply: all types of soldering processes for all types of assemblies can be categorized in just two groups ~ CS soldering processes and SC soldering processes. CS soldering processes CS soldering processes position components onto the printed circuit board then apply solder. $C soldering processes SC soldering processes, on the other hand, apply solder before positioning components onto printed circuit boards. \\n\\nSOLDERING PROCESSES 17\\n\\n18 SOLDERING PROCESS Figure 1.6 A simple form of dip soldering — lowering and remov- ing the printed circuit board near- horizontally Component/solder (CS) processes There are three main CS soldering processes: @ dip soldering @ drag soldering @ wave soldering. Dip soldering in dip soldering processes the assembled board is fluxed then lowered near- horizontally, into a bath of molten solder as shown in Figure 1.6. Once the lower edge of the board comes into contact with the solder, the board is dropped to a horizontal position on top of the solder. After a suitable period during which the solder achieves wetting over the whole of the areas to be soldered, one edge of the board is lifted (usually the edge which first came into contact with the solder), then the whole board is lifted clear of the bath. Dip soldering suffers from problems in that flux gases are easily trapped under the board and, as a consequence, contact times must be quite tong {about 10 seconds) to ensure adequate wetting and solder temperature must be quite high. Solder Drag soldering By dragging the assembled and fluxed board over the surface of molten solder (illustrated in Figure 1.7), the problems associated with dip soldering processes can be overcome. Consequent contact times are much shorter (about 5 seconds). Wave soldering Wave soldering processes use a pump to create a wave of solder over which the assembled and fluxed board is passed (illustrated in Figure 1.8). Contact times of only 2 to 4 seconds are usual, and required solder temperature is lowered.\", 'n_tokens': 745, 'document_ids': array([22]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", + " '13c0089d-a10b-43e4-976a-eb2329e57a47',\n", + " '611056a8-b545-4b1b-885a-cee47ad71be2',\n", + " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", + " 'c7a23f85-aa84-4f73-9606-9ab32868a4ff',\n", + " '81556df2-1b3e-4fa9-b437-dcedc5993450',\n", + " 'dd197238-87ff-409f-a439-f70554061d50'], dtype=object), 'relationship_ids': array(['8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", + " 'bdb96077-cda0-4f45-8704-fd634f5c37fc',\n", + " '86058b84-eef3-4be0-bbf5-a2403b5768eb',\n", + " '776b4f2a-2196-4eeb-b313-e780ef47a02a',\n", + " '2f4e492e-6764-4fca-a856-20ee572497c6',\n", + " '46375f20-e8ab-4d34-a198-996a5d95ff58',\n", + " '3bbb14b8-d98f-4177-85d0-16ce9a7ee894',\n", + " '9537fab4-3832-46dc-8059-2a00c02b8b8d',\n", + " '859cb208-0c55-4506-b354-28399af29621',\n", + " '196f9a50-8f3c-4dfe-8f73-00e9475f0db6',\n", + " '4036ab47-9164-4ddc-a0f5-924618358602',\n", + " '35f616e6-fc1b-4740-89ee-2b0f374ec19b',\n", + " '7bbe64fc-4e5c-4135-93c9-fbd4b7519bcd',\n", + " '7767f135-2137-4c61-a924-f3d3e327fc60',\n", + " 'bf8f7dcd-342d-4950-8f57-bf3fc520f2ff',\n", + " 'c9bdcc7a-6ca6-4b66-ba0f-8169ef07dd99',\n", + " '9f2d484a-4867-4920-9293-6086155b0ccd',\n", + " '75afd003-cc11-4880-a4ab-408af615af71',\n", + " '90de5891-a438-451a-9716-dc9a04d68c4e'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[22]\n", + "document_ids\n", + "{'Index': 25, 'id': '5fa31e1008aeb700b54ab76abc0406606af242c3269030224415a49948ad12a2c6914301223ce1b8228bfdb861f8021faf6144a8813b10bc42bbf67258573379', 'human_readable_id': 26, 'text': \"18 SOLDERING PROCESS\\n\\nDip soldering\\n\\nSolder\\n\\nFigure 1.7 Drag soldering, in which a printed circuit board is dragged over the surface of molten solder Dip and drag soldering processes are older than wave soldering processes and, although both are still used, neither normally forms the preferred method in most applications. For mass CS soldering, wave soldering techniques are the norm and are discussed in depth in Chapter 7. Figure 1.8 Conveying the board over a wave of solder allows much shorter contact times and lower temperatures w the wave soldering principle Solder/component (SC) processes SC soldering processes are used, primarily, in surface mounting assembly production, where solder and flux are applied as a paste followed by the placement of components and the application of heat (Figure 1.9). SC soldering processes are often termed reflow processes, known as such because the original idea uses a layer of previously applied solid solder which is reheated to cause it to melt, that is, flow, again. Under this light, the term reflow as it is often currently used is something of a misnomer, as we've already discussed. This is simply because solder and flux paste ~ now the normal method of applying solder before components are assembled m in no way can be thought of as solid and \\n\\nSOLDER/COMPONENT/(SC) PROCESSES 19\\n\\nBoard direction\\n\\n——————> Board direction ——» ] 4 Solder wave\", 'n_tokens': 426, 'document_ids': array([23]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " '611056a8-b545-4b1b-885a-cee47ad71be2',\n", + " 'c7a23f85-aa84-4f73-9606-9ab32868a4ff',\n", + " '81556df2-1b3e-4fa9-b437-dcedc5993450',\n", + " 'dd197238-87ff-409f-a439-f70554061d50',\n", + " 'ae7b98e5-bb7b-49e7-95db-6edd737207c8'], dtype=object), 'relationship_ids': array(['3bbb14b8-d98f-4177-85d0-16ce9a7ee894',\n", + " '4036ab47-9164-4ddc-a0f5-924618358602',\n", + " '0209019c-cb4b-4c19-8aca-8f49d1c22cb2',\n", + " '27fcef77-e616-4e37-9b63-ab9ee1e250a1',\n", + " 'f688dcb0-6b7a-4ecb-a5c0-70df9dfe8554',\n", + " 'f21956ee-bf5c-4f81-a17a-fdbe1777c868',\n", + " '33228fa2-099a-4866-9cc3-f01d1cb6e196'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[23]\n", + "document_ids\n", + "{'Index': 26, 'id': 'c801548ef8989f1d2fd264b89f2bf266f61fa15e1ec455420a64fbf52f502b1b93e0eb352c6d1679ff61a04d542620a65726838305ad52b3b926518fca978a08', 'human_readable_id': 27, 'text': \"20 SOLDERING PROCESS\\n\\npreviously molten solder. Further, soldering processes can't be classified simply by the two different assembly types of through-hole and surface mount designs, because some surface mount assemblies use CS processes. Likewise, it is feasible - - though not currently usual - - for some through- hole assemblies to be soldered by SC means. As an aside here, a growing number of large manufacturers such as Motorola and Hewlett Packard are looking to produce mixed surface Figure 1.9 One type of surface mount assembly in which solder is applied, in the form of paste, before components are placed in position. Once assembled, applied heat allows soldered joints to be formed \\n\\nStage 1: application\\n\\nSurface mounted component\\n\\nplacement of components\\n\\npaste turns to solder\\n\\nStage 3: application\\n\\nCLEANING, QUALITY, SAFETY 21 mounted assemblies by wholly SC processes. By 1994, in fact, some intend to have already implemented this, and will no longer use CS wave soldering methods at all. Mass SC soldering techniques are generally categorized by type and direction of applied heat. These are all discussed (including through-hole SC processes) in Chapter 8. Cleaning While cleanliness of electronics assemblies is an asset which all manufac- turers should strive for, never has it been so important as in production of modern densely-populated printed circuit boards. The smaller the compo- nents are which are located on a printed circuit board, and the closer they are together, the harder it becomes to ensure they are totally clean after all manufacturing processes ~ particularly soldering. Environmental concerns regarding the damage which certain chemicals do to the ozone levels in earth's atmosphere has restricted the use of those chemicals. In a short time (ie, by the end of the century, say) those chemicals and indeed some others which may have otherwise been considered as alternatives ~ will not be available for use at all as cleaning agents. Consequently, manufacturers need to ensure cleaning agents which cause no danger to our environment are used in cleaning processes. Chapter 10 discusses this cleaning dilemma in electronics assembly manufacture, and describes all cleaning processes. Quality Given that a circuit is properly designed, component parts are of good quality and printed circuit boards are assembled correctly, then solder processes hold the fundamental key to an assembly's quality. Modern machine soldering equipment is capable of tremendous achievement, much ofwhich is under automatic control. While things work properly and perfect zero-defect assembled printed circuit boards are coming off the production line, everybody's happy. But what happens if things go wrong? How do you tell if a particular fault is related specifically to your solder machine or to peripheral equipment and processes? There are so many variables in production of electronics assem- blies ~ particularly in the soldering process part ~ that it is often not possible to isolate the problem and effect a cure. Answers are not always easy to come by and so for this reason we have attempted to make things just a little less complicated with Chapter 11, \", 'n_tokens': 849, 'document_ids': array([24]), 'entity_ids': array(['f8bc9ce4-e610-4af7-987c-0fac3320e2a1',\n", + " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", + " '2f5ca7ba-3b22-4fdd-b9ae-e330b4e964e6',\n", + " '4d3be32e-83b2-443d-9e2d-d45c0558ed26',\n", + " 'fe144ecb-62bc-4c59-b504-59e3202d6784',\n", + " 'd9ca88b7-9304-4760-908f-c9c277c47e5d',\n", + " '9612f71e-9e5d-4867-8156-8eabd0f1e0e0',\n", + " '3cce9fb6-93e5-4649-9031-fcd5a11e1c2b',\n", + " 'd9e3140a-5652-4b34-bdc7-95f3fdeea4a8',\n", + " 'dbe8dde0-51e7-4fbe-affa-bbe73b494fa5',\n", + " 'b3f18bfe-1e26-4e7f-a6c4-bbb37d2280b8'], dtype=object), 'relationship_ids': array(['fdf7e4b7-380f-47b7-a045-377f3f5ac74f',\n", + " '39c75377-e783-4b6c-bf01-2f5dc454f250',\n", + " '2155e85f-0318-4859-ab60-080015c96f67',\n", + " '00702642-f88f-4a8d-bf1e-a3a3dd668913',\n", + " 'b7c2b1e4-2546-40b6-8e48-cf7955d99d00',\n", + " 'e0a07b46-a117-4b5b-ad9a-4e9c4e7a30a7',\n", + " '006dbd6c-b519-4cf4-a1ef-b05d3c19cca3',\n", + " '91d53082-32f8-4c43-a1ff-4fad4b62ed3b',\n", + " '0aa34bc0-8a71-4ed5-a171-055ab0a59c75',\n", + " '893d2b0d-059e-4903-aa4c-efe069fefacd',\n", + " 'ab2ffdf0-da94-4e92-b939-fb2a3538158a',\n", + " 'e4b28831-b662-4a21-8482-6c8c11fc2da6'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[24]\n", + "document_ids\n", + "{'Index': 27, 'id': '6b0b2c3bf96b8bca3abc216941e36c7c28734f7a54ac88220aafd9b8b012d6f71aacd95ed0a6267bb7445ae5e76d356e7136c30c3f12f8769028ae515b28b602', 'human_readable_id': 28, 'text': 'Cleaning\\n\\nQuality\\n\\n22 SOLDERING PROCESS\\n\\n22 SOLDERING PROCESS which considers the question of solder process quality. In it, some examples are used to illustrate some of the main problems which occur in finished electronics assemblies. We think they form a unique collection of visual aids to assist in the identification of solder process-specific problems. Safety Soldering of electronics assemblies, indeed the whole assembly process, is a potentially dangerous procedure. You have to remember any industrial process can be lethal. Equipment in electronics assembly is often used with solvents which may be poisonous or explosive. Materials used are often flammable. In many assembly processes, particularly soldering itself, heat is a hazard when combined with these solvents and materials. Solder itself is a lead alloy, so can cause lead poisoning. In molten form solder, need we say it, is hot — very hot— usually at temperatures between 200°C and 350°C in, say, operational wave soldering systems! It can severely burn skin, and will burn through non-protective clothing to get to skin. Most equipment is of a mechanical nature, with moving parts: pulleys, sprockets, pumps, chains and so on. Fingers, hair, neckties, bracelets and so on can easily get caught in moving parts. Mechanically, these moving parts are very strong and may not be stopped simply by a trapped person trying to pull out an object caught in the machine. Serious physical injury can result. All equipment is electrically-powered. High voltages are present in various system parts. At best electric shocks make you jump. Often they cause burns and severe bodily harm. At worst they stop the heart and so kill. Safety is of vital concern to all personnel involved in soldering processes. Consequently, in Appendix 3, we consider specific safety aspects: describ- ing hazards and possible effects; suggesting ways to avoid them; and detailing first aid which may be required within the varied aspects of soldering. However, these are only items of immediate interest in soldering processes. It is strongly recommended that relevant and sufficient safety procedures be laid down and closely followed at all stages of electronics assembly. Three highly important points regarding safety throughout manu- facturing are: @ follow suppliers’ manuals and instructions closely @ invest in proper safety training @ keep up-to-date with control of substances hazardous to health regula- tions regarding such aspects as safety, materials use, materials storage.', 'n_tokens': 495, 'document_ids': array([25]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", + " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", + " '04433f72-4317-4aa4-a11b-97a16864a318',\n", + " '03490b81-6b05-4f75-a958-7e63a5fd3d8a',\n", + " '615d107e-b6b2-4fee-a54e-b295ad96fcab',\n", + " 'c48a373c-3a94-4fb1-9d1b-547627ba6cb4',\n", + " '6305c691-3b6f-4cf4-9772-a8028e5bf4a0',\n", + " '47c734d4-5b7e-4167-bc3c-d8d28113ae27'], dtype=object), 'relationship_ids': array(['8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", + " '1a0a2616-b443-44bb-b0b3-7debc3fc381f',\n", + " '1f705ef7-bda6-4fe5-8f5f-af8f7cb2e03e',\n", + " 'cd774195-12ae-4aca-9ba9-d8792dfd2dce',\n", + " '4eaa0201-13f9-42dd-80e3-066e571a4782',\n", + " 'dcc725bd-9ebf-43ba-89b1-ef006c6e2427',\n", + " '69297ee5-ffe5-45fe-a817-307e6f00e4fa'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", + "[25]\n", + "document_ids\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 2 Questions ---\n", + "\n", + "Processing Question 1/2: '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" + ] + }, + { + "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 2/2: '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 Contribution to Peaceful Applications\n", + " ---\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) materials and their properties according to the British Standard BS 4584 and IEC 249 classifications. There is also mention of a now non-existent NEMA LI1 standard [Data: Source unit_text 1a59e1c00640a2839652f1862c3b5afd4d510fceb6129128176dd7f45e1f3634871cb63dd617a074f90cf18529362616e6e8cfc4380e9c6cbc3bb934183ff2d1; Source unit_text 86e807f0cd07552efb18b1522b5ebb0f1e29dbafb18ceed16863a0b3a5b419cbc60e1815556c0e98181358e77794b8c03c5d3ec8d5da71105f04d0ca6b64f2c8].\\n\\nTable 1.2, referenced in multiple sources, provides a description of these letter codes [Data: Source unit_text 1a59e1c00640a2839652f1862c3b5afd4d510fceb6129128176dd7f45e1f3634871cb63dd617a074f90cf18529362616e6e8cfc4380e9c6cbc3bb934183ff2d1; Source unit_text de4df10495e8805723fd3fc3e38200e07df57f04af9b050235a7a578aff153ed39c76da505d49cfc248e9824175dbb55710b94c162d098d08fcf7ae160bd4d48]. However, the content of Table 1.2 itself is not provided in the given data. Therefore, I cannot list the specific letter codes and their meanings.\\n\\nFurthermore, the provided data mentions various laminate materials and their classifications according to BS 4584/IEC 249, including codes like EP-GC, EP-GCA-Cu, EP-GC-Cu, PF-CP-Cu, PETP-F, PETP-F-Cu, PI-F, PI-F-Cu, and Si-GC-Cu [Data: Source unit_text 86e807f0cd07552efb18b1522b5ebb0f1e29dbafb18ceed16863a0b3a5b419cbc60e1815556c0e98181358e77794b8c03c5d3ec8d5da71105f04d0ca6b64f2c8; Source unit_text de4df10495e8805723fd3fc3e38200e07df57f04af9b050235a7a578aff153ed39c76da505d49cfc248e9824175dbb55710b94c162d098d08fcf7ae160bd4d48]. These codes likely represent different combinations of base materials (epoxide resin, woven glass fabric, copper conductor, etc.) used in PCB manufacturing. Again, without the content of Table 1.2, a complete explanation of these codes is not possible.\\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 that letter codes are defined in Table 1.2 in the context of BS 4584 [Data: Sources (17)], Table 1.2 is not included in the provided data. Therefore, I do not have the information necessary to explain the letter codes.\\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='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='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 the development of intelligent machines assisting mankind in peaceful pursuits [Data: Sources (7)]. However, no further details or examples of how this might occur are included in 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 potentially contribute to peaceful pursuits?', answer=\"Soldering's Contribution to Peaceful Applications\\n\\nSoldering plays a vital role in the creation of numerous electronic devices that underpin peaceful applications [Data: Reports (7, 1, 13, 21, 36, +more)]. These devices span various sectors, including communication technologies, healthcare equipment, and educational tools. The process is fundamental to the manufacturing of electronics such as computers, mobile telecommunication devices, and even those used in space travel [Data: Reports (4, 27, 26, +more)]. Reliable soldering joints are critical for the performance and longevity of these technologies, impacting everything from computers and CDs to radio networks [Data: Reports (8, 27)].\\n\\nEnvironmental Considerations and Peaceful Coexistence\\n\\nThe development of lead-free soldering techniques reflects a commitment to environmental sustainability and peaceful coexistence with the planet [Data: Reports (7, 41, +more)]. The shift towards new, environmentally friendly materials, such as lead-free alternatives, contributes to both environmental protection and improved health safety, aligning with broader peaceful goals [Data: Reports (35)].\\n\\n\\nQuality Control and Technological Advancement\\n\\nQuality control measures in soldering, including thorough inspection and any necessary touch-up processes, are crucial for preventing defects and ensuring the dependable operation of electronic devices [Data: Reports (7, 1, 13, 39, +more)]. Furthermore, advancements in soldering techniques and materials contribute to miniaturization and enhanced performance in electronic devices, indirectly supporting peaceful technological advancements [Data: Reports (27)].\\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: 10437\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': 'The answer correctly identifies the relevance o...\n", + "\n", + "Evaluating Row 1: How does soldering potentially contribute to peaceful pursuits?...\n", + "length of prompt: 10444\n", + "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': 'The answer only states that it cannot answer th...\n", + "--- Evaluation Complete ---\n", + "Evaluation results saved to /home/cip/ce/ix05ogym/Majid/LLM/GraphRag/v2/comparision_results.\n", + "\n", + "--- Final Evaluation Results ---\n" + ] + }, + { + "data": { + "image/png": "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EZCCjDGyWu/uZt99950kyWq18sGFJyau/W3dutWxhQCpXNy+sm3bNgdXAtgnrg1v375dJ0+edHA1aQ+hCEghsbGxslgskqT9+/erS5cuGjBggCSCEVJe/PZ17Ngx1a5dW2PGjHFgRUDqFH9fOXr0qJ577jmNGzfOgRUBjyZ+G961a5caN26sWbNm6e+//3ZgVWmPq6MLAJ5G8c8QffHFF9q/f7+io6M1efJkxcbGauzYsbZgFDcdkFzit79x48bp0qVLSpcunQYOHKiIiAgNGTLEwRUCqcO9+8rly5fl7e2tfv36KSIiQoMHD3ZwhcCDxW/DH3/8saKiomSxWPTpp58qJiZGb731lnLkyOHgKtMGQhGQAuLOEA0dOlSTJk3S1KlT1ahRI61cuVKrV69WVFSUPvnkE4IRUkT89vf5559r5syZqly5svbt26cRI0YoOjpaI0aMcHCVgOPF7StDhgzRlClTNGPGDFWoUEF79+7VkCFDFBMTw5cISNXi2vCHH36osWPHatGiRVq+fLm2bdumSZMmyWq1qlu3bsqePbuDK039CEVACrly5Yo2bNigMWPGqFWrVpKk6tWra9q0aZo+fbq8vLz04Ycfymq1yhhj+2ADkkNYWJh++OEHDRo0SE2bNpUkNWjQQLlz51b37t3l6empQYMGObhKwPFCQ0P1ww8/aPDgwWrWrJkkqWHDhsqdO7d69uwpT09P9e/f38FVAvf377//6ttvv1Xv3r3VoEEDSVLdunXl7++vQYMGyRijN998Uzlz5nRwpakbX08DKcTPz08hISE6ffq0bVhQUJC6d++uXLlyafz48bY/tBaLRcYYB1WKp5ExRidOnNDNmzdtw3x8fNSuXTs1btxY77//vj788EMHVgikDnH7SkhIiG2Yr6+vOnTooIYNG2rgwIEaO3asAysE7i/ufqKoqCjbsMjISElS37599dJLL2n69OmaNWuWrly54pAa0wpCEZAMkuo0ITY2Vs8884yOHj2qv/76yzY8ICBAlStXVu3atbVjxw5NnTpVkjhTBLsl1f78/PzUvn17ff/999q/f79tuL+/v4oXL6769etr+PDh+vLLL59kqYBDJbWv+Pv765VXXtF3332nAwcO2IYHBASoePHiev755/X+++9r1qxZT7JUIEn3tmGr1SovLy+VK1dOU6dOVWhoqDw8PGwhKVu2bCpQoIAmT55s6wWXjp6SRigCHlP8e4IOHjyo3377TTdv3pS3t7deffVVbdu2TWPHjtWRI0ck3T3Nffr0aTVt2lRZsmTRxo0bFRMT48hNQBoWv/0dOnRIP/30k+2s4wsvvCBXV1dNmjTJFoxu3bqlo0ePqk2bNuratasWLVqkmzdvcqYST734+8rhw4e1Z88e27gGDRrIarVq4sSJOnjwoKS7+8rx48f1yiuv6LXXXtOCBQv0zz//sK/AYeK34R07dmjXrl36448/JN29pyhbtmyqWrWqrly5ImOMjDE6efKkJkyYoNatW2vQoEGKjIzkPub74J4i4DHFfbgMGDBAM2fOlLe3t1xcXLRy5Uo9++yzWrJkiTp37qzffvtNbm5uun37tm7duqVly5bp1q1b+uqrrxQZGSlvb28HbwnSorj2169fP82bN0+RkZHKli2bPv/8cz333HP6559/9Nlnn6l58+YqUKCArl69KqvVquDgYF28eFE7d+5UunTpOFOJp178fWX+/Pn6999/lStXLk2ePFl16tTRP//8o8mTJ6tp06YqVKiQLl++LKvVqo4dO+rcuXP66aef2FfgMPF7mevbt68WL16skJAQVahQQS1btlT37t01Z84cvf766ypcuLBKlCih69evKyoqSpUrV9bRo0e1Y8cO2u8DEIoAO8X/xmb79u1avHixFi9erDt37mjWrFl69tlntWbNGtWtW1fffPONdu7cqYMHDyp79ux67733JEm//vqrihYtKldXdkU8mpiYGLm4uEiSvvnmG61bt05z5sxRjhw51KdPH3Xu3FkTJ05U8+bNVaxYMe3du1c7d+7U888/r969e0uSTp48qQIFCig6Olru7u6O3BwgxcTfV9atW6e1a9dq1qxZypYtm9555x117txZkyZNUsuWLVWsWDH9/PPP2rVrl5577jm9++67kqQzZ86oYMGCio6OlpubmyM3B04m7pmHcWFmz5492rRpk1asWKGIiAgtXrxYM2fOVGRkpPr06aMff/xREydO1D///CM3Nzf169dPVqtVe/bsUdasWfm8fwCL4Tww8Eju7UJ7ypQpkqTw8HDbH9CwsDB169ZNq1ev1tq1a1WzZs0Eyzh+/Lhmz56tL7/8Utu3b1eJEiWe3AYgTbty5YoyZcpkez1//nydP39eVqs1QQ9ZTZs21eHDhzVx4kS9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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "graph_rag_comparision = GraphRagComparision(root_dir=ROOT_DIR, temperature=TEMPERATURE_SETTING)\n", + "\n", + "evaluation_results = await graph_rag_comparision.answer_questions(\n", + " questions=questions_to_evaluate,\n", + " sleep_interval=5 \n", + ")\n", + "print(evaluation_results)\n", + "graph_rag_comparision.compare_answers(evaluation_results,\n", + " )\n", + "print(f\"Evaluation results saved to {graph_rag_comparision.compare_dir}.\")\n", + "\n", + "graph_rag_comparision.plot_comparision_results()\n", + "\n", + "print(\"\\n--- Final Evaluation Results ---\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "b12bed18", + "metadata": {}, + "source": [ + "## 4. Visualize Results\n", + "- The `plot_comparision_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": [ + { + "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", + "
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. ...## Letter Codes in the Context of BS 4584\\n\\nT...
1How does soldering potentially contribute to p...I cannot answer this question. The provided t...The provided text mentions soldering's role in...Soldering's Contribution to Peaceful Technolog...
\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", + "\n", + " RAG \\\n", + "0 Based on the provided text, several tables lis... \n", + "1 I cannot answer this question. The provided t... \n", + "\n", + " Graph RAG (Local) \\\n", + "0 I'm sorry, but I cannot answer your question. ... \n", + "1 The provided text mentions soldering's role in... \n", + "\n", + " Graph RAG (Global) \n", + "0 ## Letter Codes in the Context of BS 4584\\n\\nT... \n", + "1 Soldering's Contribution to Peaceful Technolog... " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "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", + "
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 correctly identifies the relevant t...4The answer explores different aspects related ...6The answer empowers the reader by explaining t...7The answer directly addresses the question by ...7
11How does soldering potentially contribute to p...I cannot answer this question. The provided t...The answer provides no information whatsoever ...0No diversity of perspectives or insights are o...0The answer does not empower the reader in any ...0The answer directly states it cannot answer th...0
\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", + "\n", + " answer \\\n", + "0 Based on the provided text, several tables lis... \n", + "1 I cannot answer this question. The provided t... \n", + "\n", + " comprehensiveness_reason comprehensiveness_rating \\\n", + "0 The answer correctly identifies the relevant t... 4 \n", + "1 The answer provides no information whatsoever ... 0 \n", + "\n", + " diversity_reason diversity_rating \\\n", + "0 The answer explores different aspects related ... 6 \n", + "1 No diversity of perspectives or insights are o... 0 \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 in any ... 0 \n", + "\n", + " directness_reason directness_rating \n", + "0 The answer directly addresses the question by ... 7 \n", + "1 The answer directly states it cannot answer th... 0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "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", + "
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 is very limited. It only acknowled...1No diversity is present; the response simply s...0The answer does not empower the reader; it sim...0It directly states it cannot answer the questi...1
12How does soldering potentially contribute to p...The provided text mentions soldering's role in...The answer mentions a vague connection between...2The answer offers limited diversity, mainly co...3The answer provides minimal empowerment. While...2The answer indirectly addresses the question b...3
\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", + "\n", + " answer \\\n", + "0 I'm sorry, but I cannot answer your question. ... \n", + "1 The provided text mentions soldering's role in... \n", + "\n", + " comprehensiveness_reason comprehensiveness_rating \\\n", + "0 This answer is very limited. It only acknowled... 1 \n", + "1 The answer mentions a vague connection between... 2 \n", + "\n", + " diversity_reason diversity_rating \\\n", + "0 No diversity is present; the response simply s... 0 \n", + "1 The answer offers limited diversity, mainly co... 3 \n", + "\n", + " empowerment_reason empowerment_rating \\\n", + "0 The answer does not empower the reader; it sim... 0 \n", + "1 The answer provides minimal empowerment. While... 2 \n", + "\n", + " directness_reason directness_rating \n", + "0 It directly states it cannot answer the questi... 1 \n", + "1 The answer indirectly addresses the question b... 3 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "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", + "
answer_numberquestionanswercomprehensiveness_reasoncomprehensiveness_ratingdiversity_reasondiversity_ratingempowerment_reasonempowerment_ratingdirectness_reasondirectness_rating
03What are letter codes in the context of BS 4584?## Letter Codes in the Context of BS 4584\\n\\nT...The answer mentions examples of codes (si-gc-c...3The answer provides a limited perspective, foc...2The answer provides some context by linking th...3The answer directly addresses the question by ...5
13How does soldering potentially contribute to p...Soldering's Contribution to Peaceful Technolog...This answer provides a comprehensive overview ...9The answer demonstrates good diversity by high...8The answer effectively empowers the reader by ...9The answer directly and clearly addresses the ...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", + "\n", + " answer \\\n", + "0 ## Letter Codes in the Context of BS 4584\\n\\nT... \n", + "1 Soldering's Contribution to Peaceful Technolog... \n", + "\n", + " comprehensiveness_reason comprehensiveness_rating \\\n", + "0 The answer mentions examples of codes (si-gc-c... 3 \n", + "1 This answer provides a comprehensive overview ... 9 \n", + "\n", + " diversity_reason diversity_rating \\\n", + "0 The answer provides a limited perspective, foc... 2 \n", + "1 The answer demonstrates good diversity by high... 8 \n", + "\n", + " empowerment_reason empowerment_rating \\\n", + "0 The answer provides some context by linking th... 3 \n", + "1 The answer effectively empowers the reader by ... 9 \n", + "\n", + " directness_reason directness_rating \n", + "0 The answer directly addresses the question by ... 5 \n", + "1 The answer directly and clearly addresses the ... 9 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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pZdYuXIlPj4+dOvWjTNnzvD4448THh5e0UWvNlRVZd++fZw7dw6LxcKWLVu4dOkS9erV45lnniElJYVTp07Ro0cPcnNz6d+/P02bNq3SJzpy6biaczgcFBUVsWDBAvr160dSUhJff/01r732GtHR0aSmplKrVi20Wi1Op1PGkf2LSua5LCgoYOHChXTv3p0rV66wfPlyXnnlFeLi4khLSyMqKgpFUVBVVeq2Eig53JnNZrZs2UJxcTHt2rVjypQpDBgwgIEDB5KdnY2Pjw/e3t44HA60Wm2VPshXNiV9Gc6fP8/GjRsZNmwYS5YswcPDg7Fjx2KxWNBqtQQGBuJ0OqvFVSAJ2mrK4XBw4MABnE4nly9fxs/Pj6+++ooXX3zRNa3VtGnT8PDwAKrPg+Hlwel0snfvXvR6PQkJCXh5ebF+/XrGjRtHdnY23377Le+++y5eXl6A1G1loaoq58+fp6CggFOnTnHbbbexePFiunbtStu2bXnvvfd44oknaNGihSuQZd+VnZKrQIcOHeLq1avExMSwc+dOnE4n9957L8uXL6du3brcd999rnqvLvUv17GqoZKDxIEDBxg/fjyenp706NGDkSNHMmPGDOLi4njllVdcE2hXly9zeSi59Hjo0CGefPJJQkND6dOnD4MHD2bOnDmEhYXxyiuv4OnpCUjdVjbFxcWMGzeOhIQEmjVrxksvvcS2bdvYt28fb731FvHx8a75smXfucfHH3/MmjVruP3223nyySfRarWsWLGCMWPG0LdvX1fdV6f6l6CtZq7tyde7d2/uuecefv75ZzIyMujQoQP33XcfOTk51KpVq1p9kcvDf9ft0KFDWb9+PQUFBXTr1o27774bi8XiulwsKoeSkyOn00ndunV59tlnSUxM5MSJE8TExPDMM8/gcDgIDAzE29u7ootb7Vw74pO3tzfPPPMMQUFBfP/99+j1eh544AHq1KmD0WgkICCgoovrFnLpuBq59hGetWvXujp0/PDDD5w6dQpfX18GDRpEq1atqt0Zo7uV1G1ycjJr167FaDQyYMAANmzYwOHDhwkNDWXAgAFSt5VQSe/wb775htTUVHr37k1RURHz58+nWbNmeHp68sgjj6DX62W/uUHJSc6PP/7IwYMHadeuHfHx8UydOpVatWphtVp54YUX8PPzA6rnVSAJ2mri2vF1p06dSps2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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "graph_rag_comparision.print_comparision_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_comparision/comparision_prompt.py b/examples_notebooks/community_contrib/graphrag_comparision/comparision_prompt.py new file mode 100644 index 0000000000..9814cd3789 --- /dev/null +++ b/examples_notebooks/community_contrib/graphrag_comparision/comparision_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_comparision/graphrag_comparision.py b/examples_notebooks/community_contrib/graphrag_comparision/graphrag_comparision.py new file mode 100644 index 0000000000..fed3d772d3 --- /dev/null +++ b/examples_notebooks/community_contrib/graphrag_comparision/graphrag_comparision.py @@ -0,0 +1,585 @@ + +import pandas as pd +import tiktoken +from json_repair import loads +from comparision_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 GraphRagComparision: + + # 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("comparision_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_comparision_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('comparision_plot.png'), bbox_inches='tight') + + + def print_comparision_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('comparision_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_comparision = GraphRagComparision(root_dir=ROOT_DIR, temperature=TEMPERATURE_SETTING) + + evaluation_results = await graph_rag_comparision.answer_questions( + questions=questions_to_evaluate, + sleep_interval=5 + ) + print(evaluation_results) + graph_rag_comparision.compare_answers(evaluation_results, + ) + print(f"Evaluation results saved to {graph_rag_comparision.compare_dir}.") + + graph_rag_comparision.plot_comparision_results() + + print("\n--- Final Evaluation Results ---") + + + asyncio.run(main()) \ No newline at end of file From b8269dc8aa8341412d086a817a357cc71236f5e8 Mon Sep 17 00:00:00 2001 From: majidsh97 Date: Sat, 12 Apr 2025 21:24:50 +0200 Subject: [PATCH 5/5] remove comparison --- ...compare_rag_localsearch_globalsearch.ipynb | 1315 ----------------- .../comparision_prompt.py | 210 --- .../graphrag_comparision.py | 585 -------- 3 files changed, 2110 deletions(-) delete mode 100644 examples_notebooks/community_contrib/graphrag_comparision/compare_rag_localsearch_globalsearch.ipynb delete mode 100644 examples_notebooks/community_contrib/graphrag_comparision/comparision_prompt.py delete mode 100644 examples_notebooks/community_contrib/graphrag_comparision/graphrag_comparision.py diff --git a/examples_notebooks/community_contrib/graphrag_comparision/compare_rag_localsearch_globalsearch.ipynb b/examples_notebooks/community_contrib/graphrag_comparision/compare_rag_localsearch_globalsearch.ipynb deleted file mode 100644 index 8f329d6c78..0000000000 --- a/examples_notebooks/community_contrib/graphrag_comparision/compare_rag_localsearch_globalsearch.ipynb +++ /dev/null @@ -1,1315 +0,0 @@ -{ - "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_comparision\n" - ] - } - ], - "source": [ - "import os\n", - "import sys\n", - "print(os.getcwd())\n", - "sys.path.append(os.getcwd())\n", - "from graphrag_comparision import GraphRagComparision\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "8b4d141e", - "metadata": {}, - "source": [ - "## 2. Define Questions for Comparision\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": null, - "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 Comparision\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": 5, - "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", - "{'Index': 0, 'id': '7d3ffa016246a868526b8eec181583b31e3a81d21bdc8e3ad63fab473bb54b97351e6029949ea17fe118e6bfe3ae744f830092406537f6a12eba07a1903c5c8a', 'human_readable_id': 1, 'text': \"6G a®*: s +. i 2 a <, s e Ged SECOND EDITION\\n\\nSoldering in Electronics Assembly\\n\\nThis Page Intentionally Left Blank\\n\\nSoldering in Electronics Assembly Mike Judd and Keith Brindley Newnes \\n\\nNewnes\\n\\nNewnes An imprint of Butterworth-Heinemann Linacre House, Jordan Hill, Oxford OX2 8DP 225 Wildwood Avenue, Woburn, MA 01801-2041 A division of Reed Educationa and Professional Publishing Ltd RQ A member of the Reed Elsevier plc group First published 1992 Second edition 1999 © Mike Judd & Keith Brindley 1992, 1999 All rights reserved. No part of this publication may be reproduced in any material form (including photocopying or storing in any medium by electronic Means and whether or not transiently or incidentally to some other use of this publication) without the written permission of the copyright holders except in accordance with the provisions of the Copyright, Design and Patents Act 1988 or under the terms of a licence issued by the Copyright Licensing Agency Ltd, 90 Tottenham Court Road, London, England W1P 9HE. Applications for the copyright holders’ written permission to reproduce any part of this publication should be addressed to the publishers. British Library Cataloguing in Publication Data A catalogue record for this book is available from the British Library Transferred to digital printing 2006 ISBN 0 7506 35452 Printed and bound by Antony Rowe Ltd, Eastbourne a Typeset and produced by Co-publications, Loughborough POR EVERY TITLE THAT WE PUBLISH, BUTTERWORTH -HEINENANN ‘WILL PAY FOR BTCV TO PLANT AND CARE FOR A TREE.\\n\\nContents Foreword Preface Acknowledgements 1 Soldering process Time on its side Printed circuit board Soldering Soldering processes Component/solder (CS) processes Solder/component (SC) processes Cleaning Quality Safety 2 Electronics assemblies Joints Through-hole joints Surface mounted components Surface mounted joints Assembly variations Assembly classification 3 Solder Metallurgical properties of tin/lead alloys The soldered joint Solderability Protective coatings 4 Lead-free solder What's needed in the future? Lead-free soldering- now a hot topic! The age of lead-free soldering is approaching fast ITRI 5 Flux Need for flux How fluxes work Categorization of fluxes Choosing a flux Application of fluxes SC soldering process flux 6 Solder paste Solder paste or adhesive application Dispensing Pin transfer Using solder paste Solder paste parameters 7 CS soldering processes Hand soldering Mass CS soldering processes Inert atmosphere soldering Handling assemblies Solder pots and pumps Solder pot heaters Soldering Soldering process monitoring vii ix xiii 1 2 5 8 16 18 19 21 21 22 23 23 27 35 36 43 49 51 51 56 66 72 81 81 83 87 88 89 9O 91 92 98 99 107 109 109 118 122 123 124 127 127 134 136 136 146 147 148 163 \", 'n_tokens': 791, 'document_ids': array([0]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", - " 'f8bc9ce4-e610-4af7-987c-0fac3320e2a1',\n", - " 'e952e1ef-2084-447b-873c-11a506d2e102',\n", - " '8003f3bd-9f55-44b8-ab53-52d74eec0ac5',\n", - " '13c0089d-a10b-43e4-976a-eb2329e57a47',\n", - " '611056a8-b545-4b1b-885a-cee47ad71be2',\n", - " 'ba9a83b2-feee-4c92-854a-9d1fe90ce2f6',\n", - " '2057e211-2cb1-4797-8a8a-38759089f686',\n", - " '7c41c47a-f47e-4e3e-8a0b-7a5ea5febf5d',\n", - " '388162ba-01b5-4daf-8f65-6655b2b149bd',\n", - " '22e0f524-c864-4fe0-af15-c86238c23da1',\n", - " 'fa219be6-faee-48c6-8d6d-f4e194979914',\n", - " 'bd3a93e3-1708-4b43-a5b6-02c18ddb0329',\n", - " 'de05b0d0-ba24-4956-b678-f5a5c3d933dd',\n", - " 'eb5e09f7-c3ee-46f6-aea5-504410b47dc1',\n", - " '27883d1a-c69a-4720-bbbe-b6c8629949f1',\n", - " '495d549f-5afb-4f71-b57e-10bd2221a683',\n", - " '5bf56cb9-b4d3-4b58-b60c-a10f931f85ea',\n", - " '9683a1d3-c348-46d1-9f4f-2fba6488fcbf',\n", - " '37a01771-b6d5-47a5-865c-935eb3455dde',\n", - " '1b8b1726-f5eb-408a-bb60-f154ac1a641e',\n", - " '0352909a-429e-44f0-afd3-005439bf5b69',\n", - " 'ac466ecc-8434-4bb6-8d24-a573225bf7d1',\n", - " 'a639de25-536f-4013-9236-95fdf640b6c0',\n", - " 'be165139-18e7-452e-979b-9df06d8cd7e7'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", - " '31e3f92c-3b87-4ba8-9ba4-668c7adb4ab3',\n", - " '45159296-5abb-4502-84ef-1c05e0cef833',\n", - " 'cf4a050f-daa1-4982-8f47-b67c2394bba6',\n", - " '0c67c26a-1743-48e4-bd22-5df18f23713e',\n", - " '2a1f6681-8e33-4399-a683-d32d9c92220f',\n", - " '52ba87ba-30df-4572-b629-01cea97a8fc8',\n", - " '2f6fc2b8-4252-4bec-87b8-738c43102ff7',\n", - " '1e5fe333-7ff9-4d91-ac92-be4de964e71c',\n", - " 'c361fb6f-7dbf-467b-adc6-ec0569264b74',\n", - " '9c017557-6d8e-4269-a16c-87f6bbfaaf78',\n", - " '4a872177-9a07-4c66-b5af-8f10a7ec36fd',\n", - " '0db19ffd-925e-45a4-bf34-bd8fa784d488',\n", - " 'c940d07a-ee4f-4035-9fb7-58068725d1f1',\n", - " 'f8df0954-2534-4233-81cb-0ee8b1412066',\n", - " '430337c7-46ca-42c8-92fb-6141bca2532b',\n", - " '3ab2a46a-668f-4523-9b78-a004d8ab7587',\n", - " 'f2b195de-15ec-436c-903c-140f3a557105',\n", - " 'c4a0bb98-068e-4541-9231-9baa025b73c2',\n", - " '733ae557-9b8c-4b57-81a4-64230097b24b',\n", - " '490b32aa-7019-4da0-8a83-083c2e8276ba',\n", - " 'fb48a435-440b-4c52-96f3-0d70c8efbbd2',\n", - " '50d5a820-5a96-48b5-8186-7a6ce3172082',\n", - " '587c8805-3091-4f02-b768-8080ab2e35aa',\n", - " '8ae4683a-3222-4c18-afcb-749a383f51e1'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[0]\n", - "document_ids\n", - "{'Index': 1, 'id': '14f4fff73279d8f8977a09b19e81c9d7e77b01d29d1bf76d1381eb15668aec855b2f2ded0b8d102c47f6e913e215358918d718ab28c32b448d5f7471035278a7', 'human_readable_id': 2, 'text': \"Foreword\\n\\nPreface\\n\\nAcknowledgements\\n\\n1 Soldering process\\n\\nTime on its side\\n\\nPrinted circuit board\\n\\nSoldering\\n\\nSoldering processes\\n\\nComponent/solder (CS) processes\\n\\nSolder/component (SC) processes\\n\\nCleaning\\n\\nQuality\\n\\nSafety\\n\\n2 Electronics assemblies\\n\\nJoints\\n\\nThrough-hole joints\\n\\nSurface mounted components\\n\\nSurface mounted joints\\n\\nAssembly variations\\n\\nAssembly classification\\n\\n3 Solder\\n\\nMetallurgical properties of tin/lead alloys\\n\\nThe soldered joint\\n\\nSolderability\\n\\nProtective coatings\\n\\n4 Lead-free solder\\n\\nWhat's needed in the future?\\n\\nLead-free soldering- now a hot topic!\\n\\nThe age of lead-free soldering is approaching fast\\n\\nITRI\\n\\n5 Flux\\n\\nNeed for flux\\n\\nHow fluxes work\\n\\nCategorization of fluxes\\n\\nChoosing a flux\\n\\nApplication of fluxes\\n\\nSC soldering process flux\\n\\n6 Solder paste\\n\\nSolder paste or adhesive application\\n\\nDispensing\\n\\nPin transfer\\n\\nUsing solder paste\\n\\nSolder paste parameters\\n\\n7 CS soldering processes\\n\\nHand soldering\\n\\nMass CS soldering processes\\n\\nInert atmosphere soldering\\n\\nHandling assemblies\\n\\nSolder pots and pumps\\n\\nSolder pot heaters\\n\\nSoldering\\n\\nSoldering process monitoring\\n\\nvii\\n\\nix\\n\\nxiii\\n\\n1\\n\\n2\\n\\n5\\n\\n8\\n\\n16\\n\\n18\\n\\n19\\n\\n21\\n\\n21\\n\\n22\\n\\n23\\n\\n23\\n\\n27\\n\\n35\\n\\n36\\n\\n43\\n\\n49\\n\\n51\\n\\n51\\n\\n56\\n\\n66\\n\\n72\\n\\n81\\n\\n81\\n\\n83\\n\\n87\\n\\n88\\n\\n89\\n\\n9O\\n\\n91\\n\\n92\\n\\n98\\n\\n99\\n\\n107\\n\\n109\\n\\n109\\n\\n118\\n\\n122\\n\\n123\\n\\n124\\n\\n127\\n\\n127\\n\\n134\\n\\n136\\n\\n136\\n\\n146\\n\\n147\\n\\n148\\n\\n163\\n\\nvi\\n\\n8 SC soldering processes Heat application Infra-red soldering Hot air convection Hot vapour soldering Laser soldering Light beam soldering Heated collet or hot bar Miscellaneous SC soldering processes Comparison of soldering processes 9 Profiling soldering processes Profiles Infra-red soldering temperature profiles Hot vapour soldering temperature profiles Heated collet temperature profiles Optimizing temperature profiles 10 Cleaning soldered assemblies The Montreal Protocol Why clean at all? Contamination Classifications of cleaner Cleaning processes Contamination testing Comparing the cleaning options Avoiding problems -soldering quality 1 1 Have problems occurred? Statistical process control Solutions to problems Criteria for the assessment of soldered joints Characteristics of soldered joints Classification of soldered joints Features of solder joints on surface mounted boards X-ray inspection Visual inspection standards Photographic guide to defects 12 Standards & specifications Why comply with standards Reference to standards Levels of standards Standards organizations and bodies Standards for electronics assembly manufacture Guide to relevant worldwide standards Glossary References Further reading Worldwide addresses Appendix 1 Why not blame the machine? Appendix 2 Problems & solutions Appendix 3 Soldering safety Appendix 4 Comparing soldering processes & machines Index 165 165 167 173 174 178 182 182 185 186 187 187 192 193 194 195 199 199 200 2 02 2 04 208 21 8 22 1 223 224 224 227 228 229 230 230 232 235 236 275 275 2 76 2 76 277 2 80 283 299 31 1 31 3 323 333 339 343 361 366 \", 'n_tokens': 830, 'document_ids': array([1]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", - " 'f8bc9ce4-e610-4af7-987c-0fac3320e2a1',\n", - " '8003f3bd-9f55-44b8-ab53-52d74eec0ac5',\n", - " '13c0089d-a10b-43e4-976a-eb2329e57a47',\n", - " '611056a8-b545-4b1b-885a-cee47ad71be2',\n", - " 'ba9a83b2-feee-4c92-854a-9d1fe90ce2f6',\n", - " '22e0f524-c864-4fe0-af15-c86238c23da1',\n", - " 'fa219be6-faee-48c6-8d6d-f4e194979914',\n", - " 'bd3a93e3-1708-4b43-a5b6-02c18ddb0329',\n", - " 'de05b0d0-ba24-4956-b678-f5a5c3d933dd',\n", - " 'eb5e09f7-c3ee-46f6-aea5-504410b47dc1',\n", - " '27883d1a-c69a-4720-bbbe-b6c8629949f1',\n", - " '495d549f-5afb-4f71-b57e-10bd2221a683',\n", - " '0352909a-429e-44f0-afd3-005439bf5b69',\n", - " 'ac466ecc-8434-4bb6-8d24-a573225bf7d1',\n", - " 'a639de25-536f-4013-9236-95fdf640b6c0',\n", - " 'be165139-18e7-452e-979b-9df06d8cd7e7',\n", - " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", - " '2f5ca7ba-3b22-4fdd-b9ae-e330b4e964e6',\n", - " 'b427ea2e-64f4-4161-84fc-7dd16dba7f13',\n", - " '41915d84-d583-4ddf-a00e-4fd0ff4ce5c5',\n", - " '3dc411c3-fd19-4003-99e3-a1722276d830',\n", - " '47e5c563-f98b-4222-b35e-f269e0f4350e',\n", - " '392d7299-540d-4c35-ba4a-324012ff3a7f',\n", - " '15d87b31-6e6b-4e5c-a983-e0ca5b70d01d',\n", - " 'aadc1a35-ec28-4d1c-ab4b-4494f6579166',\n", - " '6b6ec3fc-c0e2-4838-b103-5e4c052dc856',\n", - " 'a10e633f-cf08-4f79-bbe2-c11d402c6035',\n", - " 'eebe25d2-690d-47ac-a146-448df85e18d9',\n", - " 'b34ff31f-95e4-488f-9cf7-ee4d475d4d64',\n", - " 'e1934cbc-e4f1-48d4-aa26-68d71d771770',\n", - " '693f6eb7-7652-41f9-83fc-491f1853856b',\n", - " 'b653759d-1ee9-4250-b714-d13084df16f4',\n", - " '52ce59e6-49bc-4f7c-930d-3cf18d3189dd',\n", - " '6b0d2390-f76d-490f-8999-1bdc5c8c506c',\n", - " '7a8cb01b-72a5-496d-9eab-baa6ef712163',\n", - " '0dcc54be-9e38-4aec-8203-282a62ff77a0',\n", - " '63f69a79-ee77-4a16-9d89-7c5ffffb9ce5',\n", - " '0abf033c-1c31-4cfd-a45f-2a6e58ee4c1a',\n", - " 'cd035b5c-1d8c-43b4-9d4a-dbad721f16a6',\n", - " 'bf4bb60b-63b3-44b8-9e94-06a6120276ed',\n", - " '0b6fdd52-3fc4-4ae8-b580-2ec9bc45e70c',\n", - " '7bb73c46-3d94-4969-ad9b-9d3ad19def7d',\n", - " 'eb2d8262-a98d-45e6-9897-44d591383225',\n", - " '4dc46b94-5eed-4b58-8b6d-da6be8ade043',\n", - " 'c90b24a0-41b3-4d3c-bf34-9a19bf99cc26',\n", - " 'd5293d1f-98ae-4f0a-823c-e26fd57b12da',\n", - " 'fdb40283-64ad-4ab9-be6b-da189a1fe786',\n", - " '15de5f0c-ffa1-4e55-b975-0c85b087abe6',\n", - " '9ebeae91-0f27-4cfb-be24-7fd80f01a030',\n", - " '253f2c1c-b709-41cf-a8c0-840471116287',\n", - " 'fe786081-9266-4425-938f-1dccfbf99414',\n", - " 'fcc06f7f-b599-4768-8bd5-ff4715b05844',\n", - " 'a635812d-39bc-416f-ac5d-70b341178cc1',\n", - " '9db7a51d-9c6b-4d5f-8776-133af8512e49',\n", - " '5ee2ea9d-3fdd-410e-8bf9-7e67239292da',\n", - " 'c8ea2682-b86f-4373-a84c-65f1c0ed6568',\n", - " '2164a1c5-9d3a-4d35-92c4-a5d3dee7a0a9',\n", - " 'b602317e-aca6-4aaa-9b03-464a6b43beee',\n", - " '72fd3011-11ce-4d92-90bd-9a0f4288b709',\n", - " '983e5452-4913-4826-8d30-e356b7491e1e',\n", - " '1025af61-7e82-4b88-aad8-a7b04c915b71',\n", - " 'c5037e97-01c6-42bc-ab0d-175254a8d67b',\n", - " '5e3b9439-2c17-4dc0-9e4c-8551fec03517',\n", - " 'ed99a341-8c87-4cef-a9a7-4b38b6c1ce2d',\n", - " 'c39c4b6e-8704-4ba4-bb0e-e836a402e986',\n", - " 'ff189b82-d71d-4d2a-86db-e0f1ec868ac1',\n", - " '49363281-e61d-4046-9363-8beeaff9378d',\n", - " '8d0aa0a6-14a3-4c63-b574-0b8baac78bcd',\n", - " '6d9c9dbe-2738-4236-8b4c-d429bbb355d7',\n", - " '74f6fe01-0e7a-4d70-a13b-5bab3d0285b6',\n", - " '0059b5cb-f480-482c-a5e5-a216ff0a3514',\n", - " '113978f9-c184-4c23-843e-d3cbc0570248',\n", - " '29df9302-7cb8-4e72-867a-ac86dd2ded79',\n", - " '9b143e57-91b3-41f8-8d17-06ee60772f48',\n", - " '38ea11b3-6c9d-4bf3-8d00-42615e255430',\n", - " 'ebe4300a-6321-45db-82d4-497a0fb5dbcc',\n", - " '810eed2d-7fb1-479e-a7a6-a4ba7f6f4300',\n", - " '2a17ae14-9ab0-4bc2-8142-a312ebe9fb1d',\n", - " 'bde4364a-8181-493c-8cc9-7136b22513f1',\n", - " 'c4bf00ee-8429-45e1-98b2-ea65ca6692df',\n", - " '5e0465e4-0a1f-48d8-87df-2e747372cd12',\n", - " '6d5ac72c-ea75-4f94-9143-8f7d5074a2b5'], dtype=object), 'relationship_ids': array(['3ab2a46a-668f-4523-9b78-a004d8ab7587',\n", - " 'fb48a435-440b-4c52-96f3-0d70c8efbbd2',\n", - " 'a34cb6b0-15f5-4223-a5d6-2e0050c37832',\n", - " '8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", - " 'bdb96077-cda0-4f45-8704-fd634f5c37fc',\n", - " 'cb608748-833b-482b-b94e-2b7bf2ea2886',\n", - " 'ed1972aa-4579-4adc-afdf-d59a505f197d',\n", - " '1d5c441c-bda7-4c5a-bea3-ab90d7f4b167',\n", - " 'cd30b9fc-e6af-4fb9-a988-d252a3130a83',\n", - " 'c600f8bb-52ee-4222-953d-2cf92234e1af',\n", - " '54d006a9-16b4-49d0-bd23-f33fd8f5fda0',\n", - " 'b5fb65a3-fdf5-4831-be4f-bd356ef16dd6',\n", - " 'fdb000f3-0b58-4cc5-ab60-2b2b76c8c9fd',\n", - " '367b7dd0-8864-47f1-a9b0-d7155becbd76',\n", - " '8396269b-667f-4bed-9de8-3c1aa7336590',\n", - " 'f5886912-3c11-4e86-afe6-f45421d6efee',\n", - " '9ceaf9e7-0282-4acc-8c6f-e9bef14f7149',\n", - " 'fd678a1b-67b2-44e9-84f1-f8e8a5d0b8fc',\n", - " '67567a08-d2a5-45e4-b99b-650cffb14acd',\n", - " '910fc289-52a2-405b-b6d1-f8157ad030d0',\n", - " 'ad72c761-58e4-4ece-9d23-c85b160506eb',\n", - " '0fafc243-2cc5-4d0c-b036-abbb03f45354',\n", - " 'bf20f949-b7fd-4796-95bb-32bf0a60b452',\n", - " 'a42fcb2d-9bd5-4c6a-9589-5ae163759101',\n", - " '53ab441d-54e1-42ed-a182-49b798be9f66',\n", - " '63775c4f-2161-48d2-becf-60b858c2c629',\n", - " 'f6d761c3-ad10-403e-97d8-6d10c74e159d',\n", - " '336264f7-bf6f-4f12-b2a4-dd3f53c27e96',\n", - " '02672dad-a887-4634-8007-5b04cb2d1cb6',\n", - " '95b7f8bb-d955-4d92-862d-106a8e503cc0',\n", - " '54fb97a5-9897-4beb-86eb-a4c9fac3eaa9',\n", - " 'd6a56d92-4fd6-47a6-97e1-6e8495b65c68',\n", - " '950b2cc8-ae46-44bf-8350-cbdd34e2894f',\n", - " '881e38e5-c6f6-479e-8ac0-cad558237fea',\n", - " '590e4288-0a97-458f-8d84-915a8c1d7eb7',\n", - " '16467289-aa6c-4723-be81-2b153c9c76e0',\n", - " '759950bc-e92a-43ca-be5c-fd7e7abf2fe3',\n", - " 'ab98c6e7-b409-451c-9ed3-3a963cd7aa28',\n", - " '834f3ca9-38dd-4254-a250-d02f3f64ff22',\n", - " '84dd6e62-5f1b-46f8-97cd-da1c790d6881',\n", - " '6f62eac3-55ea-4255-be57-3eed01655225',\n", - " '0c799f96-4759-4072-a7b1-bc4ac928162b',\n", - " '114c93d2-7191-4160-838d-bff0e7a32802',\n", - " '09d925be-12fe-4bb5-a1ef-ebd23c1b15fb',\n", - " '1e5cbdd6-bf94-44ba-975c-772668cffcb2',\n", - " 'b783b716-9559-4d0a-b170-63dd11940ef2',\n", - " '226f0cc6-821a-46e5-a6e3-acf760455308',\n", - " '3a3e69bb-7a8f-40b4-9cfb-0f7f2e160b6f',\n", - " '6f25c1ec-e14f-4d24-9696-1e493cfdf44f'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[1]\n", - "document_ids\n", - "{'Index': 2, 'id': '92c05da8037b6c845429a632ab63ae0e3aaa22558e0267021364d553beb46b73d60970ecf60c41365c0673ec404fac962a5d8bf7d99aafdb4305dc6b22bd46f9', 'human_readable_id': 3, 'text': '8 SC soldering processes\\n\\n9\\n\\n10\\n\\n1 1\\n\\n12', 'n_tokens': 15, 'document_ids': array([2]), 'entity_ids': array(['fdd6402f-1ef3-4daf-acc4-6ed786d40ca1'], dtype=object), 'relationship_ids': None, 'covariate_ids': array([], dtype=object)}\n", - "[2]\n", - "document_ids\n", - "{'Index': 3, 'id': 'ae763cc1bcce9b8bd537bd165d69f96f03b4b8414239c8d423c789c663fae67120c65dea1a3747378db4b5e795393fb2e9c1e3fa97fab237acc3c39eecb7aa14', 'human_readable_id': 4, 'text': \"Appendix 1\\n\\n366\\n\\nForeword by David Crimp, Executive Vice President, Europe Alpha Metals division of Cookson Electronics As the World enters the third millennium we can look back over recent years and see the incredible advances made within our industry over a relatively short time. Not many years ago there were no computers, no CDs, no mobile telecommunications, and space travel was limited to science fiction --even radio networks have really only grown up within a lifetime. Much of the technology advances of our age have been made possible thanks to the innovation of the electronics industry which, with its development of new materials, machines and techniques, continues to grow on a global basis. We tend to take such things for granted, but now developing countries too are sharing in the electronics boom. With further miniaturisation, increased board complexity and quality becoming even more critical, expertise in soldering assembly is a prerequi- site, for both engineers and new recruits to the electronics business. Soldering in electronics assembly is a complex skill, relying on the combination of personal expertise, quality materials, and efficient equip- ment. Quality management systems have helped raise the production yields, while equipment and materials technologies continue to keep abreast of the industry requirements. But behind all this are the engineers and it's they, working with their suppliers, who are the key players in the growth of our industry in the future. This book is written to provide a useful reference for engineers involved with the practical side of electronics assembly operations, and will prove interesting for a wide range of readers, in the broadest sectors of our industry. I am pleased to be able to contribute to this important book, on behalf of Cookson Electronics. For over a century the electronics divisions within \", 'n_tokens': 485, 'document_ids': array([3]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " '4d3d514b-6ce9-499c-aed9-81847ebd624f',\n", - " '081ffd38-b9b7-4b1d-a950-f23adbe000a2',\n", - " '70f8a13d-349c-4f34-8d55-c6a008a6b45d',\n", - " 'a4f49b38-42a3-48c6-9373-00793e001049',\n", - " '597ff0d1-5ab7-4896-ba9a-81a262e73e46',\n", - " '8eb9da90-175c-4916-b86b-2f23471fedca',\n", - " '670323e3-1999-4c16-93d2-a568c66ebc75',\n", - " '5793ea85-4c66-4047-87b9-71c374d6a2e3',\n", - " '9cb18a30-1895-48e5-88bf-adb810424118',\n", - " '0f57f45a-8494-4270-937b-d35e5dd6dd3d',\n", - " 'ffb98d88-7ed4-4910-87e4-df8979e6273b',\n", - " 'bc9849aa-5b32-495d-bcd7-0c4a45815c1d',\n", - " '12851f3b-37f1-4d48-85a1-5155409bd1c9',\n", - " '1f14c5b8-4a60-461f-ab1b-62c3c87e6245',\n", - " 'f802b1e8-7ae9-40bc-abfa-8cdd2cff8113',\n", - " '961a226d-b96b-49cf-a7cc-41734f2a77eb',\n", - " '331696a6-78fc-4951-b223-a91e4c8bc1cb',\n", - " '88b5761f-9ef4-4179-972f-79f45971ec5d',\n", - " '6ad73d20-e8bb-4da8-b9d5-d1f02e22d59e',\n", - " 'be92a637-8cf1-48dc-9dc6-8645b85f6f04',\n", - " 'd5428c95-6ea9-4e2d-bb2e-912437d9ea70'], dtype=object), 'relationship_ids': array(['17fd1bbc-e538-4fe0-8f1b-73673236c881',\n", - " 'f72ed6ef-5ffb-47d1-8165-fd4908bec70b',\n", - " '75fa0561-ffb1-4c06-9d60-14fc73894b80',\n", - " '1a90627c-d74a-4a29-9a40-371bd857466e',\n", - " '1264f04d-bced-4147-a991-b966d14f6581',\n", - " 'f8d0fba1-4b25-47af-b50d-b0ec5bfe9130',\n", - " 'ca3e7e09-809f-4f7c-a0b1-4c0124441b92',\n", - " '633b8938-4f6d-42a0-aa7d-14b4bccedac9',\n", - " '33b7c6d8-f7e7-4162-83d5-6b54c2a99337',\n", - " '029f5aba-02ff-40e7-938a-181c30823b28',\n", - " '51bf3b0d-5b43-43aa-8db3-5076514a76ea',\n", - " '6a540629-8a34-4e0d-adcb-8f0005b29d75',\n", - " 'ff0516bb-10b8-47d8-8014-05030622d186',\n", - " '9d728a5b-b3a3-4e39-999f-34c188cf103c',\n", - " '17a5d402-40b7-41c7-bd26-c2dadc0663fb',\n", - " '828c63f2-0c17-455b-b360-01b5ba138c30',\n", - " '08299e42-aa32-46ef-9562-a0ee3dc4b575',\n", - " '71d2c2bb-f755-433b-9682-aa3b236117b6',\n", - " 'f2dae476-6d6a-4d04-bb74-f5027b5f0296',\n", - " 'f2f02266-bd41-43e2-94bb-c976706bbba2',\n", - " '5df48913-2bc1-4fb0-88ad-9000abaff8c8',\n", - " '9bc828d1-af43-4a2f-ae13-54d876e45c5f',\n", - " '72a6494d-4ed5-4be9-b1e6-23de08120e68',\n", - " 'a88cad08-4ef6-42bc-b44f-c19c3adc2d69'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[3]\n", - "document_ids\n", - "{'Index': 4, 'id': 'ea8856414e3a2ac5dfabb597298c62c56ffc434664014e2cd113bfeb44174ddda32192b70457a36fd84de9203d28d4a1f3dc81fd9ead60f4e5c1f29d441f2287', 'human_readable_id': 5, 'text': 'by\\n\\n186 SC SOLDERING PROCESSES\\n\\n186 SC SOLDERING PROCESSES Photo 8.6 Hot gas/air soldering machine, used typically in rework or individual component placement (Planer Industrial) @ soldering irons — conventional soldering irons with specially shaped tips. Comparison of soldering processes All SC soldering processes are compared in Appendix 4, along with CS soldering processes.\\n\\nPreface Electronics assembly is about components that are soldered onto a printed circuit board. Soldering, as a principle in electronics assembly, is straight- forward and simple m two metal surfaces (component termination and a connecting pad on printed circuit board track) are joined by metallic bonds created by molten solder between them. Solder joints are supported by the solder when it solidifies, and the solder allows electrical contact between metals in the joints. Surface mounted components are changing, they are becoming smaller and lighter and in the case of ICs due to the increased demands of functionality, they also have a greater number of leads. This dimensional and weight change is driven by the increase in demand of portable products. Table I shows the growth in unit terms for portable products over the coming years. The other sectors illustrated harsh environment, low cost/high value and high performance cut across the traditional market boundaries and focus more on the products technology requirement (Figure I). Increasingly, a number of companies are adopting one particular pack- aging strategy m that of small form-factor components ideal for portable products. These are increasingly being used in larger electronic systems such as exchanges, base stations etc as a company wishes to adopt one packaging strategy and hence assembly strategy for all types of products that they manufacture. This has obvious benefits with regards to stock holding Table 1 Total equipment quantities by global technology roadmap sectors 1997-2007 1997 2 0 0 2 2 0 0 7 x lO 6 % x l O 6 % x lO 6 1710 4480 57.2 Portables 45.1 7480 % ! 63.3 High performance 460 12.2 840 10.7 990 8.4 Harsh environment 275 7.3 670 8.6 1190 10.0 Low cost, high volume 1340 35.4 1840 23.5 2160 18.3 Total 3785 1 0 0 . 0 7830 1 0 0 . 0 1 1 8 2 0 100.0 ', 'n_tokens': 667, 'document_ids': array([4]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " 'b427ea2e-64f4-4161-84fc-7dd16dba7f13',\n", - " '7230bde1-afc2-4019-a4c1-d18dbece2ef3',\n", - " '72995119-aab8-43a8-938f-1be094b4b4f8',\n", - " 'ed120a52-c8db-4f2a-88e9-d755d1657025',\n", - " '9d966b7d-65cc-4a39-acf0-79d6094372ae',\n", - " '7bf9a917-dbf5-4c00-b6aa-c514c715a13a',\n", - " '4d3be32e-83b2-443d-9e2d-d45c0558ed26'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", - " '3389b889-6d0b-4f1d-9e38-3a6e03d1459b',\n", - " '4d2fa8a2-8210-4376-a7a1-eee751c29705',\n", - " '52fdd534-255f-432c-8b31-3ba151477b4c',\n", - " 'c0125d50-26f1-4398-88db-e362f6364061',\n", - " '0d4b2580-9fd1-4d67-a2ae-ace802607269',\n", - " '4ab3651c-334e-40ed-9f9d-7fa82a1aba41',\n", - " '44d6e2fb-b2ec-4ee8-bac4-9e5127bd29fe',\n", - " 'cdcf8d96-84bf-40b9-92f7-3d89ededa3c5',\n", - " '1d301503-7364-4071-bd1c-a8389970b6e8',\n", - " 'a50ef15e-3483-4a4e-8ed9-361b1c38bce3'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[4]\n", - "document_ids\n", - "{'Index': 5, 'id': 'e08c9138e652cbe6eb1810c16545023d6f699af201d54397216f4607f7195da8cfde002db66c0e2c71642db6dfb507b3bb0696b62d738be13deb7303ce11db3b', 'human_readable_id': 6, 'text': \"x PREFACE\\n\\nFigure 1 Global technology roadmaps (BPA, 1998) and handling of parts as well as set up time for assembly equipment such as pick and place machines. Figure 2 illustrates worldwide trends and movements away from through- hole components towards surface mount and a third format termed minimalist packaging. Minimalist packaging is the ultimate packaging technology. The future challenge for soldering and assembly technology is to manage the Figure 2 Worldwide trends from through-hole components towards surface mounted components (BPA, 1998) \\n\\nGLOBAL (Showing MARKET SECTORS\\n\\nTECHNOLOGY Typical Systems)\\n\\nROADMAPS SECTORS\\n\\nSystems,\\n\\nTECHNOLOGY\\n\\nHarsn Environment Systems Low Cost/High Volume Systerns\\n\\nTotal Packages (Bn) 58.17\\n\\nPREFACE xi attachment of through-hole, surface mount and minimalist packages on the same board. There are many instances where, particularly with through hole connectors, these older technology products will remain due to costs or robustness. Small components and greater lead counts make soldering to printed circuit boards more and more difficult. New soldering techniques and modifications of existing techniques are required to meet the challenge of smaller surface mount and minimalist packages. Our job in writing this book is to show all this. While looking at the principle of soldering, which has remained fixed since man first used molten metal to join two other metals (first known use of solder is Roman pipework, where sections of lead pipe were joined by melting their ends together), we also show how the techniques to fulfill the soldering process can change and, indeed, are changing with the requirements placed by components and printed circuit board assemblies on them. More than anything else these days (and in the future), state of component and printed circuit board technologies means soldering has to be clean and precise. In the distant past, when components were huge and printed circuit board tracks were wide, soldering was often a case of throwing sufficient molten solder at a board to make an adequate joint. Joints were initially made by hand. This is no longer the case. With minute component terminations and tracks, too much solder can be devastating. On the other hand, too little solder will not make a joint at all. Even if economic considerations were not important, joints can no longer be made by hand because hand soldering cannot guarantee adequate results with such small joints. Control of soldering systems has to be precise and closely monitored. Soldering and, inevitably, its control must be performed by machines. While it's impossible to summarize all we have to say, in this short preface, it is possible to make a list of points which our book, hopefully, spotlights. Overleaf we present the 10 rules of machine soldering. \\n\\nhighest qual- produces\\n\\n10 rules of machine soldering 1 machine soldering, correctly controlled, produces highest qual- ity joints at lowest cost 2 machine soldering is a process and, like all processes, produces consistent results if properly controlled 3 touch-up of faulty soldered joints is costly, unretiable and unne- cessary 4 anything that reduces solder joint defects is cost effective 5 design. handling, assembly and maintenance are ail parts of the soldering process and must be properly controlled 6 solderability of printed circuit boards and components accounts for 60% of all faulty soldered joints 7 never use parts which fail solderability testing: the ultimate cost is too high 8 soldering problems are solved by process control — not more inspection and touch-up 9 everyone concerned with the soldering process must be formally and properly trained 10 zero-defect soldering is the lowest cost soldering.\", 'n_tokens': 947, 'document_ids': array([5]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " '0352909a-429e-44f0-afd3-005439bf5b69',\n", - " '8b4319f2-5d66-4554-9a5a-3c07d2d6fa64',\n", - " '281befb9-444d-447d-9998-739064315ed2',\n", - " 'e1878d90-8bf1-4f38-aabc-7b97fbcf04d2',\n", - " 'c60ab2cf-310c-4a04-a5e2-e66d1d891018',\n", - " '208036b8-51d9-484e-b7ed-9e7970ab6072',\n", - " '2cce6e88-2cf9-4a9e-bd24-cb711029b725',\n", - " 'abd2f69b-4822-4189-ae74-89e05fab856d',\n", - " '74748602-b8ce-4f2c-8a2a-ced24ffdf195',\n", - " 'd76ac487-ff25-4320-951a-42664aa335bb'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", - " '792d025d-f636-4bf0-bf6c-ea43a6dad618',\n", - " 'ca3ebcca-f074-4c16-a393-7e3ecd993f4c',\n", - " 'fd098a96-aa4a-46a3-8116-2ec254e5b798',\n", - " '56717c5d-231c-4d30-b3bf-fd11fb5e51e0',\n", - " '822fe3d1-c096-4455-baf2-82bf3fde8f37',\n", - " 'e265ec56-d497-4a6f-b444-30e47c8138ce',\n", - " '03dbfe81-71c7-4126-a573-23cffe62c1ff',\n", - " '13ee7450-8e1c-43db-b792-1c394005913f',\n", - " '9668cd85-7bc6-4de5-b67e-867f75113ac0',\n", - " 'dbd8f2b4-aa42-4235-82fe-c4d7b888c9f8',\n", - " '460dbca8-1e47-4ac9-9e23-272c67027e24',\n", - " 'a914f0a3-a447-48e0-8976-69e7763219c1',\n", - " '1bdea2b2-4e45-4254-93eb-f7de80597683',\n", - " 'ca1974ef-9315-4ea1-ba85-39456b6aeac6'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[5]\n", - "document_ids\n", - "{'Index': 6, 'id': 'fe32f9e377e349a3fed1de96003dc98ffbfee6c43cba3346e1cb49889a5d41b6daa12f935807ea37b3d9776ef25683068aedcbba3b5a07a8038efb09b6c8e579', 'human_readable_id': 7, 'text': \"controlled, produces and, like all processes, is costly, unretiable\\n\\n1 machine soldering, correctly ity joints at lowest cost 2 machine soldering is a process consistent results if properly 3 touch-up of faulty soldered cessary 4 anything that reduces solder 5 design. handling, assembly soldering process and must be\\n\\nPano ee SRE ae\\n\\njoint defects and\\n\\nof printed circuit all faulty soldered parts which fail\\n\\nis too high 8 soldering inspection 9 everyone and properly 10 zero-defect\\n\\nare touch-up with soldering is the\\n\\nAcknowledgements We'd like to thank a number of people who have helped us in major ways, as we have researched and written this book. In no particular order of priority, gratitude goes to: Mark Hutton; BPA UK Don Elliott; Elliott Technologies, Canada Alan Keyte, Nokia, formerly with Motorola, UK Andrew Nicholson, Alpha Metals, UK Fred Thorns, Alpha Metals, UK Phil Fulker; Invicta Contract Engineering, UK Colin Lea; National Physical Laboratory, UK William Dowa/Rich Burke/Keith Favre; Speedline Electrovert, USA Alan Roberts and Claude Legault; Speedline Electrovert, USA Chris Davies/Craig Lazinsky; Speediine Camelot, USA Steve Harper; Speedline MPM, UK many people within the Electrovert group worldwide. Finally, special thanks go to Bob Willis of Electronic Presentation Services in the UK, for help and guidance throughout. This book is dedicated to a respected man, considered by many to be a guru in electronics soldering. Paul Bud, Technical Director of Electrovert is sadly missed. He was a kind man anda gentleman, always willing to listen and pass on his wide knowledge of soldering, communicating in many languages. He was an inspiration to us all. in his memory, we hope the book proves helpful to all who read it.\", 'n_tokens': 387, 'document_ids': array([6]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " 'c60ab2cf-310c-4a04-a5e2-e66d1d891018',\n", - " '6204bc96-50b6-4a22-a57e-4a78f0341fa7',\n", - " 'ddd9180e-193c-4ed2-a1fd-113286301f11',\n", - " 'af586f19-c17d-405b-ad82-b0f61f2e6ab9'], dtype=object), 'relationship_ids': array(['de7677fa-84f8-44db-8383-8f034fa7093a',\n", - " '332f3816-cb6e-41d7-82cd-667ba5f7d256',\n", - " '1afb1c75-387d-4c43-a29a-dc8423dc60b1',\n", - " '0787db22-0d09-428b-a508-02fa6f6d6c1e',\n", - " '2d75c6c5-8beb-4e06-8da0-a5afd1c34248'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[6]\n", - "document_ids\n", - "{'Index': 7, 'id': '52589ff3ffc9f0522adcbdf3bffa9fd756d813c86babfbc8df4556f46e35f594b5213db8d551b0d3be278e293259e78b9851add38abf5546dbba29daeed69b55', 'human_readable_id': 8, 'text': \"Acknowledgements\\n\\nThis book is dedicated to a respected man, considered by many to be a guru in electronics soldering. Paul Bud, Technical Director of Electrovert is sadly missed. He was a kind man anda gentleman, always willing to listen and pass on his wide knowledge of soldering, communicating in many languages. He was an inspiration to us all. in his memory, we hope the book proves helpful to all who read it.\\n\\nThe science of soldering has been known for many years. It is, indeed, a simple process of bringing parts to be joined together with solder, flux and heat. How to do this and to achieve a satisfactory result, though, is both a science and an art, when each by itself may vary. Methods and the principle used as years go by form a most fascinating subject. Bob Willis, Electronic Presentation Services Solder is truly a magnificent trifle, it gets little respect from management yet it holds the entire electronics industry together. Thus another book on soldering is very welcome! Howard H Manko, Manko Associates After nearly 4000 years, soldering remains as much an art as a science. Progress is still accelerating in this field of electronic technology, forcing us m again and again m to rethink the idea of quality. Soldering first forged weapons, but now it may help us develop intelligent machines towards assisting mankind in peaceful pursuits. Armin Rahn, rahn-tec Consultants The more we know about soldering electronics assemblies, the more we discover what we don't know. We may argue about the best solder fillet shapes, the benefits of controlling the solder joint microstructure, or the required cleanliness level of flux residues, but it is the practice of soldering that is of the essence: almost anyone can solder - - but few can solder well. Colin Lea, National Physical Laboratory Printed wiring boards are the primary means of interconnecting circuit components. As such they have contributed greatly to the growth of electronics. Assembly and connection of printed wiring b o a r d s - also called printed circuits and etched w i r i n g - involve a sequence of three basic operations. They are (1) manual or automatic insertion of electronic components, (2) metallurgical joining (soldering) of component leads or terminals to printed conductors, and, usually (3) a cleaning operation to remove flux and other residual contaminants. In view of the interest of electronic equipment manufacturers in this subject and the increasing importance of electronics in industry and elsewhere, a review of the state of the art as it currently exists and discussion of the effects of recent developments in the field are in order. Paul Bud (October 1980), then Vice President of Electrovert Inc \", 'n_tokens': 715, 'document_ids': array([7]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", - " 'ba9a83b2-feee-4c92-854a-9d1fe90ce2f6',\n", - " 'f6597ab9-ad3b-40e9-8402-08c0cc2cadc5',\n", - " '95d9931c-ed18-42fc-a2ee-f870d415f503',\n", - " 'a41a72c0-ff5a-408d-8f41-15935db4a4c9',\n", - " 'd2042af0-1b33-4264-9858-c22713079a0b',\n", - " 'f3cbbe17-19b9-472f-9109-a58fb233ef52',\n", - " '9173f6dc-c626-4edb-bcb4-ece061fcb5e9',\n", - " '89ab2a8e-4ea3-49c2-a5d5-65a8c06c4066',\n", - " '35566d46-4047-4809-a1b8-cf774048c10c',\n", - " '6c9e0cbd-2f11-4eb7-8e63-210caa7b8757',\n", - " '59e537c6-28da-403b-b0d5-bb4d1eae6461'], dtype=object), 'relationship_ids': array(['52ba87ba-30df-4572-b629-01cea97a8fc8',\n", - " 'c9c1d874-1c75-4447-8441-3296880046cd',\n", - " 'da9dd12f-8cdc-40f5-9500-5f0037df0001',\n", - " 'f8c98654-0784-4426-a01f-50e9594a897e',\n", - " '85c380c2-09cd-4a05-89b6-b2bb76598d55',\n", - " 'a10226a9-e7de-4ed3-87d9-24948347d69b',\n", - " 'c19136d7-8d3c-405a-8050-35a186c99585',\n", - " '70c15ec2-9eb8-4a9b-ab0c-7362310d6b77',\n", - " '3e7c1a9f-9c0b-4097-a6a3-3bbd203d6cdd',\n", - " 'bd91ec21-3212-4977-a2ac-6237e33d455b',\n", - " 'bfb38148-58a1-4e9a-8f98-39bff8ba7918',\n", - " '22972b60-a76e-4287-989d-8ef1b8d2c468',\n", - " '21e38eef-20bd-439a-86a6-2035a27a7cbd',\n", - " '82479e7b-848c-4c60-b60c-b2c5bb75a99b',\n", - " 'a83ef05b-47bb-4530-8ac0-fa2fe0be5823'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[7]\n", - "document_ids\n", - "{'Index': 8, 'id': '8b43780905545213bff0b274655b9923084f78821c0092b1fd739fa094683cb39c743151d5b50578fa551819ddf557d546744f53139a47d6e2cce6f9a465e662', 'human_readable_id': 9, 'text': '1 Soldering process This chapter could be seen as just another introduction to soldering — it does, after all, explain in a fairly basic manner all important aspects of soldering in electronics assemblies. In this light many people may be tempted to skip it. However, this would be a mistake as it also explains philosophy behind the complete book. Further, it discusses main features and illustrates fundamental premises upon which we have based our text. Finally it also serves as a guide indicating where relevant and important information is to be found within the rest of the book. We strongly advise this chapter is looked at bearing all this in mind. Soldering, in principle though not in practice, is a reasonably straightfor- ward process, used in the electronics industry to bond components to- gether, forming one or more electrical connections. From this description, it’s easy to see that soldering serves two functions: @ mechanical support — holding components of an assembly together @ electrical support — forming required electrical connections within a circuit. Most components in an assembly use the mechanical support of soldered joints alone to give adequate fixing into the assembly. A few isolated components (notably, larger, heavier components) may require additional mechanical support, in the form of straps, nuts, bolts and so on. Where possible, however, such large components should be designed out (that is, care should be taken when designing a circuit not to use such components) of an assembly to keep extra procedures and cost to a minimum. On the other hand, all components may use solder as electrical support to form required electrical connections. No other method has yet been devised to take the place of solder in all assemblies to the same level of performance, cost and ease of operation.', 'n_tokens': 348, 'document_ids': array([8]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " '3ae49303-e478-4317-8c86-88a3c09ef83e',\n", - " 'f91789cc-62ef-4fe3-b7d2-72b3aca6d2ee'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", - " 'a7205d48-e2af-426d-8af3-c10263766412',\n", - " 'a6a5ccec-2c90-4a1e-a9ea-6927c9015ed0',\n", - " '949afa01-41cf-4eda-8f25-ce193a98164c',\n", - " '5900e2da-7ea6-4c64-b56b-23183fb8081f'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[8]\n", - "document_ids\n", - "{'Index': 9, 'id': '37fc8b0316f1342d684c793531ca6c817d1a6f8347aef18379ee8033e1ca7886e6fc93abe10103e0fbc08f3f7dc4ed97d8eb6b79b8cc9f0594f13b5a209ef31d', 'human_readable_id': 10, 'text': \"2 SOLDERING PROCESS\\n\\nTime on its side Solder in one form or another has been around for a long time. The Romans are known to have used solder to form joints in their plumbing systems and, indeed, the word plumbing refers to the use of lead (from the Latin plumbum meaning lead) as a jointing compound. Nowadays, of course, pure lead plumbing is no longer considered, instead solder m which is an alloy of mostly tin and lead - - is used. It's interesting to note that certain countries are already in the process of altering legislation to prevent lead being used in any plumbing where drinking water is present. Solder has been adopted by the electronics industry as the best method of making joints within assemblies and, for many years, this jointing process was undertaken manually-- hand soldering. Inevitably hand soldering is a slow, laborious, time-consuming and hence expensive process as each component must be soldered into position to the printed circuit board individually. Quality and repeatability of joints depend almost totally on the individual operator. This clearly makes cost of large-scale electronics assembly production uneconomical and unsatisfactory. Generally, there- fore, hand soldering of electronics assemblies is undertaken only in devel- opment and prototype stages, although there remains a situation in which small-volume production of electronics assemblies is economical. Hand soldering is used regularly in rework stages of manufacture, where assem- blies need to be partially disassembled for repair and service purposes. Because of this situation we need to consider hand soldering and so it is discussed in Chapter 7. For the last 40 years or so, various methods of automating soldering processes have been developed. It's easy to see how vitally important automated soldering of assemblies has become, by remembering that the space programme of getting a man on the moon could not have been achieved without it. Paul Bud, to whom this book is dedicated, related an interesting fact about NASA printed circuit boards used in spacecraft. Had NASA's assemblies been hand soldered, joints would have held more solder with the result that assemblies would have been 10% heavier. So many assemblies are used in spacecraft that with this additional weight, the three astronauts (totalling, say, 250 kg) could not have been carried! Until just recently, however ~ say, the last ten years ~ soldering of really only one type of electronics assembly was in the main undertaken. This assembly type, a typical joint of which is illustrated in Figure 1.1, is commonly called the through-hole printed circuit board, simply because the components feature leads which are inserted through holes in the printed circuit board. Copper track interconnections exist between holes which \", 'n_tokens': 758, 'document_ids': array([9]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " 'bd3a93e3-1708-4b43-a5b6-02c18ddb0329',\n", - " '2cce6e88-2cf9-4a9e-bd24-cb711029b725',\n", - " 'a3d65e7a-ab75-48f9-a89e-9821b4bd708e',\n", - " '53195e4e-b3dc-4bf0-bca2-727585db2359',\n", - " 'aa1d110d-5c01-4545-ab2a-747a8abc377e'], dtype=object), 'relationship_ids': array(['9b7b1824-0d17-4739-9fd1-38e4e015928a',\n", - " '7c970ca5-3dbe-4b4b-83de-b88dfdeb6fd9',\n", - " '2d350acf-a67b-4201-81c5-de297dfc85fd',\n", - " '2fd53fac-52d3-43e6-b52d-8225973cb51e',\n", - " '337abf51-293e-4d91-9955-8252095a1be0',\n", - " 'd4bd15bd-20d2-4fef-8964-03199da1b0a1',\n", - " '2906daa9-c83f-4053-893c-b34562374829'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[9]\n", - "document_ids\n", - "{'Index': 10, 'id': 'f9a518c2e9b9918af9a7e591c7046ddf1ab3c6587d0e6636ca0de33c7c26051f89db955009c25fd9b7255d2235c5358d900cd48b1999cbc34492f22f0f48ea1e', 'human_readable_id': 11, 'text': \"TIME ON ITS SIDE 3\\n\\nmake up the circuit of an assembly and component leads are soldered to the copper, so that mechanical and electrical support is provided with each solder joint. Note that, in this ideal joint, solder has been drawn inside the hole during the soldering operation mthis occurs by capillary action. Solder between the copper track and the component lead is called the fillet. Emergence of a different type of electronics assembly m surface mounted assemblies or SMAs ~ however, is altering the face of soldering processes used. So much is surface mount technology (SMT) changing soldering that, at present, somewhere around 50% of all electronics assemblies use at least a few surface mounted components (SMCs ~ also sometimes called surface mounted devices or SMDs). In 1980 the figure was, to all practical purposes outside of Japan, zero. This change in assembly technology has only been possible with developments bringing a parallel change in soldering technology. Changes in component technology, too, are pushing many companies along the surface mount route ~ a growing number of components simply cannot be obtained in through-hole forms and are only available as surface mounted components. Figure 1.1 Soldered joint formed between a component lead and copper track on a plated through- hole printed circuit board \\n\\nEmergence of a different type of electronics assembly m surface mounted\\n\\nComponent\\n\\nComponent lead fillet \\\\ Printed circuit board base material track Plated through-hole\\n\\nCopper\\n\\n4 SOLDERING PROCESS\\n\\nFigure 1.2 shows a typical surface mounted assembly joint, in which a surface mounted component is soldered to a printed circuit board. Differ- ence between this and the through-hole assembly joint of Figure 1.1 is immediately a p p a r e n t - surface mounted assemblies do not use holes to locate component leads prior to soldering. Indeed, surface mounted com- ponents do not have leads, a fact which prompts another descriptive term for them - - leadless components - - in contrast with components used in through-hole assemblies which are often called leaded components. While we're defining terms, we may as well go on to point out where leaded components are inserted into a printed circuit board, leadless components are loosely said to be onserted onto a board. From this description it's easy to see that surface mount technology is based on a marriage of standard through-hole techniques with hybrid assembly techniques (hybrid assemblies are those in which film-based components are combined with ieadless discrete components on a ceramic or similar substrate). These two main assembly types are only categories, and within each category there are many variations, each with specific solder joint concerns and requirements. Relevant variations, joint types and solder processes are detailed in Chapter 2. Figure 1.2 Soldered joints formed between component terminals and copper track on a surface mount assembly printed circuit board \", 'n_tokens': 796, 'document_ids': array([10]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " '2f5ca7ba-3b22-4fdd-b9ae-e330b4e964e6',\n", - " '376b5875-649a-4513-a4aa-cc48a8d2733e',\n", - " '1016f308-5d80-46be-8e84-fe2f01c80c66',\n", - " '6858b6b1-657c-4901-bd45-9e2fedbae425',\n", - " 'fe144ecb-62bc-4c59-b504-59e3202d6784',\n", - " '971b8a47-bf20-400b-8b65-9a2c41fac590',\n", - " 'ca7d96d3-f55c-4765-aecc-4c557de793c8',\n", - " '7cce963a-538c-41a5-8b1b-0bf2b7d6bf26',\n", - " '541c276c-ac8f-478c-89b5-27369ca60357'], dtype=object), 'relationship_ids': array(['c9c1d874-1c75-4447-8441-3296880046cd',\n", - " 'b24b24d9-895f-457b-a8d7-44b9e1882bbf',\n", - " 'a5a92ba0-3d1a-45cf-a254-b1c258a5dc79',\n", - " 'a7772634-a4f3-4504-8114-3f2f36b72cb4',\n", - " '01f66ca3-1a63-4316-8c25-6370ddafa713',\n", - " '0218d2ff-4b39-4bc6-a9f1-a866e4093082',\n", - " 'd9630ea4-1698-4b6e-a968-04e71c6496b4',\n", - " '992e5c5f-7603-4033-b499-ba3efbc39c3a',\n", - " 'a7264c8b-b4ad-4c94-8e61-759cd2855fe6',\n", - " '7ca38ca7-4a3f-42b5-9bb9-eb90c59693c2',\n", - " 'ef35f499-9bf5-4118-bec4-8eb679b7ade2',\n", - " '0ec956c3-cdd9-461b-a397-4c74bbd8cee2',\n", - " '913d92b2-40c2-40d9-82d9-b5707070a749',\n", - " '1dc3479a-a47d-411f-9d8f-81124a2d1be1'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[10]\n", - "document_ids\n", - "{'Index': 11, 'id': '0b867f205500a2c79562e026e65343126e94bfbb00a4a4529a949244b77b6dce3471a1ffd07703ef8883e26b6b65d5bf778e6b121ddf2a3612070e9793f5cea0', 'human_readable_id': 12, 'text': 'PRINTED CIRCUIT BOARD 5 Printed circuit board Electronics assemblies are based on use of a printed circuit board of one form or another, to hold components. Construction of these printed circuit boards is critical to soldering processes, in that different printed circuit board types have different thermal characteristics, which can greatly affect how they must be soldered. In principle, a printed circuit board (PCB), sometimes called a printed wiring board (PWB), or simply printed board, comprises: a base, which is a thin board of insulating material supporting all the components which make up a circuit; conducting tracks, usually copper, on one or both sides of the base making up the interconnections between components. Compo- nent connecting leads are electrically connected in some form of permanent or semi-permanent way, usually by soldering, to lands, sometimes called pads — the areas of track specially designated for component connection purposes. If lands have holes drilled or punched through the board to facilitate component mounting, the board is a through-hole printed circuit board. If lands have no holes the board is a surface mounted printed circuit board. To clarify, the term printed is somewhat misleading, as tracks are not printed directly onto the board. It refers instead to just one stage within the whole printed circuit board manufacturing process, where the conducting track layout, sometimes called pattern or image, may be produced using some form of printing technique. Printed circuit boards can be made in one of two main ways. First, in an additive process, the conductive track may be added to the surface of the base material. There’s a number of ways in which this can be done. Second, in a subtractive process, where base material is supplied with its whole surface covered with a conductive layer, track pattern is defined, and excess conductive material is removed, leaving the required track. Sometimes, both processes may be combined to produce printed circuit boards with more than one layer of conductive track. Printed circuit board types There are three main categories of printed circuit boards: @ single-sided — in which copper track is on just one side of the insulating base material. In a through-hole single-sided printed circuit board (Figure 1.3a), components are situated on the non-track side of the circuit board while their leads go through the through-holes to the other side, where they are soldered to lands. In a surface mounted printed circuit board,\\n\\n6 SOLDERING PROCESS Hole through board Component Component lead / -— Base material Ar Solder” UL Land Hole through board Component | : Component leads Base | J be cg Track material N 6 tallized layers i -_ = b j Land Solder [7 Fe y (b) Plated through: ! holes (vias) ii Component on underside Component Through via RN Buried via Track N i. \\\\ \\\\ Metallized layers“ Solder Blind via Land U Metallized layer (c) Figure 1.3 Three main categories of printed circuit board (a) single-sided: track is present on only one side of the base and components are usually mounted on the other. Component leads connect through holes in the board to lands in the track (b) double-sided: track is on both sides of the board. Components are usually on just one side, but might be on both. Metallized holes or vias through the board are used to connect track on each side (c) multi-layered: tracks are layered and laminated together. Components may be on one or both sides. Vias are used to connect berween layers components — and their leads or terminals — are situated on the same side of the board as the copper track @ double-sided — in which copper track is on both sides of the insulating base material. In a through-hole double-sided assembly, components are', 'n_tokens': 773, 'document_ids': array([11]), 'entity_ids': array(['4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", - " '2f5ca7ba-3b22-4fdd-b9ae-e330b4e964e6',\n", - " '2e94ccbc-39b2-4d60-b3b3-439c432585d1',\n", - " '2e05066a-c303-4404-b7cb-2df794aa0571',\n", - " 'abe5853e-fba8-4e18-8ac9-ddb7ab386254',\n", - " '667a25dd-1844-4784-98a9-85c621f68c73',\n", - " '2a66f7c2-7d27-4327-b1df-4dd38324e0de'], dtype=object), 'relationship_ids': array(['e3353237-814b-4736-bb5f-57411dc61cea',\n", - " '67297d52-b3f4-4760-9602-e4df22c8e9cc',\n", - " '37c7d0f7-1446-4a84-a774-0e32518af8fa',\n", - " '5588affb-72a3-4b06-b5ac-c65e968c7573',\n", - " 'c67e0999-67d8-4acb-988a-49fa73ee23d5',\n", - " '4ffbc362-7c14-4563-a9b0-c9b1288f0d5e',\n", - " '958799e9-27ac-47bf-95e7-3459eea640fc',\n", - " 'fc465597-7bfa-413f-97ad-d07da5893e81',\n", - " '27ed4255-9c4c-44d5-afd3-d23128e8b25e'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[11]\n", - "document_ids\n", - "{'Index': 12, 'id': 'afa73200da7ba51ff2c2552010436ba997ea1359315ff2ed19af30bb41ecaffa1722657c52ecc5e826d7396f5359014ed175532a44181d3219616000b63a1e55', 'human_readable_id': 13, 'text': '6 SOLDERING PROCESS\\n\\nHole through board Component Component lead / -— Base material Ar Solder” UL Land Hole through board Component | : Component leads Base | J be cg Track material N 6 tallized layers i -_ = b j Land Solder [7 Fe y (b) Plated through: ! holes (vias) ii Component on underside Component Through via RN Buried via Track N i. \\\\ \\\\ Metallized layers“ Solder Blind via Land U Metallized layer (c)\\n\\nPRINTED CIRCUIT BOARD 7 usually (though not always) situated on just one side, and soldered on the other (Figure 1.3b). Where through-holes are required to interconnect top and bottom copper track layers, they are plated inside hole barrels with copper, and are called plated through vias. Where a component lead also goes through a via it is called a plated through-hole (PTHs). In a surface mounted double-sided assembly, components are on the same side as boards are soldered. Components may be mounted on both sides of the board. Note, however, a circuit track on one side of the board is not connected to track on the other side unless plated through-holes are used @ multi-layered — in which several circuit track layers are incorporated into a single board, laminated together with insulating layers between each copper layer. (Figure 1.3c). Plated through-holes can be used for either component terminal connection, or purely as electrical connections {in which case they are called vias). Vias passing from one outside track to the other are called through vias, while those connecting internal track layers are called blind, or buried vias. As many as 30 orso layers are typically made into a multi-layered printed circuit board of around 2 mm thickness. Maximum known to the authors is a board with 60 layers, although boards like this are unusual and very costly. Printed circuit board base materials There are many materials used to make printed circuit boards. Generally, for common applications, materials are of thermosetting or thermoplastic plastics, reinforced for rigidity. Reinforcement materials include sheet paper, glass fibre cloth, cotton fabric and nylon. Fillers can be added to influence characteristics. Table 1.1 lists common printed circuit board laminates, according to British Standard BS 4584 and IEC 249 classifications. Where applicable, classifications according tothe commonly known ANS! NEMA LI standard — which, incidentally, does not exist anymore — are also listed for information. To aid clarification of letter codes, Table 1.2 lists codes along with descriptions. Physical and electrical properties of printed circuit board are also standardized by BS 4548 and IEC 249. These are listed in Table 1.3. While the most common material in printed circuit board laminate production is currently woven glass fabric reinforced epoxide resin, it is worth noting that a trend towards flexible polyimide forms of printed circuit boards is taking place in many consumer products — purely for cost purposes. This trend is expected to continue.', 'n_tokens': 634, 'document_ids': array([12]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", - " '2f5ca7ba-3b22-4fdd-b9ae-e330b4e964e6',\n", - " '376b5875-649a-4513-a4aa-cc48a8d2733e',\n", - " '1016f308-5d80-46be-8e84-fe2f01c80c66',\n", - " '94493206-f114-40bc-b604-94211c699494',\n", - " '539b485d-f50b-4ea5-af49-aa695ab6d299',\n", - " '58984dc6-6d47-40f0-b524-840c26f1e605',\n", - " '14a439aa-d30c-49f5-a2e0-39834229ef34',\n", - " 'a2c0a444-c823-486c-83da-9108962bb488',\n", - " 'f2b521ae-5633-482e-97b3-566d23c2b1ab',\n", - " '9780c27b-97f5-4da8-a328-4b8ee7cb767a',\n", - " '6e4c20fc-8a0f-4079-b598-42cfbc1ffda5',\n", - " '849a4bc7-4990-43d6-96ea-c7c4a6dd00a8',\n", - " 'a38c3b8c-cd70-494e-b1c7-68d031b45d50',\n", - " '6393ee7a-eabd-47c5-bf81-f0d232faec86',\n", - " 'f591080a-530f-410f-9c0e-5ec0ac15d3ac'], dtype=object), 'relationship_ids': array(['a34cb6b0-15f5-4223-a5d6-2e0050c37832',\n", - " '8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", - " 'eee8269b-1ccc-4abc-9f66-d0b2e0898525',\n", - " '219c6313-0e8d-46c0-8f3b-8e276cce1d78',\n", - " '45ee10ab-f264-4d64-af1f-cdc970658181',\n", - " 'c6379c2b-92f2-4c17-862f-06a57e3bcb9b',\n", - " 'e9ccdb15-87a1-47f9-91ec-f8718e7f4617',\n", - " '3bb2c48b-8c9d-40e3-96bf-06c3a57ac4ec',\n", - " '5951c936-27b2-4684-b436-ef731c1455b5',\n", - " '332a2299-2d2b-453d-a102-7874fa211715',\n", - " 'a32845b2-2dc6-4d01-8b09-d7df08e2a652',\n", - " '2006abf7-697a-41ed-bd02-fe7761220fcf',\n", - " 'ffcfe70b-aa11-47d2-a9b4-f14d8829d290',\n", - " '069e6dc3-5438-4b46-9419-89ab524803bb',\n", - " 'c38db5cf-c3c3-4c25-8b5d-7670d6b270c1',\n", - " '8f471fbe-c1fa-4dd2-8a06-edfbac2a6d3a',\n", - " '0cb247b7-2512-433c-ac1f-d2f059228753',\n", - " 'a6a841f8-7e90-4570-95d1-e2f7d7817fe2',\n", - " '3bbb70c3-7ad1-4bb0-9578-c766db5bc6b7',\n", - " 'a3958ef5-9e40-46c8-b295-bf7e82fbffed',\n", - " '4757edd6-889b-4c9e-b9f2-da18b698ba13'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[12]\n", - "document_ids\n", - "{'Index': 13, 'id': '86e807f0cd07552efb18b1522b5ebb0f1e29dbafb18ceed16863a0b3a5b419cbc60e1815556c0e98181358e77794b8c03c5d3ec8d5da71105f04d0ca6b64f2c8', 'human_readable_id': 14, 'text': '8 SOLDERING PROCESS Table 1.1 Common printed circuit board laminate materials, listed alpha- betically by BS/IEC laminate code classification. Where applicable, the non- existent NEMA LI 1 classification is also listed . . . . Classification Base materials NEMA LI1 BS 4584/IEC 249 II I im I EP-GC Epoxide resin, woven glass fabric, bonding sheet for multi-layer printed circuit boards Epoxide resin, non-woven EP-GCA-Cu glass filaments in addition to woven glass fabric, copper conductor G-10, G-11, FR-4, Epoxide resin, woven glass EP-GC-Cu FR-5, CEM- 1, fabric, copper conductor CEM-3 X, XP, XPC, XX, Phenolic resin, woven glass PF-CP-Cu XXP, XXPC, XXX, fabric, copper conductor XXXP, XXXPC, FR-2 Polyethylene terephthalate PETP-F (polyester) films, adhesive coated cover sheet for flexible printed circuit boards Polyethylene terephthalate PETP-F-Cu (polyester), flexible, copper conductor PI-F Polyimide film, adhesive coated cover sheet for flexible printed circuit boards Polyimide, flexible, copper PI-F-Cu conductor Si-GC-Cu Silicone resin, woven glass fabric, copper conductor Soldering Soldering is unique in that it provides the functions of mechanical and electrical support cheaply and easily. Solders used for electronics assembly melt at temperatures around 185~ or so, therefore quite simple equipment (a soldering iron, say) can be used to create individual soldered joints. Joints are formed by metallic bonds between the metals in the joint area (usually the copper track of a circuit board and component leads) and the solder. Modern solder is an alloy, usually of tin and lead (although other alloys are occasionally used, and selected impurities may be added to a conventional tin/lead solder to create changes in properties, as required), \\n\\n8 SOLDERING PROCESS\\n\\n.\\n\\n.\\n\\n.\\n\\n.', 'n_tokens': 560, 'document_ids': array([13]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", - " '94493206-f114-40bc-b604-94211c699494',\n", - " '93e7813e-38f4-4829-ab26-38d800c3a3d0',\n", - " 'fccb74a6-7455-4715-a1a5-af20f97e0637',\n", - " '01083577-7bf5-4f4e-be34-b5d324bf42bc',\n", - " '23ada268-7c73-4204-a564-0401851b7f81',\n", - " '43951aac-5f0e-47e3-b932-be4b424eee33',\n", - " '7a87b484-5d29-49e0-b4d8-6a11bfb27ecf'], dtype=object), 'relationship_ids': array(['8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", - " '40352a88-51c2-40e3-8bb9-a4ed5cb2a1b9',\n", - " '6b747922-8cf5-49ea-b003-2102803cc6a3',\n", - " '2c24aac4-cdf1-4e94-b2ba-386288646ff6',\n", - " 'd9584886-82d3-4cff-a117-aa8f9119689a',\n", - " '859f0a2a-2e28-4de7-92f6-42bd8a8d38d9',\n", - " '9fca2d0a-cbfb-4231-b8ec-02ec6ee9ddab',\n", - " '1c9c04ac-2251-4813-977c-7766d2e8db38',\n", - " '0395d320-7f6c-422f-9a3e-61134b592d77',\n", - " '6b399287-be0f-4b58-a0c6-11e724a2e3b8',\n", - " '73323f3e-b0e5-40c3-a596-4ec35da1f06d'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[13]\n", - "document_ids\n", - "{'Index': 14, 'id': '1a59e1c00640a2839652f1862c3b5afd4d510fceb6129128176dd7f45e1f3634871cb63dd617a074f90cf18529362616e6e8cfc4380e9c6cbc3bb934183ff2d1', 'human_readable_id': 15, 'text': 'G-10, G-11, FR-4,\\n\\nX, XP, XPC, XX,\\n\\nXXP, XXPC, XXX,\\n\\nXXXP, XXXPC,\\n\\nfabric, copper conductor\\n\\nSoldering\\n\\nSOLDERING 9 Table 1.2 Letter codes for printed circuit board types NEMA LI1 Description Letter code BS 4584/IEC249 I I II Cellulose paper CP Copper conductor Cu EP Epoxide resin Flexible F Woven glass fabric GC Woven glass fabric with reinforce- GCA ments of non-woven glass filaments Polyethylene terephthalate (polyes- PETP ter) Phenolic resin PF Polyimide PI Silicone resin Si Flame retardant FR Glass fabric reinforced G Punchable, if heated to between 50 P and 80~ PC Cold punchable, above 25~ Paper reinforced, poor electrical X characteristics XX Paper reinforced, fair electrical characteristics Paper reinforced, good electrical XXX characteristics which melts at a lower temperature than either of the metals to be joined this means that joints can be made to metals which form the leads of otherwise quite fragile components. Further, the reasonably low melting point means many joints may be soldered at the same time with little fear of damaging components. On the other hand, where many joints are to be formed simultaneously, equipment becomes rather more elaborate, simply because of the problems associated with handling solder in molten bulk. Note also that lead in solder may not have a very long life. Legislation may exist in the long-term, to prevent the use of lead as a constituent of solder. The process of soldering only occurs on certain surfaces, usually metallic, and does not occur on insulating surfaces- this means solder may be applied in excess. Alternatives to soldering ~ welding, conductive adhe- s i v e s - require much more complex equipment. In the case of welding, the greater heat required to create a welded joint precludes welding many joints en masse. Even welding joints consecutively may damage the component being welded. In the case of conductive adhesives, accuracy is extremely i m p o r t a n t - adhesive will adhere to conductors and insulators alike so if it conducts also, short circuits are probable. ', 'n_tokens': 595, 'document_ids': array([14]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " '2cce6e88-2cf9-4a9e-bd24-cb711029b725',\n", - " '94493206-f114-40bc-b604-94211c699494',\n", - " '539b485d-f50b-4ea5-af49-aa695ab6d299',\n", - " '93e7813e-38f4-4829-ab26-38d800c3a3d0',\n", - " 'fccb74a6-7455-4715-a1a5-af20f97e0637',\n", - " '01083577-7bf5-4f4e-be34-b5d324bf42bc',\n", - " '23ada268-7c73-4204-a564-0401851b7f81',\n", - " '7a87b484-5d29-49e0-b4d8-6a11bfb27ecf',\n", - " '6d3d25a3-eb39-4695-981d-ab271d0e39e2',\n", - " '88b58a69-e708-42be-8ff3-1ee979707da2',\n", - " '82b15790-e102-4110-8a33-1bac8facba56',\n", - " 'c5d69bb9-8b43-4239-a9c6-dea0bb999d63',\n", - " '1c4f4636-ee3d-4bad-8c92-23d372420775',\n", - " '223e031e-2f17-44c5-9f17-64f9d9be8aa0',\n", - " '324ee029-1a64-4ab4-b9df-18612987f0c7',\n", - " 'ca9b8ee4-e16c-4148-9c2b-0d1f9c1acdd0',\n", - " 'bb1cc416-d2dc-462e-a121-5dd775666bcc',\n", - " 'fdc93acc-bff3-45a2-837e-5bae1cfb926a',\n", - " '85509413-24bd-4589-b44b-905d4444731b',\n", - " '55a5f869-e9fc-4abb-bd06-8d1eb8194738',\n", - " 'aae0917e-f034-456e-8762-b4a4db48dcde',\n", - " 'aaa57c8d-ba94-439b-8d0c-62b7e2b96ffa',\n", - " '4a5e3682-73ef-420f-bd35-af99e9276dc8',\n", - " '7dd57760-e886-47e4-a738-dc5516e36c2a',\n", - " 'a294b01d-8ee3-4747-9634-bed3e72332b6',\n", - " 'cb49507f-9f33-43e8-af3e-79c47be0da8f'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", - " '2d350acf-a67b-4201-81c5-de297dfc85fd',\n", - " 'df5be79d-40b1-4cc1-9aed-4d628daf9769',\n", - " '7e09c411-eda6-4d5b-bf1f-db7c02e9fcdd',\n", - " '854eb166-3293-4bd4-8191-b375ab65de9d',\n", - " '9bd122e8-ea17-4de0-82bd-fa334dba7558',\n", - " '1717b061-4b0a-482a-b58c-07136913c93b',\n", - " 'f77de575-5475-4e0a-be04-15ff4a7152c0',\n", - " 'b476171c-19bb-47eb-9c1a-6b7f66773085',\n", - " '6796f568-80df-4fa1-bb53-6078c6e56ec8',\n", - " '9990f77c-9ed8-4e25-8226-21a9d5e40367',\n", - " '40d197ce-e4e6-4c9d-9bd2-a98f73c98b3c',\n", - " '09212d1c-ee31-4d8f-973e-469493d5f3dc',\n", - " '0def4a3d-f583-4475-87b2-b069cf3b036c',\n", - " '8d0a7c45-5ce3-4947-9281-ebf1ef4eb629',\n", - " '82c19143-7d3a-4afc-b0ba-f41404712e50',\n", - " '9b77d87e-8dcd-4e50-8ab3-a74998a27140'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[14]\n", - "document_ids\n", - "{'Index': 15, 'id': '0d7dc0d9676baa2f9771b10139516bef4c57f6e546d2d67d5d46167b846bc4c79bd06505419f3bb5fd9cd0d111e1183040c0ecd491324d60d8fc412f421380c4', 'human_readable_id': 16, 'text': 'SOLDERING 9', 'n_tokens': 5, 'document_ids': array([15]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233'], dtype=object), 'relationship_ids': None, 'covariate_ids': array([], dtype=object)}\n", - "[15]\n", - "document_ids\n", - "{'Index': 16, 'id': 'f556aa8295501d597ea20c10678fc60e0f028ffdb5e687d7b81783b66fac900a5a0d69ec5fb918a79c255b846a950713169e934e7c4388f728840c3e61fe73c9', 'human_readable_id': 17, 'text': \"ments of non-woven glass filaments\\n\\ncharacteristics\\n\\nit conducts also, short circuits are probable.\\n\\ns\\n\\ne\\n\\nt\\n\\na\\n\\n0\\n\\n0\\n\\n0\\n\\n5\\n\\n5\\n\\nn\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\ni\\n\\nm\\n\\na\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\nl\\n\\n0\\n\\n0\\n\\n0\\n\\n5\\n\\n2\\n\\n2\\n\\n0\\n\\n0\\n\\nd\\n\\n1\\n\\n3\\n\\n3\\n\\n2\\n\\n8\\n\\n8\\n\\n8\\n\\n7\\n\\nr\\n\\na\\n\\no\\n\\n5\\n\\n5\\n\\nb\\n\\n7\\n\\n7\\n\\nt\\n\\n9\\n\\n9\\n\\n3\\n\\n9\\n\\n6\\n\\n6\\n\\n6\\n\\n6\\n\\n3\\n\\n7\\n\\ni\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\nu\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\nc\\n\\nr\\n\\ni\\n\\nc\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n7\\n\\n5\\n\\n7\\n\\nd\\n\\n0\\n\\n0\\n\\n1\\n\\n1\\n\\n0\\n\\n1\\n\\n3\\n\\n3\\n\\ne\\n\\n~\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\nt\\n\\n0\\n\\n0\\n\\nn\\n\\ni\\n\\nr\\n\\np\\n\\nd\\n\\n5\\n\\n5\\n\\n5\\n\\na\\n\\n0\\n\\n0\\n\\n1\\n\\n1\\n\\n0\\n\\n1\\n\\n5\\n\\n5\\n\\n,\\n\\nl\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\ni\\n\\n.\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\nc\\n\\n0\\n\\n0\\n\\nn\\n\\no\\n\\n5\\n\\n5\\n\\n5\\n\\nm\\n\\nTable 1.3 Summarized properties of common clad printed circuit board laminates (s} au 8uruang a8vsaan :Aryiqoununp yp (:4UNW) yiSuass xapy (AUN) -1u8 7G] ‘Bunvjd saifo yBuais aag (4UN4) -4U8 ZG] ‘aansodxa iuaajos saifo ysSuaas jaa (,4UNY) U8 ZS] ‘Iway Kap saifo wBuans jaa (UN) ,2u8 ZS] yous way saifo ysSuads jaag (N) M8 Cog ‘yISuads ffo-]Ng (N) 448 ZG] “ys8uadss ffo-rng Papis-aqqnop ‘wu 9°] 13 COE ‘isin dof anjoa a Papis-ap8uis ‘wiu 9°] ‘18 COE ‘simu sof anjoa a Papis-ajqnop ‘arpununy wu gf ',.w3 Cog ‘Mog sof anjpa p Papis-ap8uis ‘appunupy uu g°f ',4u8 Cog ‘Mog sof anjpa p anjDA WNUMIXDU ‘TuasUDdT SSOT anjon wnwixou ‘Apaninasad (wes) anjoa wmurunu ‘X419002a4 pup inay dwop saifo Anausisas aunjor (wasp) anpos unururt ‘4D, 001 40 DoSZI 12 Kyausisas aunjop, (GW) anjoa wnununu ‘k19a02a4 pup ray dwvp saifo auvisisaa aovfing (OW) anjos wn ‘45.001 40 Do$Z] 10 aouvisisas aovfing (Uw) -1u3 CoE 1 ptof fo aaunisisay Laminate 300 300 250 0.9 0.9 0.9 1.1 23 20000 5.5 0.04 100 1000 50000 500 50000 3.5 3.5 EP-GCA-Cu-16 3.5 500 50000 EP-GC-Cu-2 10 10 11 23 0.04 100 20000 5.5 EP-GC-Cu-3 11 23 100 20000 5.5 0.04 0.375 0.375 1,05 1.05 1.05 0.5 10° 10° 100* 1000 15* 3.6 3.5 3.5 3.5 3.5 3.5 PETP-F-Cu-9 82 0.6 0.6 0.6 1.05 1.05 1.05 1.05 1.05 1.05 PF-CP-Cu-5 15 15 10 82 30. 13 «10 «45 = «45 30 13° «10 «64545 0.08 61 5.5 0.06 61 10* 500 7 15* 1000 PF-CP-Cu-6 70 80 1600 100* 1000 PF-CP-Cu-8 PF-CP-Cu-14 PI-F-Cu-10 0.375 0.375 0.5 0.5 10° 105 50000 100 0.7 18 14 63 63 07 15 0.008 23 10000 4 3.5 Si-GC-Cu-13 Notes: Numbers at end of laminate code are serial numbers, indicating the part of BS 4584 which applies. Tests as defined by BS 4584 Part I.\", 'n_tokens': 1200, 'document_ids': array([16]), 'entity_ids': array(['7dd57760-e886-47e4-a738-dc5516e36c2a',\n", - " 'f5c8921c-c699-41de-b3cc-326083603847',\n", - " '3c9dfd31-d15c-4a11-87f5-548fd7559540',\n", - " 'ac29c565-4fb8-406a-b065-2996b10bcd59',\n", - " '0c16c5a2-f649-48a4-9d90-70b60cf67f68',\n", - " 'aed3fac6-3ada-4e29-abb4-f4d84f378e4d',\n", - " '9e8acec3-51dc-4af4-9fba-11ce8c18120e',\n", - " '637c3cca-3d87-4745-8885-8b5cc472820d',\n", - " 'd5fa6976-d479-42cd-b783-7dd116cae248',\n", - " '79cbca31-e454-4ff3-8cc5-405177a28f2d',\n", - " '53fa842c-56d9-43d4-a710-27f4175b5be1',\n", - " '983d6252-0a96-4462-bb84-4f9190ca063a',\n", - " '313aa6b5-9a08-4ad2-b031-dbb3bfa7669b'], dtype=object), 'relationship_ids': array(['79311ffd-af30-450a-a1dd-8f37a1deb783',\n", - " 'f8018f47-0394-4317-b661-c390db5f3845',\n", - " 'ca684eba-c21f-459e-a9ab-5320b44e0eca',\n", - " 'b6d81ed4-b869-4ddf-b17d-bb3c4d700ca6',\n", - " 'f9d70230-f816-4042-b8d3-420ef978bc79',\n", - " '8695c374-f48c-470a-a600-0e4aea031fc9',\n", - " '2ec72e4d-4036-41b2-975a-eaf1b233b18c',\n", - " '51dcdeea-90b3-463b-8de7-dce6cc383c4d',\n", - " '5222b841-f477-4332-8640-d723ab973830',\n", - " '428714ca-463c-4018-8f7a-0f4a7edaaf32',\n", - " 'ebf977b7-3e83-4696-8fa3-058fc0c7c7a4',\n", - " '4407114b-b2d7-4ce5-a4d5-3b4c8cbc89c5'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[16]\n", - "document_ids\n", - "{'Index': 17, 'id': 'de4df10495e8805723fd3fc3e38200e07df57f04af9b050235a7a578aff153ed39c76da505d49cfc248e9824175dbb55710b94c162d098d08fcf7ae160bd4d48', 'human_readable_id': 18, 'text': '-10 0.375 0.375 0.5 0.5 10° 105 50000 100 0.7 18 14 63 63 07 15 0.008 23 10000 4 3.5 Si-GC-Cu-13 Notes: Numbers at end of laminate code are serial numbers, indicating the part of BS 4584 which applies. Tests as defined by BS 4584 Part I. Letter codes as defined in Table 1.2.\\n\\n0\\n\\n0\\n\\n0\\n\\n1\\n\\n1\\n\\n1', 'n_tokens': 122, 'document_ids': array([16]), 'entity_ids': array(['e64be43c-eec3-4b43-9ada-1626c2ae562c',\n", - " 'cee3b8ea-313a-4439-b852-19415641f7be',\n", - " 'f9ad3d3d-9ba7-4808-8fea-4fa02dec8684'], dtype=object), 'relationship_ids': array(['8e9ae737-6718-4295-878c-8dfcbcb0626e',\n", - " 'd37b3443-8010-431f-97ef-eba31cc44e4c',\n", - " 'e0aad12c-be96-4f24-9feb-9ae2018f3fbd',\n", - " '39e5b213-f464-4bc4-9e4a-2c04347a9d24'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[16]\n", - "document_ids\n", - "{'Index': 18, 'id': '56e599f7cd1b7256d3c64ec639f6ce724ab2ad77cd243a35f7aa4f9cd734f0191208bef3db111b9e04355cce8cc3070b09199c0021500ef43760065dbc14160c', 'human_readable_id': 19, 'text': 'm\\n\\n.\\n\\n.\\n\\n1\\n\\n1\\n\\n0\\n\\n0\\n\\no\\n\\nc\\n\\nf\\n\\n0\\n\\n0\\n\\n0\\n\\ni\\n\\no\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n3\\n\\n9\\n\\n9\\n\\n9\\n\\n4\\n\\n4\\n\\n4\\n\\n4\\n\\n6\\n\\ns\\n\\ne\\n\\n.\\n\\ns\\n\\ni\\n\\ne\\n\\nt\\n\\ni\\n\\nr\\n\\n0\\n\\n0\\n\\n0\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n3\\n\\nl\\n\\ne\\n\\np\\n\\n6\\n\\n6\\n\\n6\\n\\n4\\n\\n4\\n\\n4\\n\\n4\\n\\n6\\n\\np\\n\\np\\n\\no\\n\\na\\n\\nr\\n\\nh\\n\\np\\n\\n4\\n\\n4\\n\\n4\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n4\\n\\nc\\n\\n~\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\ni\\n\\nd\\n\\nh\\n\\ne\\n\\nw\\n\\nz\\n\\ni\\n\\n4\\n\\nr\\n\\n8\\n\\n8\\n\\n8\\n\\n3\\n\\n3\\n\\n8\\n\\n3\\n\\n3\\n\\n~\\n\\na\\n\\n8\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n5\\n\\nm\\n\\n4\\n\\nm\\n\\nS\\n\\nu\\n\\n5\\n\\n5\\n\\nB\\n\\n5\\n\\n5\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n~\\n\\nS\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n3\\n\\n3\\n\\n3\\n\\n3\\n\\nf\\n\\no\\n\\nt\\n\\n3\\n\\nr\\n\\n3\\n\\n3\\n\\n3\\n\\n1\\n\\n3\\n\\n1\\n\\n1\\n\\n1\\n\\n.\\n\\na\\n\\n2\\n\\n2\\n\\n2\\n\\n6\\n\\n1\\n\\n6\\n\\n6\\n\\n6\\n\\n2\\n\\np\\n\\ne\\n\\ne\\n\\nh\\n\\n8\\n\\nl\\n\\nb\\n\\n4\\n\\n4\\n\\n4\\n\\nt\\n\\n7\\n\\n6\\n\\n8\\n\\n0\\n\\n7\\n\\n0\\n\\n0\\n\\n0\\n\\na\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\ng\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\nT\\n\\nn\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\ni\\n\\nt\\n\\na\\n\\nc\\n\\ni\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\nd\\n\\n,\\n\\n~\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n5\\n\\n5\\n\\nn\\n\\n5\\n\\n7\\n\\n7\\n\\n4\\n\\n5\\n\\n6\\n\\n4\\n\\n4\\n\\ni\\n\\n,\\n\\ns\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\nr\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\ne\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\nb\\n\\n6\\n\\n6\\n\\n0\\n\\n6\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n,\\n\\n0\\n\\n0\\n\\nm\\n\\n~\\n\\ng\\n\\n1\\n\\n1\\n\\n1\\n\\n~\\n\\n1\\n\\n2\\n\\n2\\n\\n2\\n\\n5\\n\\n5\\n\\n5\\n\\nu\\n\\nn\\n\\nl\\n\\n0\\n\\n0\\n\\n0\\n\\na\\n\\n\"\\n\\n\"\\n\\n0\\n\\n.\\n\\n0\\n\\n0\\n\\n5\\n\\n5\\n\\ni\\n\\n0\\n\\n0\\n\\nP\\n\\nr\\n\\n~\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n,\\n\\n1\\n\\n1\\n\\n.\\n\\ne\\n\\ns\\n\\n.\\n\\ne\\n\\n.\\n\\n.\\n\\n2\\n\\nr\\n\\n.\\n\\n0\\n\\n0\\n\\n0\\n\\n1\\n\\n0\\n\\na\\n\\n.\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n1\\n\\n0\\n\\ni\\n\\nt\\n\\ne\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n.\\n\\n0\\n\\n5\\n\\n5\\n\\nr\\n\\n~\\n\\nd\\n\\ne\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\n0\\n\\na\\n\\nl\\n\\no\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\nP\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n.\\n\\nb\\n\\nc\\n\\na\\n\\n4\\n\\n0\\n\\nT\\n\\ne\\n\\n\"\\n\\n\"\\n\\n.\\n\\n8\\n\\n0\\n\\n0\\n\\nt\\n\\n0\\n\\n0\\n\\n0\\n\\n\"\\n\\n\"\\n\\n5\\n\\na\\n\\nn\\n\\n0\\n\\n0\\n\\n5\\n\\n0\\n\\n5\\n\\n0\\n\\n.\\n\\n0\\n\\n.\\n\\n,\\n\\nn\\n\\n4\\n\\n9\\n\\n.\\n\\ni\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n1\\n\\n5\\n\\n5\\n\\ni\\n\\nd\\n\\nm\\n\\nS\\n\\ne\\n\\nB\\n\\na\\n\\nn\\n\\nl\\n\\n6\\n\\n5\\n\\ni\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\n5\\n\\ny\\n\\nf\\n\\nf\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\n.\\n\\ne\\n\\nb\\n\\n3\\n\\n3\\n\\n3\\n\\n3\\n\\n3\\n\\no\\n\\n3\\n\\n3\\n\\n3\\n\\n3\\n\\n3\\n\\nd\\n\\nd\\n\\nd\\n\\ns\\n\\ne\\n\\nn\\n\\na\\n\\nn\\n\\ne\\n\\n6\\n\\ni\\n\\ns\\n\\n1\\n\\nf\\n\\nt\\n\\ne\\n\\n4\\n\\na\\n\\n9\\n\\ne\\n\\n3\\n\\n2\\n\\nd\\n\\n3\\n\\n1\\n\\nu\\n\\nd\\n\\n1\\n\\n6\\n\\n5\\n\\n8\\n\\ns\\n\\ni\\n\\no\\n\\n0\\n\\nu\\n\\nC\\n\\nu\\n\\nr\\n\\nu\\n\\ns\\n\\n1\\n\\nc\\n\\nC\\n\\nu\\n\\nu\\n\\nu\\n\\nu\\n\\nu\\n\\ne\\n\\na\\n\\nC\\n\\nC\\n\\ne\\n\\nC\\n\\nC\\n\\nC\\n\\nC\\n\\nA\\n\\nb\\n\\nr\\n\\nC\\n\\nt\\n\\nu\\n\\ns\\n\\nF\\n\\ne\\n\\nm\\n\\na\\n\\nC\\n\\nC\\n\\nC\\n\\nt\\n\\nt\\n\\nC\\n\\nP\\n\\nP\\n\\nP\\n\\nP\\n\\nC\\n\\ns\\n\\nt\\n\\nn\\n\\n:\\n\\nP\\n\\nu\\n\\nG\\n\\nG\\n\\nG\\n\\ne\\n\\ne\\n\\nC\\n\\nC\\n\\nC\\n\\nC\\n\\ns\\n\\ni\\n\\nG\\n\\nN\\n\\nF\\n\\nT\\n\\nL\\n\\nT\\n\\ne\\n\\nm\\n\\nt\\n\\nP\\n\\nP\\n\\nP\\n\\nE\\n\\nF\\n\\nF\\n\\nF\\n\\nF\\n\\na\\n\\no\\n\\nI\\n\\ni\\n\\nE\\n\\nE\\n\\nE\\n\\nP\\n\\nP\\n\\nS\\n\\nP\\n\\nP\\n\\nP\\n\\nP\\n\\nL\\n\\nN\\n\\nSOLDERING 11 Requirements of the soldering process There are a few important points to be understood when studying the soldering process. In its simplest form, soldering is uncomplicated. Production of a soldered joint requires only that the parts to be soldered are positioned to remain relatively immobile. The surfaces are then', 'n_tokens': 1200, 'document_ids': array([17]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233'], dtype=object), 'relationship_ids': array(['e392a126-318f-42a9-a79b-57c933396592'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[17]\n", - "document_ids\n", - "{'Index': 19, 'id': 'a0c453bc816c51704d6ede3b576507b6ce0fd998fe8bbc7a240d3b23962a0831e8dad3bfa477b88529360bdb9ea4ef01322460768e4b34dd5396d1fc10602d48', 'human_readable_id': 20, 'text': '\\n\\nF\\n\\na\\n\\no\\n\\nI\\n\\ni\\n\\nE\\n\\nE\\n\\nE\\n\\nP\\n\\nP\\n\\nS\\n\\nP\\n\\nP\\n\\nP\\n\\nP\\n\\nL\\n\\nN\\n\\nSOLDERING 11 Requirements of the soldering process There are a few important points to be understood when studying the soldering process. In its simplest form, soldering is uncomplicated. Production of a soldered joint requires only that the parts to be soldered are positioned to remain relatively immobile. The surfaces are then heated to allow coverage with molten solder, and the solder is allowed to cool and solidify. However, controlling this process are five variables: @ flux @ wetting @ heat @ solderable surfaces @ time. Flux In most cases, a substance called flux is used in the process, primarily to clean thesurfaces to be soldered and so aid wetting. However clean they are, all metals (with the exception of the noble metals) oxidize to form an oxide layer on their surfaces. Other tarnish products may occur, too. Presence of any tarnish layer will prevent wetting. Flux reacts with the tarnish layers, leaving a pure base metal surface for the solder to wet. A secondary function of the flux is to reduce the solder’s surface tension, so increasing the solder fluidity and aiding wetting. Another is to protect the metal surface during subsequent heating. Heat Application of heat is a prime requirement of any soldering process: solder has a melting point of, typically, around 185 °C. So, to enable its application, the solder has to be heated to at least this temperature. This can be done, in the three extremes, by: @ heating the joint before solid solder is applied (for example, when hand soldering) @ heating the solder until molten before application to the joint (say, in wave soldering) @ applying solder to the joint, then heating both (say, simple infra-red soldering techniques). While techniques exist formed by just one of the three extremes, many', 'n_tokens': 409, 'document_ids': array([17]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", - " 'f6597ab9-ad3b-40e9-8402-08c0cc2cadc5',\n", - " '1e1d9248-6728-4bb6-8815-5881e3bc8ccf',\n", - " '1d1f23b1-85c7-4713-9237-5252052a1fc0',\n", - " '70a5ae8e-88f6-462f-bc8e-3398563a98b1'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", - " '31e3f92c-3b87-4ba8-9ba4-668c7adb4ab3',\n", - " 'bbe7a523-3103-44aa-9a50-138f7965e1f0',\n", - " '0bdfdb0f-b85d-42d1-a246-c0348befe9b7',\n", - " '0a862684-6405-43e5-b3b3-fd496d659b1c',\n", - " 'ca2e5b46-d130-4981-81f0-6d5184242032',\n", - " 'd8c8a490-eb20-4b1a-8751-ddc4375c4038',\n", - " '953fdc56-f4f1-47f5-86ea-bbd082793226',\n", - " '269b070d-f55c-4be8-83ac-a5e6c1ce7bfa'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[17]\n", - "document_ids\n", - "{'Index': 20, 'id': '65940240cc8ba7ba8a918c0bdb7d4bc7bcc2bc625efcaf67cd8188f2ae96aff8d9781ebf0b3517316db2c377da04986bb9e96289d6ad80a570867d75403fe6a5', 'human_readable_id': 21, 'text': \"SOLDERING 11\\n\\n12 SOLDERING PROCESS soldering processes are elaborate mixtures of two or all three. Note, it is not a prerequisite that the joint be heated prior to application of solder although, for convenience, it often is. Wetting Wetting is the process in soldering where the solder comes into direct metallic contact with the metals to be soldered together into a joint, forming a specific alloy of solder and metal at the junction. In turn, this implies a joint's metallic surfaces should be so clean that metallic contact can be made. Often, the term intermetailic is used to describe the bond which occurs between solder and metal when the solder wets the metal (as in intermetailic bond). This is incorrect: it is, in fact, a strict metallurgic term referring to intermetallic compounds, compounds of elements whose atoms have an so high an affinity that their extremely high affinity for each other ~ presence denies bonding of other elements by other means. To appreciate the difference between intermetallic compounds and alloys it's important to realize that intermetallic compounds have fixed stoichiornetric ratios. Alloys, on the other hand, have ratios of metals which can vary. Wetting occurs when solder comes into intimate contact with the metal atoms. If the metal surface is perfectly clean and metal atoms are present, then the solder wets the metal, forming a bond with the metal atoms at the interface (Figure 1.4). Once this interfacing bond, an intermetallic com- pound as it happens, has been created it cannot be removed. If, on the other hand, the metal is unclean in any way, say, it is oxidized (Figure 1.5) such that metal atoms are not present on the surface, then wetting cannot occur ~ in a s imi lar way to which a drop of water on a greasy surface will remain as a droplet. Figure 1.4 Intimate contact between solder and a metal surface occurs when wetting takes place. An intermetallic compound is formed at the interface between the two \", 'n_tokens': 628, 'document_ids': array([18]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " 'ba9a83b2-feee-4c92-854a-9d1fe90ce2f6',\n", - " '16238137-d2e4-4317-9714-26121f9d0791',\n", - " '6fa7c0df-6ed8-4359-9e01-ed6e7894574a',\n", - " 'fa6d4e6f-287b-482d-857e-d957d01573c1',\n", - " 'c36aa806-38ca-4f03-b719-0e6424439baa'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", - " '52ba87ba-30df-4572-b629-01cea97a8fc8',\n", - " 'bbe7a523-3103-44aa-9a50-138f7965e1f0',\n", - " '10fd896d-d40a-4cca-82ad-38970e91b020',\n", - " 'd5d1d33a-5d97-4b32-bde1-24f923873199',\n", - " '48b9579e-e423-4d5b-9364-e09139329be2',\n", - " '8800987a-ac89-49d5-98eb-0ecc9b8fe66e',\n", - " '97e5386b-eb32-4dd2-a5d2-30fe884ec221',\n", - " '4e3d3993-5ded-4d5b-8c56-fe3be22332cc',\n", - " 'd704fbac-1aeb-456a-982c-7b498d35abda',\n", - " 'e6fbba99-9e7d-4f4f-bd40-a1f2e1cd2611',\n", - " '9ca21521-dccb-46c6-aec1-d3129ee44a9f',\n", - " '6bb3be5b-f292-490c-ac6b-59f30675bb0e'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[18]\n", - "document_ids\n", - "{'Index': 21, 'id': '7667a8c72d42588978049d5ad2bf08a0fa0fbddc88c2fae6ff011dda087c13f87eb2c27a5c84fe55a2ada4ca66f77fc3fc9109cf3b7603a88235095a1d069309', 'human_readable_id': 22, 'text': '12 SOLDERING PROCESS\\n\\nSy ebay. ee Dae aa ee Solder / Interfacing alloy Base material\\n\\nFigure 1.5 If a contaminant such as oxide is present on the metal surface prior to soldering, no intermetallic compound is formed so wetting cannot take place In context with the wetting of metals, two other terms need to be defined. The first is non-wetting, where part or all ofthe metal to be soldered is devoid of solder. Usually this occurs where a contaminant or oxide has been left on the metal surface, so preventing the necessary alloy bond between metal and solder layer. The second is dewetting, where the alloy bond has occurred, but where the solder withdraws from the metal and forms dispersed, irregular droplets. Further solder cannot accumulate due to the high surface tension formed. Where dewetting occurs, it is sometimes difficult to determine; a simple visual check may not be sufficient. Both problems are usually caused by lack of cleanliness, although dewetting can also occur when large amounts of intermetallic compounds form. Cleaning There are two areas in which cleaning may need to take place in the soldering process. First, the metallic surfaces to be soldered together must be perfectly clean, in order that solder can wet the metals involved. Second, residues left after soldering may need to be removed. These are usually cleaning. Both are discussed in Chapter I0. Another pre-assembly area where cleaning is important, often out of the hands of the assembler, is cleanliness during board manufacture. Where an assembler simply buys-in ready-made boards, problems of cleanliness during manufacture may be difficult to isolate, and even more difficult to eliminate. Cleanliness of ready-made boards is of vital importance when \\n\\nSOLDERING 13\\n\\nBase material\\n\\nCleaning', 'n_tokens': 511, 'document_ids': array([19]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " '9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " 'ba9a83b2-feee-4c92-854a-9d1fe90ce2f6',\n", - " '849a4bc7-4990-43d6-96ea-c7c4a6dd00a8',\n", - " '16238137-d2e4-4317-9714-26121f9d0791',\n", - " '9feede66-ae26-49d7-a068-820c8276d903',\n", - " 'a91a287b-1981-4430-ab2d-cc5c22ecd17f',\n", - " '54148607-f6c4-411a-8279-f183b9832f75',\n", - " 'b04ef07d-d434-47d4-b07a-3b9162f9c734',\n", - " '77da5373-47d2-4cda-8b58-8d009b14d8fa'], dtype=object), 'relationship_ids': array(['812a7d9b-dc0b-41c3-82c6-c6b853a31898',\n", - " '52ba87ba-30df-4572-b629-01cea97a8fc8',\n", - " '982c3c90-2a0e-485b-9209-c38124f1bda5',\n", - " 'ad9e4d02-04bd-40fe-bb9c-826e6adb16b8',\n", - " 'c4c45d51-c0e1-484d-9c16-e6b976e8581d',\n", - " '55b87631-d7de-4bff-a7aa-3197eda64f49',\n", - " '94b18d2e-a5a0-4a5e-a15e-c222ccd36326',\n", - " 'b8b89be6-9b20-4b6b-974c-b7770df8e86d',\n", - " 'f9f3eeb2-aa28-4d65-951b-bf1fbe777fc2',\n", - " '09f3d4a3-0d12-4c8c-be46-c300d99ef861',\n", - " '38538fc2-a5bb-4bba-97c7-b4dc5de729e2',\n", - " 'fa9d24b7-4534-431d-8f99-9aec4b67ed26'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[19]\n", - "document_ids\n", - "{'Index': 22, 'id': 'dc2e8c15b5d493aae744d85bca7bab1092d1731d5bae9ea33a0a54253a8278901dc3b48cac40d81662101ce96239c8306e09450e4ccb5995003ff1c7b477d188', 'human_readable_id': 23, 'text': '14 SOLDERING PROCESS\\n\\ncertain fluxes (those with little reactional activity) are used. Modern trends indicate greater usage of such fluxes in the future, so clean boards are correspondingly more important. Solderable surfaces Solder will only join certain surfaces. Generally, in electronics assembly, these surfaces are of just one main type of metal\" copper. (Occasionally iron, nickel iron and brass parts are found in assemblies.) Copper is, of course, an Photo 1.1 Non-wetting, showing where copper surface is not wetted at all, so surface is visible (Alpha Metals) Photo 1.2 Dewetting, showing surface which is originally wetted, followed by withdrawal of solder, leaving an alloy bond on the copper surface (Alpha Metals) \\n\\nSOLDERING 15 extremely good electrical conductor and so is ideal for the purpose. It does, however, oxidize fairly easily in air and is generally protected somehow to prevent oxidation (which may prevent soldering taking place) prior to soldering. Ability of a surface to be completely wet by solder is scientifically measured as its solderability and the term is one of the most important in the subject of soldering. In other words, it refers to how well and how uniform the interfacing alloy bond between solder and metal is made. It fol lows that solderabil ity is concerned with every\\'aspect of the soldering process (ie, fluxing, wetting, heating, cleaning), and the main aspects of board manufacture, too (ie, copper plating, tin/lead plating, solder resist application). Further, solderability generally decreases with age, as tarnish- ing of the metals involved occurs naturally in normal atmosphere. One of the major problems of guaranteeing adequate solderability is the difficulty in measuring exactly what solderability is. Not so very long ago, solder joint quality (and hence, solderability of the metals involved) was determined by an over-simple visual check: the joint\\'s brightness and smoothness was thought an indicator of joint quality. Indeed, it sometimes still is. However, modern joints on surface mounted assemblies, say, are Photo 1.3 A computer-controlled solderability tester (Multicore) ', 'n_tokens': 630, 'document_ids': array([20]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", - " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", - " '376b5875-649a-4513-a4aa-cc48a8d2733e',\n", - " '6fa7c0df-6ed8-4359-9e01-ed6e7894574a',\n", - " '50cc1756-bfce-437f-ab0c-ca6368a9e1f9',\n", - " 'f0ce31ec-05fe-4305-8c95-7bfb766c7f18',\n", - " '99a096ae-40fc-406e-8a7d-850b5fc9e14b',\n", - " 'ba50cb78-2373-4e6b-a2ca-0e8e6ee16c06',\n", - " 'adf3db2b-4979-4010-9eb6-62dacbacdb3e',\n", - " '05e26331-0862-46a5-9117-25d6346d22f3',\n", - " 'ecef816c-96fc-42bb-8baa-234980fab402',\n", - " 'd315670e-e20f-4edc-ba59-117ed74ea47e'], dtype=object), 'relationship_ids': array(['8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", - " 'bdb96077-cda0-4f45-8704-fd634f5c37fc',\n", - " '06a68485-55a0-4e2c-aa0d-e0abd343d1f3',\n", - " '6e78c6d8-9344-4d23-bb8b-5e0b34dde0dc',\n", - " '936ac527-fba5-4991-b43e-95000cd6c374',\n", - " 'cae79a00-4197-44a0-bb98-32dee32ce53c',\n", - " '3b9c37b8-3907-429b-9d9f-6a80279a67dd',\n", - " 'f8a46cc2-84e0-49b1-81ef-b83fe1d012f6',\n", - " 'a8b11f29-2bad-4d36-96bf-3435cc7c32c5',\n", - " '4ceba80c-a835-4638-9e4b-906474df120a',\n", - " '503121c9-e402-4105-9ded-2d7cfef85427',\n", - " '19f5ffa5-e765-4c77-97a7-5e6febe8ee58',\n", - " '6facf63d-a0da-44f3-b0da-cedc2783bd93'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[20]\n", - "document_ids\n", - "{'Index': 23, 'id': '155d9f79923dc0333938001f69ec89ab3dcb90695d4882498ad831ca4f9e2a5ef1b31df1420aec6616428310c07e769b5e0aecd2f4ae1872242f48409efbafbb', 'human_readable_id': 24, 'text': \"SOLDERING 15\\n\\n16 SOLDERING PROCESS rarely bright and certainly never smooth, yet are known to be joints of perfect quality. In effect, solder joint quality can never be determined by appearance of the outside layer of the solder. Actual quality is determined solely by what has happened at the interface between the solder and the metal. As this is impossible to view, visual inspection consequently serves little purpose in assuring joint quality. More cohesive tests for solderability and for joint quality are discussed in Chapter 3. Once a board or component is known to have an acceptable solderability, it is usual to coat it with a substance known as a protective coating, in an attempt to maintain solderability. Protective coatings come in many forms, but their simple task is to cover the copper with a layer of material which doesn't oxidize so readily, yet still allows copper to be soldered to. This is only an attempt, note, as no coating can maintain solderability indefinitely. Extent to which solderability de- creases under storage conditions depends primarily on the protective coating used, but also on the storage conditions and the thicknesses of coatings, so estimates of solderable iifespans, that is, shelf-life, can only be approximate. Boards should be re-tested for soiderability after storage, before use. Protective coatings are discussed in Chapter 3. Soldering processes A number of methods exist by which electronics assembly soldering processes may be categorized, the first is whether soldering is performed by hand or by machine. Hand soldering Hand soldering is usually performed alongside hand assembly. It involves use of purpose-built tools and specific operations, which depend primarily on the components being soldered. As a complete process, hand soldering is discussed later in Chapter 7. Machine soldering Machine soldering methods are, very simply, methods to solder compo- nents into or onto a board en masse. For this reason, they are often called mass soldering methods. Primary aim of mass soldering methods is to speed up the manufacture of electronics assemblies. Another method by which soldering processes may be categorized is by the mass soldering process used. There are two main categories of mass soldering processes: \", 'n_tokens': 608, 'document_ids': array([21]), 'entity_ids': array(['f30e525a-c8f0-425c-84e2-af7d8fe5d233',\n", - " 'bd3a93e3-1708-4b43-a5b6-02c18ddb0329',\n", - " 'c60ab2cf-310c-4a04-a5e2-e66d1d891018',\n", - " '3ada60a3-da51-43db-888e-a9b604db6d0d',\n", - " 'ee7c327a-149f-469a-b850-76aff2a632f9'], dtype=object), 'relationship_ids': array(['4a872177-9a07-4c66-b5af-8f10a7ec36fd',\n", - " '03dbfe81-71c7-4126-a573-23cffe62c1ff',\n", - " '5c54d43d-8b7b-4daf-9fa1-9e9f2dc11240',\n", - " '340dcaf4-c567-40e5-8ebe-29b212e0ba68',\n", - " 'ef7bfd85-5804-4653-8b1e-1c228be2dc17'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[21]\n", - "document_ids\n", - "{'Index': 24, 'id': 'bd395976d923e5edc5ef0d815c8f4233285af367e3fe2dc647e9b3614a3ef71841c8262b9f6ffe0c0a47753420ccd58f455fe951d64e4e505cab488c2fec30c6', 'human_readable_id': 25, 'text': \"16 SOLDERING PROCESS\\n\\nSOLDERING PROCESSES 17 Q those processes which rely on the insertion or onsertion of components prior to application of solder m from here called component/solder (CS) processes m sometimes, graphically, called flow or wave soldering processes Q those processes which rely on the onsertion of components after the application of solder ~ from here called solder/component (SC) processes sometimes called reflow soldering processes. The term reflow is, however, a misnomer as it implies previously molten solder is reheated until molten once more. In many cases a solid form of solder in a paste mixture is used in SC soldering processes which, correctly therefore, cannot be referred to as reflow processes. At this point it's worth reinforcing what we've just stated. We're introducing new terms into an area already crowded with expressions describing various applications and processes in the soldering of electronics assem- blies. All we're trying to do with these new terms is to clarify the complex area. Put simply: all types of soldering processes for all types of assemblies can be categorized in just two groups ~ CS soldering processes and SC soldering processes. CS soldering processes CS soldering processes position components onto the printed circuit board then apply solder. $C soldering processes SC soldering processes, on the other hand, apply solder before positioning components onto printed circuit boards. \\n\\nSOLDERING PROCESSES 17\\n\\n18 SOLDERING PROCESS Figure 1.6 A simple form of dip soldering — lowering and remov- ing the printed circuit board near- horizontally Component/solder (CS) processes There are three main CS soldering processes: @ dip soldering @ drag soldering @ wave soldering. Dip soldering in dip soldering processes the assembled board is fluxed then lowered near- horizontally, into a bath of molten solder as shown in Figure 1.6. Once the lower edge of the board comes into contact with the solder, the board is dropped to a horizontal position on top of the solder. After a suitable period during which the solder achieves wetting over the whole of the areas to be soldered, one edge of the board is lifted (usually the edge which first came into contact with the solder), then the whole board is lifted clear of the bath. Dip soldering suffers from problems in that flux gases are easily trapped under the board and, as a consequence, contact times must be quite tong {about 10 seconds) to ensure adequate wetting and solder temperature must be quite high. Solder Drag soldering By dragging the assembled and fluxed board over the surface of molten solder (illustrated in Figure 1.7), the problems associated with dip soldering processes can be overcome. Consequent contact times are much shorter (about 5 seconds). Wave soldering Wave soldering processes use a pump to create a wave of solder over which the assembled and fluxed board is passed (illustrated in Figure 1.8). Contact times of only 2 to 4 seconds are usual, and required solder temperature is lowered.\", 'n_tokens': 745, 'document_ids': array([22]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " 'fedec16e-07cd-4e36-b2ba-08031a83bcd6',\n", - " '13c0089d-a10b-43e4-976a-eb2329e57a47',\n", - " '611056a8-b545-4b1b-885a-cee47ad71be2',\n", - " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", - " 'c7a23f85-aa84-4f73-9606-9ab32868a4ff',\n", - " '81556df2-1b3e-4fa9-b437-dcedc5993450',\n", - " 'dd197238-87ff-409f-a439-f70554061d50'], dtype=object), 'relationship_ids': array(['8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", - " 'bdb96077-cda0-4f45-8704-fd634f5c37fc',\n", - " '86058b84-eef3-4be0-bbf5-a2403b5768eb',\n", - " '776b4f2a-2196-4eeb-b313-e780ef47a02a',\n", - " '2f4e492e-6764-4fca-a856-20ee572497c6',\n", - " '46375f20-e8ab-4d34-a198-996a5d95ff58',\n", - " '3bbb14b8-d98f-4177-85d0-16ce9a7ee894',\n", - " '9537fab4-3832-46dc-8059-2a00c02b8b8d',\n", - " '859cb208-0c55-4506-b354-28399af29621',\n", - " '196f9a50-8f3c-4dfe-8f73-00e9475f0db6',\n", - " '4036ab47-9164-4ddc-a0f5-924618358602',\n", - " '35f616e6-fc1b-4740-89ee-2b0f374ec19b',\n", - " '7bbe64fc-4e5c-4135-93c9-fbd4b7519bcd',\n", - " '7767f135-2137-4c61-a924-f3d3e327fc60',\n", - " 'bf8f7dcd-342d-4950-8f57-bf3fc520f2ff',\n", - " 'c9bdcc7a-6ca6-4b66-ba0f-8169ef07dd99',\n", - " '9f2d484a-4867-4920-9293-6086155b0ccd',\n", - " '75afd003-cc11-4880-a4ab-408af615af71',\n", - " '90de5891-a438-451a-9716-dc9a04d68c4e'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[22]\n", - "document_ids\n", - "{'Index': 25, 'id': '5fa31e1008aeb700b54ab76abc0406606af242c3269030224415a49948ad12a2c6914301223ce1b8228bfdb861f8021faf6144a8813b10bc42bbf67258573379', 'human_readable_id': 26, 'text': \"18 SOLDERING PROCESS\\n\\nDip soldering\\n\\nSolder\\n\\nFigure 1.7 Drag soldering, in which a printed circuit board is dragged over the surface of molten solder Dip and drag soldering processes are older than wave soldering processes and, although both are still used, neither normally forms the preferred method in most applications. For mass CS soldering, wave soldering techniques are the norm and are discussed in depth in Chapter 7. Figure 1.8 Conveying the board over a wave of solder allows much shorter contact times and lower temperatures w the wave soldering principle Solder/component (SC) processes SC soldering processes are used, primarily, in surface mounting assembly production, where solder and flux are applied as a paste followed by the placement of components and the application of heat (Figure 1.9). SC soldering processes are often termed reflow processes, known as such because the original idea uses a layer of previously applied solid solder which is reheated to cause it to melt, that is, flow, again. Under this light, the term reflow as it is often currently used is something of a misnomer, as we've already discussed. This is simply because solder and flux paste ~ now the normal method of applying solder before components are assembled m in no way can be thought of as solid and \\n\\nSOLDER/COMPONENT/(SC) PROCESSES 19\\n\\nBoard direction\\n\\n——————> Board direction ——» ] 4 Solder wave\", 'n_tokens': 426, 'document_ids': array([23]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " '611056a8-b545-4b1b-885a-cee47ad71be2',\n", - " 'c7a23f85-aa84-4f73-9606-9ab32868a4ff',\n", - " '81556df2-1b3e-4fa9-b437-dcedc5993450',\n", - " 'dd197238-87ff-409f-a439-f70554061d50',\n", - " 'ae7b98e5-bb7b-49e7-95db-6edd737207c8'], dtype=object), 'relationship_ids': array(['3bbb14b8-d98f-4177-85d0-16ce9a7ee894',\n", - " '4036ab47-9164-4ddc-a0f5-924618358602',\n", - " '0209019c-cb4b-4c19-8aca-8f49d1c22cb2',\n", - " '27fcef77-e616-4e37-9b63-ab9ee1e250a1',\n", - " 'f688dcb0-6b7a-4ecb-a5c0-70df9dfe8554',\n", - " 'f21956ee-bf5c-4f81-a17a-fdbe1777c868',\n", - " '33228fa2-099a-4866-9cc3-f01d1cb6e196'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[23]\n", - "document_ids\n", - "{'Index': 26, 'id': 'c801548ef8989f1d2fd264b89f2bf266f61fa15e1ec455420a64fbf52f502b1b93e0eb352c6d1679ff61a04d542620a65726838305ad52b3b926518fca978a08', 'human_readable_id': 27, 'text': \"20 SOLDERING PROCESS\\n\\npreviously molten solder. Further, soldering processes can't be classified simply by the two different assembly types of through-hole and surface mount designs, because some surface mount assemblies use CS processes. Likewise, it is feasible - - though not currently usual - - for some through- hole assemblies to be soldered by SC means. As an aside here, a growing number of large manufacturers such as Motorola and Hewlett Packard are looking to produce mixed surface Figure 1.9 One type of surface mount assembly in which solder is applied, in the form of paste, before components are placed in position. Once assembled, applied heat allows soldered joints to be formed \\n\\nStage 1: application\\n\\nSurface mounted component\\n\\nplacement of components\\n\\npaste turns to solder\\n\\nStage 3: application\\n\\nCLEANING, QUALITY, SAFETY 21 mounted assemblies by wholly SC processes. By 1994, in fact, some intend to have already implemented this, and will no longer use CS wave soldering methods at all. Mass SC soldering techniques are generally categorized by type and direction of applied heat. These are all discussed (including through-hole SC processes) in Chapter 8. Cleaning While cleanliness of electronics assemblies is an asset which all manufac- turers should strive for, never has it been so important as in production of modern densely-populated printed circuit boards. The smaller the compo- nents are which are located on a printed circuit board, and the closer they are together, the harder it becomes to ensure they are totally clean after all manufacturing processes ~ particularly soldering. Environmental concerns regarding the damage which certain chemicals do to the ozone levels in earth's atmosphere has restricted the use of those chemicals. In a short time (ie, by the end of the century, say) those chemicals and indeed some others which may have otherwise been considered as alternatives ~ will not be available for use at all as cleaning agents. Consequently, manufacturers need to ensure cleaning agents which cause no danger to our environment are used in cleaning processes. Chapter 10 discusses this cleaning dilemma in electronics assembly manufacture, and describes all cleaning processes. Quality Given that a circuit is properly designed, component parts are of good quality and printed circuit boards are assembled correctly, then solder processes hold the fundamental key to an assembly's quality. Modern machine soldering equipment is capable of tremendous achievement, much ofwhich is under automatic control. While things work properly and perfect zero-defect assembled printed circuit boards are coming off the production line, everybody's happy. But what happens if things go wrong? How do you tell if a particular fault is related specifically to your solder machine or to peripheral equipment and processes? There are so many variables in production of electronics assem- blies ~ particularly in the soldering process part ~ that it is often not possible to isolate the problem and effect a cure. Answers are not always easy to come by and so for this reason we have attempted to make things just a little less complicated with Chapter 11, \", 'n_tokens': 849, 'document_ids': array([24]), 'entity_ids': array(['f8bc9ce4-e610-4af7-987c-0fac3320e2a1',\n", - " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", - " '2f5ca7ba-3b22-4fdd-b9ae-e330b4e964e6',\n", - " '4d3be32e-83b2-443d-9e2d-d45c0558ed26',\n", - " 'fe144ecb-62bc-4c59-b504-59e3202d6784',\n", - " 'd9ca88b7-9304-4760-908f-c9c277c47e5d',\n", - " '9612f71e-9e5d-4867-8156-8eabd0f1e0e0',\n", - " '3cce9fb6-93e5-4649-9031-fcd5a11e1c2b',\n", - " 'd9e3140a-5652-4b34-bdc7-95f3fdeea4a8',\n", - " 'dbe8dde0-51e7-4fbe-affa-bbe73b494fa5',\n", - " 'b3f18bfe-1e26-4e7f-a6c4-bbb37d2280b8'], dtype=object), 'relationship_ids': array(['fdf7e4b7-380f-47b7-a045-377f3f5ac74f',\n", - " '39c75377-e783-4b6c-bf01-2f5dc454f250',\n", - " '2155e85f-0318-4859-ab60-080015c96f67',\n", - " '00702642-f88f-4a8d-bf1e-a3a3dd668913',\n", - " 'b7c2b1e4-2546-40b6-8e48-cf7955d99d00',\n", - " 'e0a07b46-a117-4b5b-ad9a-4e9c4e7a30a7',\n", - " '006dbd6c-b519-4cf4-a1ef-b05d3c19cca3',\n", - " '91d53082-32f8-4c43-a1ff-4fad4b62ed3b',\n", - " '0aa34bc0-8a71-4ed5-a171-055ab0a59c75',\n", - " '893d2b0d-059e-4903-aa4c-efe069fefacd',\n", - " 'ab2ffdf0-da94-4e92-b939-fb2a3538158a',\n", - " 'e4b28831-b662-4a21-8482-6c8c11fc2da6'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[24]\n", - "document_ids\n", - "{'Index': 27, 'id': '6b0b2c3bf96b8bca3abc216941e36c7c28734f7a54ac88220aafd9b8b012d6f71aacd95ed0a6267bb7445ae5e76d356e7136c30c3f12f8769028ae515b28b602', 'human_readable_id': 28, 'text': 'Cleaning\\n\\nQuality\\n\\n22 SOLDERING PROCESS\\n\\n22 SOLDERING PROCESS which considers the question of solder process quality. In it, some examples are used to illustrate some of the main problems which occur in finished electronics assemblies. We think they form a unique collection of visual aids to assist in the identification of solder process-specific problems. Safety Soldering of electronics assemblies, indeed the whole assembly process, is a potentially dangerous procedure. You have to remember any industrial process can be lethal. Equipment in electronics assembly is often used with solvents which may be poisonous or explosive. Materials used are often flammable. In many assembly processes, particularly soldering itself, heat is a hazard when combined with these solvents and materials. Solder itself is a lead alloy, so can cause lead poisoning. In molten form solder, need we say it, is hot — very hot— usually at temperatures between 200°C and 350°C in, say, operational wave soldering systems! It can severely burn skin, and will burn through non-protective clothing to get to skin. Most equipment is of a mechanical nature, with moving parts: pulleys, sprockets, pumps, chains and so on. Fingers, hair, neckties, bracelets and so on can easily get caught in moving parts. Mechanically, these moving parts are very strong and may not be stopped simply by a trapped person trying to pull out an object caught in the machine. Serious physical injury can result. All equipment is electrically-powered. High voltages are present in various system parts. At best electric shocks make you jump. Often they cause burns and severe bodily harm. At worst they stop the heart and so kill. Safety is of vital concern to all personnel involved in soldering processes. Consequently, in Appendix 3, we consider specific safety aspects: describ- ing hazards and possible effects; suggesting ways to avoid them; and detailing first aid which may be required within the varied aspects of soldering. However, these are only items of immediate interest in soldering processes. It is strongly recommended that relevant and sufficient safety procedures be laid down and closely followed at all stages of electronics assembly. Three highly important points regarding safety throughout manu- facturing are: @ follow suppliers’ manuals and instructions closely @ invest in proper safety training @ keep up-to-date with control of substances hazardous to health regula- tions regarding such aspects as safety, materials use, materials storage.', 'n_tokens': 495, 'document_ids': array([25]), 'entity_ids': array(['9a230502-ab99-4013-8e15-1e4e0f5ca9fc',\n", - " '4b8ff990-ad5b-4342-8cc1-ac2e259b2e00',\n", - " '04433f72-4317-4aa4-a11b-97a16864a318',\n", - " '03490b81-6b05-4f75-a958-7e63a5fd3d8a',\n", - " '615d107e-b6b2-4fee-a54e-b295ad96fcab',\n", - " 'c48a373c-3a94-4fb1-9d1b-547627ba6cb4',\n", - " '6305c691-3b6f-4cf4-9772-a8028e5bf4a0',\n", - " '47c734d4-5b7e-4167-bc3c-d8d28113ae27'], dtype=object), 'relationship_ids': array(['8ad0360d-a1c9-4330-8e2b-9bf96e61aa29',\n", - " '1a0a2616-b443-44bb-b0b3-7debc3fc381f',\n", - " '1f705ef7-bda6-4fe5-8f5f-af8f7cb2e03e',\n", - " 'cd774195-12ae-4aca-9ba9-d8792dfd2dce',\n", - " '4eaa0201-13f9-42dd-80e3-066e571a4782',\n", - " 'dcc725bd-9ebf-43ba-89b1-ef006c6e2427',\n", - " '69297ee5-ffe5-45fe-a817-307e6f00e4fa'], dtype=object), 'covariate_ids': array([], dtype=object)}\n", - "[25]\n", - "document_ids\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 2 Questions ---\n", - "\n", - "Processing Question 1/2: '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" - ] - }, - { - "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 2/2: '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 Contribution to Peaceful Applications\n", - " ---\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) materials and their properties according to the British Standard BS 4584 and IEC 249 classifications. There is also mention of a now non-existent NEMA LI1 standard [Data: Source unit_text 1a59e1c00640a2839652f1862c3b5afd4d510fceb6129128176dd7f45e1f3634871cb63dd617a074f90cf18529362616e6e8cfc4380e9c6cbc3bb934183ff2d1; Source unit_text 86e807f0cd07552efb18b1522b5ebb0f1e29dbafb18ceed16863a0b3a5b419cbc60e1815556c0e98181358e77794b8c03c5d3ec8d5da71105f04d0ca6b64f2c8].\\n\\nTable 1.2, referenced in multiple sources, provides a description of these letter codes [Data: Source unit_text 1a59e1c00640a2839652f1862c3b5afd4d510fceb6129128176dd7f45e1f3634871cb63dd617a074f90cf18529362616e6e8cfc4380e9c6cbc3bb934183ff2d1; Source unit_text de4df10495e8805723fd3fc3e38200e07df57f04af9b050235a7a578aff153ed39c76da505d49cfc248e9824175dbb55710b94c162d098d08fcf7ae160bd4d48]. However, the content of Table 1.2 itself is not provided in the given data. Therefore, I cannot list the specific letter codes and their meanings.\\n\\nFurthermore, the provided data mentions various laminate materials and their classifications according to BS 4584/IEC 249, including codes like EP-GC, EP-GCA-Cu, EP-GC-Cu, PF-CP-Cu, PETP-F, PETP-F-Cu, PI-F, PI-F-Cu, and Si-GC-Cu [Data: Source unit_text 86e807f0cd07552efb18b1522b5ebb0f1e29dbafb18ceed16863a0b3a5b419cbc60e1815556c0e98181358e77794b8c03c5d3ec8d5da71105f04d0ca6b64f2c8; Source unit_text de4df10495e8805723fd3fc3e38200e07df57f04af9b050235a7a578aff153ed39c76da505d49cfc248e9824175dbb55710b94c162d098d08fcf7ae160bd4d48]. These codes likely represent different combinations of base materials (epoxide resin, woven glass fabric, copper conductor, etc.) used in PCB manufacturing. Again, without the content of Table 1.2, a complete explanation of these codes is not possible.\\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 that letter codes are defined in Table 1.2 in the context of BS 4584 [Data: Sources (17)], Table 1.2 is not included in the provided data. Therefore, I do not have the information necessary to explain the letter codes.\\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='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='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 the development of intelligent machines assisting mankind in peaceful pursuits [Data: Sources (7)]. However, no further details or examples of how this might occur are included in 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 potentially contribute to peaceful pursuits?', answer=\"Soldering's Contribution to Peaceful Applications\\n\\nSoldering plays a vital role in the creation of numerous electronic devices that underpin peaceful applications [Data: Reports (7, 1, 13, 21, 36, +more)]. These devices span various sectors, including communication technologies, healthcare equipment, and educational tools. The process is fundamental to the manufacturing of electronics such as computers, mobile telecommunication devices, and even those used in space travel [Data: Reports (4, 27, 26, +more)]. Reliable soldering joints are critical for the performance and longevity of these technologies, impacting everything from computers and CDs to radio networks [Data: Reports (8, 27)].\\n\\nEnvironmental Considerations and Peaceful Coexistence\\n\\nThe development of lead-free soldering techniques reflects a commitment to environmental sustainability and peaceful coexistence with the planet [Data: Reports (7, 41, +more)]. The shift towards new, environmentally friendly materials, such as lead-free alternatives, contributes to both environmental protection and improved health safety, aligning with broader peaceful goals [Data: Reports (35)].\\n\\n\\nQuality Control and Technological Advancement\\n\\nQuality control measures in soldering, including thorough inspection and any necessary touch-up processes, are crucial for preventing defects and ensuring the dependable operation of electronic devices [Data: Reports (7, 1, 13, 39, +more)]. Furthermore, advancements in soldering techniques and materials contribute to miniaturization and enhanced performance in electronic devices, indirectly supporting peaceful technological advancements [Data: Reports (27)].\\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: 10437\n", - "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': 'The answer correctly identifies the relevance o...\n", - "\n", - "Evaluating Row 1: How does soldering potentially contribute to peaceful pursuits?...\n", - "length of prompt: 10444\n", - "LLM Output Snippet: [{'answer_number': '1', 'comprehensiveness_reason': 'The answer only states that it cannot answer th...\n", - "--- Evaluation Complete ---\n", - "Evaluation results saved to /home/cip/ce/ix05ogym/Majid/LLM/GraphRag/v2/comparision_results.\n", - "\n", - "--- Final Evaluation Results ---\n" - ] - }, - { - "data": { - "image/png": "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EZCCjDGyWu/uZt99950kyWq18sGFJyau/W3dutWxhQCpXNy+sm3bNgdXAtgnrg1v375dJ0+edHA1aQ+hCEghsbGxslgskqT9+/erS5cuGjBggCSCEVJe/PZ17Ngx1a5dW2PGjHFgRUDqFH9fOXr0qJ577jmNGzfOgRUBjyZ+G961a5caN26sWbNm6e+//3ZgVWmPq6MLAJ5G8c8QffHFF9q/f7+io6M1efJkxcbGauzYsbZgFDcdkFzit79x48bp0qVLSpcunQYOHKiIiAgNGTLEwRUCqcO9+8rly5fl7e2tfv36KSIiQoMHD3ZwhcCDxW/DH3/8saKiomSxWPTpp58qJiZGb731lnLkyOHgKtMGQhGQAuLOEA0dOlSTJk3S1KlT1ahRI61cuVKrV69WVFSUPvnkE4IRUkT89vf5559r5syZqly5svbt26cRI0YoOjpaI0aMcHCVgOPF7StDhgzRlClTNGPGDFWoUEF79+7VkCFDFBMTw5cISNXi2vCHH36osWPHatGiRVq+fLm2bdumSZMmyWq1qlu3bsqePbuDK039CEVACrly5Yo2bNigMWPGqFWrVpKk6tWra9q0aZo+fbq8vLz04Ycfymq1yhhj+2ADkkNYWJh++OEHDRo0SE2bNpUkNWjQQLlz51b37t3l6empQYMGObhKwPFCQ0P1ww8/aPDgwWrWrJkkqWHDhsqdO7d69uwpT09P9e/f38FVAvf377//6ttvv1Xv3r3VoEEDSVLdunXl7++vQYMGyRijN998Uzlz5nRwpakbX08DKcTPz08hISE6ffq0bVhQUJC6d++uXLlyafz48bY/tBaLRcYYB1WKp5ExRidOnNDNmzdtw3x8fNSuXTs1btxY77//vj788EMHVgikDnH7SkhIiG2Yr6+vOnTooIYNG2rgwIEaO3asAysE7i/ufqKoqCjbsMjISElS37599dJLL2n69OmaNWuWrly54pAa0wpCEZAMkuo0ITY2Vs8884yOHj2qv/76yzY8ICBAlStXVu3atbVjxw5NnTpVkjhTBLsl1f78/PzUvn17ff/999q/f79tuL+/v4oXL6769etr+PDh+vLLL59kqYBDJbWv+Pv765VXXtF3332nAwcO2IYHBASoePHiev755/X+++9r1qxZT7JUIEn3tmGr1SovLy+VK1dOU6dOVWhoqDw8PGwhKVu2bCpQoIAmT55s6wWXjp6SRigCHlP8e4IOHjyo3377TTdv3pS3t7deffVVbdu2TWPHjtWRI0ck3T3Nffr0aTVt2lRZsmTRxo0bFRMT48hNQBoWv/0dOnRIP/30k+2s4wsvvCBXV1dNmjTJFoxu3bqlo0ePqk2bNuratasWLVqkmzdvcqYST734+8rhw4e1Z88e27gGDRrIarVq4sSJOnjwoKS7+8rx48f1yiuv6LXXXtOCBQv0zz//sK/AYeK34R07dmjXrl36448/JN29pyhbtmyqWrWqrly5ImOMjDE6efKkJkyYoNatW2vQoEGKjIzkPub74J4i4DHFfbgMGDBAM2fOlLe3t1xcXLRy5Uo9++yzWrJkiTp37qzffvtNbm5uun37tm7duqVly5bp1q1b+uqrrxQZGSlvb28HbwnSorj2169fP82bN0+RkZHKli2bPv/8cz333HP6559/9Nlnn6l58+YqUKCArl69KqvVquDgYF28eFE7d+5UunTpOFOJp178fWX+/Pn6999/lStXLk2ePFl16tTRP//8o8mTJ6tp06YqVKiQLl++LKvVqo4dO+rcuXP66aef2FfgMPF7mevbt68WL16skJAQVahQQS1btlT37t01Z84cvf766ypcuLBKlCih69evKyoqSpUrV9bRo0e1Y8cO2u8DEIoAO8X/xmb79u1avHixFi9erDt37mjWrFl69tlntWbNGtWtW1fffPONdu7cqYMHDyp79ux67733JEm//vqrihYtKldXdkU8mpiYGLm4uEiSvvnmG61bt05z5sxRjhw51KdPH3Xu3FkTJ05U8+bNVaxYMe3du1c7d+7U888/r969e0uSTp48qQIFCig6Olru7u6O3BwgxcTfV9atW6e1a9dq1qxZypYtm9555x117txZkyZNUsuWLVWsWDH9/PPP2rVrl5577jm9++67kqQzZ86oYMGCio6OlpubmyM3B04m7pmHcWFmz5492rRpk1asWKGIiAgtXrxYM2fOVGRkpPr06aMff/xREydO1D///CM3Nzf169dPVqtVe/bsUdasWfm8fwCL4Tww8Eju7UJ7ypQpkqTw8HDbH9CwsDB169ZNq1ev1tq1a1WzZs0Eyzh+/Lhmz56tL7/8Utu3b1eJEiWe3AYgTbty5YoyZcpkez1//nydP39eVqs1QQ9ZTZs21eHDhzVx4kS9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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "graph_rag_comparision = GraphRagComparision(root_dir=ROOT_DIR, temperature=TEMPERATURE_SETTING)\n", - "\n", - "evaluation_results = await graph_rag_comparision.answer_questions(\n", - " questions=questions_to_evaluate,\n", - " sleep_interval=5 \n", - ")\n", - "print(evaluation_results)\n", - "graph_rag_comparision.compare_answers(evaluation_results,\n", - " )\n", - "print(f\"Evaluation results saved to {graph_rag_comparision.compare_dir}.\")\n", - "\n", - "graph_rag_comparision.plot_comparision_results()\n", - "\n", - "print(\"\\n--- Final Evaluation Results ---\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "b12bed18", - "metadata": {}, - "source": [ - "## 4. Visualize Results\n", - "- The `plot_comparision_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": [ - { - "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", - "
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. ...## Letter Codes in the Context of BS 4584\\n\\nT...
1How does soldering potentially contribute to p...I cannot answer this question. The provided t...The provided text mentions soldering's role in...Soldering's Contribution to Peaceful Technolog...
\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", - "\n", - " RAG \\\n", - "0 Based on the provided text, several tables lis... \n", - "1 I cannot answer this question. The provided t... \n", - "\n", - " Graph RAG (Local) \\\n", - "0 I'm sorry, but I cannot answer your question. ... \n", - "1 The provided text mentions soldering's role in... \n", - "\n", - " Graph RAG (Global) \n", - "0 ## Letter Codes in the Context of BS 4584\\n\\nT... \n", - "1 Soldering's Contribution to Peaceful Technolog... " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "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", - "
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 correctly identifies the relevant t...4The answer explores different aspects related ...6The answer empowers the reader by explaining t...7The answer directly addresses the question by ...7
11How does soldering potentially contribute to p...I cannot answer this question. The provided t...The answer provides no information whatsoever ...0No diversity of perspectives or insights are o...0The answer does not empower the reader in any ...0The answer directly states it cannot answer th...0
\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", - "\n", - " answer \\\n", - "0 Based on the provided text, several tables lis... \n", - "1 I cannot answer this question. The provided t... \n", - "\n", - " comprehensiveness_reason comprehensiveness_rating \\\n", - "0 The answer correctly identifies the relevant t... 4 \n", - "1 The answer provides no information whatsoever ... 0 \n", - "\n", - " diversity_reason diversity_rating \\\n", - "0 The answer explores different aspects related ... 6 \n", - "1 No diversity of perspectives or insights are o... 0 \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 in any ... 0 \n", - "\n", - " directness_reason directness_rating \n", - "0 The answer directly addresses the question by ... 7 \n", - "1 The answer directly states it cannot answer th... 0 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "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", - "
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 is very limited. It only acknowled...1No diversity is present; the response simply s...0The answer does not empower the reader; it sim...0It directly states it cannot answer the questi...1
12How does soldering potentially contribute to p...The provided text mentions soldering's role in...The answer mentions a vague connection between...2The answer offers limited diversity, mainly co...3The answer provides minimal empowerment. While...2The answer indirectly addresses the question b...3
\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", - "\n", - " answer \\\n", - "0 I'm sorry, but I cannot answer your question. ... \n", - "1 The provided text mentions soldering's role in... \n", - "\n", - " comprehensiveness_reason comprehensiveness_rating \\\n", - "0 This answer is very limited. It only acknowled... 1 \n", - "1 The answer mentions a vague connection between... 2 \n", - "\n", - " diversity_reason diversity_rating \\\n", - "0 No diversity is present; the response simply s... 0 \n", - "1 The answer offers limited diversity, mainly co... 3 \n", - "\n", - " empowerment_reason empowerment_rating \\\n", - "0 The answer does not empower the reader; it sim... 0 \n", - "1 The answer provides minimal empowerment. While... 2 \n", - "\n", - " directness_reason directness_rating \n", - "0 It directly states it cannot answer the questi... 1 \n", - "1 The answer indirectly addresses the question b... 3 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "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", - "
answer_numberquestionanswercomprehensiveness_reasoncomprehensiveness_ratingdiversity_reasondiversity_ratingempowerment_reasonempowerment_ratingdirectness_reasondirectness_rating
03What are letter codes in the context of BS 4584?## Letter Codes in the Context of BS 4584\\n\\nT...The answer mentions examples of codes (si-gc-c...3The answer provides a limited perspective, foc...2The answer provides some context by linking th...3The answer directly addresses the question by ...5
13How does soldering potentially contribute to p...Soldering's Contribution to Peaceful Technolog...This answer provides a comprehensive overview ...9The answer demonstrates good diversity by high...8The answer effectively empowers the reader by ...9The answer directly and clearly addresses the ...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", - "\n", - " answer \\\n", - "0 ## Letter Codes in the Context of BS 4584\\n\\nT... \n", - "1 Soldering's Contribution to Peaceful Technolog... \n", - "\n", - " comprehensiveness_reason comprehensiveness_rating \\\n", - "0 The answer mentions examples of codes (si-gc-c... 3 \n", - "1 This answer provides a comprehensive overview ... 9 \n", - "\n", - " diversity_reason diversity_rating \\\n", - "0 The answer provides a limited perspective, foc... 2 \n", - "1 The answer demonstrates good diversity by high... 8 \n", - "\n", - " empowerment_reason empowerment_rating \\\n", - "0 The answer provides some context by linking th... 3 \n", - "1 The answer effectively empowers the reader by ... 9 \n", - "\n", - " directness_reason directness_rating \n", - "0 The answer directly addresses the question by ... 5 \n", - "1 The answer directly and clearly addresses the ... 9 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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pZdYuXIlPj4+dOvWjTNnzvD4448THh5e0UWvNlRVZd++fZw7dw6LxcKWLVu4dOkS9erV45lnniElJYVTp07Ro0cPcnNz6d+/P02bNq3SJzpy6biaczgcFBUVsWDBAvr160dSUhJff/01r732GtHR0aSmplKrVi20Wi1Op1PGkf2LSua5LCgoYOHChXTv3p0rV66wfPlyXnnlFeLi4khLSyMqKgpFUVBVVeq2Eig53JnNZrZs2UJxcTHt2rVjypQpDBgwgIEDB5KdnY2Pjw/e3t44HA60Wm2VPshXNiV9Gc6fP8/GjRsZNmwYS5YswcPDg7Fjx2KxWNBqtQQGBuJ0OqvFVSAJ2mrK4XBw4MABnE4nly9fxs/Pj6+++ooXX3zRNa3VtGnT8PDwAKrPg+Hlwel0snfvXvR6PQkJCXh5ebF+/XrGjRtHdnY23377Le+++y5eXl6A1G1loaoq58+fp6CggFOnTnHbbbexePFiunbtStu2bXnvvfd44oknaNGihSuQZd+VnZKrQIcOHeLq1avExMSwc+dOnE4n9957L8uXL6du3brcd999rnqvLvUv17GqoZKDxIEDBxg/fjyenp706NGDkSNHMmPGDOLi4njllVdcE2hXly9zeSi59Hjo0CGefPJJQkND6dOnD4MHD2bOnDmEhYXxyiuv4OnpCUjdVjbFxcWMGzeOhIQEmjVrxksvvcS2bdvYt28fb731FvHx8a75smXfucfHH3/MmjVruP3223nyySfRarWsWLGCMWPG0LdvX1fdV6f6l6CtZq7tyde7d2/uuecefv75ZzIyMujQoQP33XcfOTk51KpVq1p9kcvDf9ft0KFDWb9+PQUFBXTr1o27774bi8XiulwsKoeSkyOn00ndunV59tlnSUxM5MSJE8TExPDMM8/gcDgIDAzE29u7ootb7Vw74pO3tzfPPPMMQUFBfP/99+j1eh544AHq1KmD0WgkICCgoovrFnLpuBq59hGetWvXujp0/PDDD5w6dQpfX18GDRpEq1atqt0Zo7uV1G1ycjJr167FaDQyYMAANmzYwOHDhwkNDWXAgAFSt5VQSe/wb775htTUVHr37k1RURHz58+nWbNmeHp68sgjj6DX62W/uUHJSc6PP/7IwYMHadeuHfHx8UydOpVatWphtVp54YUX8PPzA6rnVSAJ2mri2vF1p06dSps2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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "graph_rag_comparision.print_comparision_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_comparision/comparision_prompt.py b/examples_notebooks/community_contrib/graphrag_comparision/comparision_prompt.py deleted file mode 100644 index 9814cd3789..0000000000 --- a/examples_notebooks/community_contrib/graphrag_comparision/comparision_prompt.py +++ /dev/null @@ -1,210 +0,0 @@ -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_comparision/graphrag_comparision.py b/examples_notebooks/community_contrib/graphrag_comparision/graphrag_comparision.py deleted file mode 100644 index fed3d772d3..0000000000 --- a/examples_notebooks/community_contrib/graphrag_comparision/graphrag_comparision.py +++ /dev/null @@ -1,585 +0,0 @@ - -import pandas as pd -import tiktoken -from json_repair import loads -from comparision_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 GraphRagComparision: - - # 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("comparision_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_comparision_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('comparision_plot.png'), bbox_inches='tight') - - - def print_comparision_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('comparision_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_comparision = GraphRagComparision(root_dir=ROOT_DIR, temperature=TEMPERATURE_SETTING) - - evaluation_results = await graph_rag_comparision.answer_questions( - questions=questions_to_evaluate, - sleep_interval=5 - ) - print(evaluation_results) - graph_rag_comparision.compare_answers(evaluation_results, - ) - print(f"Evaluation results saved to {graph_rag_comparision.compare_dir}.") - - graph_rag_comparision.plot_comparision_results() - - print("\n--- Final Evaluation Results ---") - - - asyncio.run(main()) \ No newline at end of file