Lokale Suche
In [1]
Kopiert!
# Copyright (c) 2024 Microsoft Corporation.
# Licensed under the MIT License.
# Copyright (c) 2024 Microsoft Corporation. # Lizenziert unter der MIT-Lizenz.
In [2]
Kopiert!
import os
import pandas as pd
from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig
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,
)
from graphrag.query.structured_search.local_search.search import LocalSearch
from graphrag.vector_stores.lancedb import LanceDBVectorStore
import os import pandas as pd from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig 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, ) from graphrag.query.structured_search.local_search.search import LocalSearch from graphrag.vector_stores.lancedb import LanceDBVectorStore
Beispiel für lokale Suche¶
Die lokale Suchmethode generiert Antworten, indem relevante Daten aus dem KI-extrahierten Wissensgraphen mit Textteilen aus den Rohdokumenten kombiniert werden. Diese Methode eignet sich für Fragen, die ein Verständnis spezifischer, in den Dokumenten erwähnter Entitäten erfordern (z. B. Was sind die heilenden Eigenschaften von Kamille?).
Lade Textabschnitte und Graph-Datentabellen als Kontext für die lokale Suche¶
- In diesem Test laden wir zunächst die Indexierungsausgaben aus Parquet-Dateien in Dataframes und konvertieren diese Dataframes dann in Sammlungen von Datenobjekten, die mit dem Wissensmodell übereinstimmen.
Tabellen in Dataframes laden¶
In [3]
Kopiert!
INPUT_DIR = "./inputs/operation dulce"
LANCEDB_URI = f"{INPUT_DIR}/lancedb"
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
INPUT_DIR = "./inputs/operation dulce" LANCEDB_URI = f"{INPUT_DIR}/lancedb" 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
Entitäten lesen¶
In [4]
Kopiert!
# read nodes table to get community and degree data
entity_df = pd.read_parquet(f"{INPUT_DIR}/{ENTITY_TABLE}.parquet")
community_df = pd.read_parquet(f"{INPUT_DIR}/{COMMUNITY_TABLE}.parquet")
entities = read_indexer_entities(entity_df, community_df, COMMUNITY_LEVEL)
# load description embeddings to an in-memory lancedb vectorstore
# to connect to a remote db, specify url and port values.
description_embedding_store = LanceDBVectorStore(
vector_store_schema_config=VectorStoreSchemaConfig(
index_name="default-entity-description"
)
)
description_embedding_store.connect(db_uri=LANCEDB_URI)
print(f"Entity count: {len(entity_df)}")
entity_df.head()
# lese Knotentabelle, um Community- und Grad-Daten zu erhalten entity_df = pd.read_parquet(f"{INPUT_DIR}/{ENTITY_TABLE}.parquet") community_df = pd.read_parquet(f"{INPUT_DIR}/{COMMUNITY_TABLE}.parquet") entities = read_indexer_entities(entity_df, community_df, COMMUNITY_LEVEL) # Lade Beschreibungs-Embeddings in einen In-Memory-LanceDB-Vektorspeicher # Um sich mit einer Remote-Datenbank zu verbinden, geben Sie URL und Port-Werte an. description_embedding_store = LanceDBVectorStore( vector_store_schema_config=VectorStoreSchemaConfig( index_name="default-entity-description" ) ) description_embedding_store.connect(db_uri=LANCEDB_URI) print(f"Anzahl Entitäten: {len(entity_df)}") entity_df.head()
Entity count: 18
Out[4]
| id | human_readable_id | title | type | description | text_unit_ids | frequency | degree | x | y | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 425a7862-0aef-4f69-a4c8-8bd42151c9d4 | 0 | ALEX MERCER | PERSON | Agent Alex Mercer ist eine entschlossene Person, die... | [8e938693af886bfd081acbbe8384c3671446bff84a134... | 4 | 9 | 0 | 0 |
| 1 | bcdbf1fc-0dc1-460f-bc71-2781729c96ba | 1 | TAYLOR CRUZ | PERSON | Agent Taylor Cruz ist eine kommandierende und autoritäre... | [8e938693af886bfd081acbbe8384c3671446bff84a134... | 4 | 8 | 0 | 0 |
| 2 | ef02ef24-5762-46ce-93ce-7dea6fc86595 | 2 | JORDAN HAYES | PERSON | Dr. Jordan Hayes ist eine Wissenschaftlerin und ein Mitglied... | [8e938693af886bfd081acbbe8384c3671446bff84a134... | 4 | 9 | 0 | 0 |
| 3 | 8b163d27-e43a-4a2c-a26f-866778d8720e | 3 | SAM RIVERA | PERSON | Sam Rivera ist ein Cybersicherheitsexperte und ein talentierter... | [8e938693af886bfd081acbbe8384c3671446bff84a134... | 4 | 8 | 0 | 0 |
| 4 | 542aa5bd-ba2d-400a-8488-c52d50bc300d | 4 | PARANORMAL MILITARY SQUAD | ORGANIZATION | Das PARANORMAL MILITARY SQUAD ist eine Elite-Gruppe... | [8e938693af886bfd081acbbe8384c3671446bff84a134... | 2 | 6 | 0 | 0 |
Beziehungen lesen¶
In [5]
Kopiert!
relationship_df = pd.read_parquet(f"{INPUT_DIR}/{RELATIONSHIP_TABLE}.parquet")
relationships = read_indexer_relationships(relationship_df)
print(f"Relationship count: {len(relationship_df)}")
relationship_df.head()
relationship_df = pd.read_parquet(f"{INPUT_DIR}/{RELATIONSHIP_TABLE}.parquet") relationships = read_indexer_relationships(relationship_df) print(f"Anzahl Beziehungen: {len(relationship_df)}") relationship_df.head()
Relationship count: 54
Out[5]
| id | human_readable_id | source | target | description | weight | combined_degree | text_unit_ids | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2bfad9f4-5abd-48d0-8db3-a9cad9120413 | 0 | ALEX MERCER | TAYLOR CRUZ | Alex Mercer und Taylor Cruz sind beide Agenten, die... | 37.0 | 17 | [8e938693af886bfd081acbbe8384c3671446bff84a134... |
| 1 | 6cbb838f-9e83-4086-a684-15c8ed709e52 | 1 | ALEX MERCER | JORDAN HAYES | Alex Mercer und Jordan Hayes sind beide Agenten, die... | 42.0 | 18 | [8e938693af886bfd081acbbe8384c3671446bff84a134... |
| 2 | bfdc25f1-80ca-477b-a304-94465b69e680 | 2 | ALEX MERCER | SAM RIVERA | Alex Mercer und Sam Rivera sind beide Agenten und... | 26.0 | 17 | [8e938693af886bfd081acbbe8384c3671446bff84a134... |
| 3 | 7a7e943d-a4f5-487b-9625-5d0907c4c26d | 3 | ALEX MERCER | PARANORMAL MILITARY SQUAD | Alex Mercer ist Mitglied des Paranormal Military... | 17.0 | 15 | [8e938693af886bfd081acbbe8384c3671446bff84a134... |
| 4 | 5e00bcb9-a17e-4c27-8241-6ebb286a7fc6 | 4 | ALEX MERCER | DULCE | Alex Mercer bereitet sich darauf vor, das Team in... | 15.0 | 14 | [8e938693af886bfd081acbbe8384c3671446bff84a134... |
In [6]
Kopiert!
# NOTE: covariates are turned off by default, because they generally need prompt tuning to be valuable
# Please see the GRAPHRAG_CLAIM_* settings
covariate_df = pd.read_parquet(f"{INPUT_DIR}/{COVARIATE_TABLE}.parquet")
claims = read_indexer_covariates(covariate_df)
print(f"Claim records: {len(claims)}")
covariates = {"claims": claims}
# HINWEIS: Kovariaten sind standardmäßig deaktiviert, da sie normalerweise eine Prompt-Anpassung benötigen, um wertvoll zu sein # Weitere Informationen finden Sie in den GRAPHRAG_CLAIM_* Einstellungen covariate_df = pd.read_parquet(f"{INPUT_DIR}/{COVARIATE_TABLE}.parquet") claims = read_indexer_covariates(covariate_df) print(f"Anzahl der Ansprüche: {len(claims)}") covariates = {"claims": claims}
Claim records: 17
Community-Berichte lesen¶
In [7]
Kopiert!
report_df = pd.read_parquet(f"{INPUT_DIR}/{COMMUNITY_REPORT_TABLE}.parquet")
reports = read_indexer_reports(report_df, community_df, COMMUNITY_LEVEL)
print(f"Report records: {len(report_df)}")
report_df.head()
report_df = pd.read_parquet(f"{INPUT_DIR}/{COMMUNITY_REPORT_TABLE}.parquet") reports = read_indexer_reports(report_df, community_df, COMMUNITY_LEVEL) print(f"Anzahl der Berichte: {len(report_df)}") report_df.head()
Report records: 2
Out[7]
| id | human_readable_id | community | level | parent | children | title | summary | full_content | rank | rating_explanation | findings | full_content_json | period | size | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 6c3a555680d647ac8be866a129c7b0ea | 0 | 0 | 0 | -1 | [] | Operation: Dulce und Erkundung der Dulce Basis | Die Community dreht sich um 'Operation: Dulc... | # Operation: Dulce und Erkundung der Dulce Basis...\ | 8.5 | Die Einstufung der Auswirkungsschwere ist aufgrund der... | [{'explanation': 'Operation: Dulce ist eine bedeutende... | {\n "title": "Operation: Dulce und Dulce Ba... | 2025-03-04 | 7 |
| 1 | 0127331a1ea34b8ba19de2c2a4cb3bc9 | 1 | 1 | 0 | -1 | [] | Paranormal Military Squad und Operation: Dulce | Die Community konzentriert sich auf den Paranormal Mi... | # Paranormal Military Squad und Operation: Dul...\ | 8.5 | Die Einstufung der Auswirkungsschwere ist aufgrund der... | [{'explanation': 'Agent Alex Mercer ist eine Schlüsselfigur... | {\n "title": "Paranormal Military Squad und... | 2025-03-04 | 9 |
Textabschnitte lesen¶
In [8]
Kopiert!
text_unit_df = pd.read_parquet(f"{INPUT_DIR}/{TEXT_UNIT_TABLE}.parquet")
text_units = read_indexer_text_units(text_unit_df)
print(f"Text unit records: {len(text_unit_df)}")
text_unit_df.head()
text_unit_df = pd.read_parquet(f"{INPUT_DIR}/{TEXT_UNIT_TABLE}.parquet") text_units = read_indexer_text_units(text_unit_df) print(f"Anzahl Textabschnitte: {len(text_unit_df)}") text_unit_df.head()
Text unit records: 5
Out[8]
| id | human_readable_id | text | n_tokens | document_ids | entity_ids | relationship_ids | covariate_ids | |
|---|---|---|---|---|---|---|---|---|
| 0 | 8e938693af886bfd081acbbe8384c3671446bff84a134a... | 1 | # Operation: Dulce\n\n## Kapitel 1\n\nDie thru... | 1200 | [6e81f882f89dd5596e1925dd3ae8a4f0a0edcb55b35a8... | [425a7862-0aef-4f69-a4c8-8bd42151c9d4, bcdbf1f... | [2bfad9f4-5abd-48d0-8db3-a9cad9120413, 6cbb838... | [745d28dd-be20-411b-85ff-1c69ca70e7b3, 9cba185... |
| 1 | fd1f46d32e1df6cd429542aeda3d64ddf3745ccb80f443... | 2 | , das leere Echo der Bucht eine deutliche Mahnung... | 1200 | [6e81f882f89dd5596e1925dd3ae8a4f0a0edcb55b35a8... | [425a7862-0aef-4f69-a4c8-8bd42151c9d4, bcdbf1f... | [2bfad9f4-5abd-48d0-8db3-a9cad9120413, 6cbb838... | [4f9b461f-5e8f-465d-9586-e2fc81787062, 0f74618... |
| 2 | 7296d9a1f046854d59079dc183de8a054c27c4843d2979... | 3 | anders als Lob von anderen. Das war... | 1200 | [6e81f882f89dd5596e1925dd3ae8a4f0a0edcb55b35a8... | [425a7862-0aef-4f69-a4c8-8bd42151c9d4, bcdbf1f... | [2bfad9f4-5abd-48d0-8db3-a9cad9120413, 6cbb838... | [3ef1be9c-4080-4fac-99bd-c4a636248904, 8730b20... |
| 3 | ac72722a02ac71242a2a91fca323198d04197daf60515d... | 4 | Kontrast zu der starren Stille, die das ... | 1200 | [6e81f882f89dd5596e1925dd3ae8a4f0a0edcb55b35a8... | [425a7862-0aef-4f69-a4c8-8bd42151c9d4, bcdbf1f... | [2bfad9f4-5abd-48d0-8db3-a9cad9120413, 6cbb838... | [2c292047-b79a-4958-ab57-7bf7d7a22c92, 3cbd18a... |
| 4 | 4c277337d461a16aaf8f9760ddb8b44ef220e948a2341d... | 5 | eine Maske der Pflicht.\n\nInmitten des Abstiegs... | 35 | [6e81f882f89dd5596e1925dd3ae8a4f0a0edcb55b35a8... | [d084d615-3584-4ec8-9931-90aa6075c764, 4b84859... | [6efdc42e-69a2-47c0-97ec-4b296cd16d5e] | [db8da02f-f889-4bb5-8e81-ab2a72e380bb] |
In [9]
Kopiert!
from graphrag.config.enums import ModelType
from graphrag.config.models.language_model_config import LanguageModelConfig
from graphrag.language_model.manager import ModelManager
from graphrag.tokenizer.get_tokenizer import get_tokenizer
api_key = os.environ["GRAPHRAG_API_KEY"]
chat_config = LanguageModelConfig(
api_key=api_key,
type=ModelType.Chat,
model_provider="openai",
model="gpt-4.1",
max_retries=20,
)
chat_model = ModelManager().get_or_create_chat_model(
name="local_search",
model_type=ModelType.Chat,
config=chat_config,
)
embedding_config = LanguageModelConfig(
api_key=api_key,
type=ModelType.Embedding,
model_provider="openai",
model="text-embedding-3-small",
max_retries=20,
)
text_embedder = ModelManager().get_or_create_embedding_model(
name="local_search_embedding",
model_type=ModelType.Embedding,
config=embedding_config,
)
tokenizer = get_tokenizer(chat_config)
from graphrag.config.enums import ModelType from graphrag.config.models.language_model_config import LanguageModelConfig from graphrag.language_model.manager import ModelManager from graphrag.tokenizer.get_tokenizer import get_tokenizer api_key = os.environ["GRAPHRAG_API_KEY"] chat_config = LanguageModelConfig( api_key=api_key, type=ModelType.Chat, model_provider="openai", model="gpt-4.1", max_retries=20, ) chat_model = ModelManager().get_or_create_chat_model( name="local_search", model_type=ModelType.Chat, config=chat_config, ) embedding_config = LanguageModelConfig( api_key=api_key, type=ModelType.Embedding, model_provider="openai", model="text-embedding-3-small", max_retries=20, ) text_embedder = ModelManager().get_or_create_embedding_model( name="local_search_embedding", model_type=ModelType.Embedding, config=embedding_config, ) tokenizer = get_tokenizer(chat_config)
Kontext-Builder für lokale Suche erstellen¶
In [10]
Kopiert!
context_builder = LocalSearchMixedContext(
community_reports=reports,
text_units=text_units,
entities=entities,
relationships=relationships,
# if you did not run covariates during indexing, set this to None
covariates=covariates,
entity_text_embeddings=description_embedding_store,
embedding_vectorstore_key=EntityVectorStoreKey.ID, # if the vectorstore uses entity title as ids, set this to EntityVectorStoreKey.TITLE
text_embedder=text_embedder,
tokenizer=tokenizer,
)
context_builder = LocalSearchMixedContext( community_reports=reports, text_units=text_units, entities=entities, relationships=relationships, # wenn Sie keine Kovariaten während der Indexierung ausgeführt haben, setzen Sie dies auf None covariates=covariates, entity_text_embeddings=description_embedding_store, embedding_vectorstore_key=EntityVectorStoreKey.ID, # wenn der Vektorspeicher den Entitätstitel als IDs verwendet, setzen Sie dies auf EntityVectorStoreKey.TITLE text_embedder=text_embedder, tokenizer=tokenizer, )
Suchmaschine für lokale Suche erstellen¶
In [11]
Kopiert!
# text_unit_prop: proportion of context window dedicated to related text units
# community_prop: proportion of context window dedicated to community reports.
# The remaining proportion is dedicated to entities and relationships. Sum of text_unit_prop and community_prop should be <= 1
# conversation_history_max_turns: maximum number of turns to include in the conversation history.
# conversation_history_user_turns_only: if True, only include user queries in the conversation history.
# top_k_mapped_entities: number of related entities to retrieve from the entity description embedding store.
# top_k_relationships: control the number of out-of-network relationships to pull into the context window.
# include_entity_rank: if True, include the entity rank in the entity table in the context window. Default entity rank = node degree.
# include_relationship_weight: if True, include the relationship weight in the context window.
# include_community_rank: if True, include the community rank in the context window.
# return_candidate_context: if True, return a set of dataframes containing all candidate entity/relationship/covariate records that
# could be relevant. Note that not all of these records will be included in the context window. The "in_context" column in these
# dataframes indicates whether the record is included in the context window.
# max_tokens: maximum number of tokens to use for the context window.
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, # set this to EntityVectorStoreKey.TITLE if the vectorstore uses entity title as ids
"max_tokens": 12_000, # change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 5000)
}
model_params = {
"max_tokens": 2_000, # change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 1000=1500)
"temperature": 0.0,
}
# text_unit_prop: Anteil des Kontextfensters, der für verwandte Textabschnitte verwendet wird # community_prop: Anteil des Kontextfensters, der für Community-Berichte verwendet wird. # Der verbleibende Anteil ist für Entitäten und Beziehungen bestimmt. Die Summe von text_unit_prop und community_prop sollte <= 1 sein # conversation_history_max_turns: maximale Anzahl von Turns, die in die Konversationshistorie aufgenommen werden sollen. # conversation_history_user_turns_only: wenn True, nur Benutzeranfragen in die Konversationshistorie aufnehmen. # top_k_mapped_entities: Anzahl der verwandten Entitäten, die aus dem Entitätsbeschreibungs-Embeddingspeicher abgerufen werden sollen. # top_k_relationships: Steuert die Anzahl der Out-of-Network-Beziehungen, die in das Kontextfenster gezogen werden. # include_entity_rank: wenn True, den Entitätsrang in der Entitätstabelle in das Kontextfenster aufnehmen. Standard-Entitätsrang = Knotengrad. # include_relationship_weight: wenn True, das Beziehungsgewicht in das Kontextfenster aufnehmen. # include_community_rank: wenn True, den Community-Rang in das Kontextfenster aufnehmen. # return_candidate_context: wenn True, eine Menge von Dataframes zurückgeben, die alle potenziell relevanten Entitäts-/Beziehungs-/Kovariaten-Datensätze enthalten. # Beachten Sie, dass nicht alle diese Datensätze in das Kontextfenster aufgenommen werden. Die Spalte "in_context" in diesen # Dataframes gibt an, ob der Datensatz im Kontextfenster enthalten ist. # max_tokens: maximale Anzahl von Tokens, die für das Kontextfenster verwendet werden sollen. 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, # setzen Sie dies auf EntityVectorStoreKey.TITLE, wenn der Vektorspeicher Entitätstitel als IDs verwendet "max_tokens": 12_000, # ändern Sie dies basierend auf dem Token-Limit Ihres Modells (wenn Sie ein Modell mit 8k Limit verwenden, könnte eine gute Einstellung 5000 sein) } model_params = { "max_tokens": 2_000, # ändern Sie dies basierend auf dem Token-Limit Ihres Modells (wenn Sie ein Modell mit 8k Limit verwenden, könnte eine gute Einstellung 1000=1500 sein) "temperature": 0.0, }
In [12]
Kopiert!
search_engine = LocalSearch(
model=chat_model,
context_builder=context_builder,
tokenizer=tokenizer,
model_params=model_params,
context_builder_params=local_context_params,
response_type="multiple paragraphs", # free form text describing the response type and format, can be anything, e.g. prioritized list, single paragraph, multiple paragraphs, multiple-page report
)
search_engine = LocalSearch( model=chat_model, context_builder=context_builder, tokenizer=tokenizer, model_params=model_params, context_builder_params=local_context_params, response_type="multiple paragraphs", # freier Text, der den Antworttyp und das Format beschreibt, kann alles sein, z. B. priorisierte Liste, einzelner Absatz, mehrere Absätze, mehrseitiger Bericht )
Lokale Suche mit Beispielabfragen ausführen¶
In [13]
Kopiert!
result = await search_engine.search("Tell me about Agent Mercer")
print(result.response)
result = await search_engine.search("Erzähl mir von Agent Mercer") print(result.response)
Warning: No community records added when building community context.
Reached token limit - reverting to previous context state
## Overview of Agent Alex Mercer Agent Alex Mercer is a central figure within the Paranormal Military Squad, playing a crucial role in Operation: Dulce, the mission to explore and uncover the secrets of the mysterious Dulce base. Mercer is characterized by his determination, leadership qualities, and a nuanced internal conflict between strict adherence to protocol and a natural inclination to question and explore beyond the surface. He is respected by his peers for his expertise and is often seen as a guiding force within the team [Data: Entities (0); Relationships (3, 17, 24, 23, 4, +more)]. ## Role in Operation: Dulce Mercer is directly involved in Operation: Dulce, both as a leader and as an active participant in the exploration of the Dulce base. He is responsible for guiding the team, making critical decisions, and ensuring the mission's objectives are met. His leadership is not without its challenges, as he must balance the demands of protocol—often emphasized by Agent Taylor Cruz—with his own investigative instincts. This internal struggle is highlighted in his interactions with Cruz and his reflective moments during mission briefings [Data: Relationships (0, 3, 4, 5, 17, 24, 23, +more); Claims (3, 5)]. ## Relationships and Team Dynamics Mercer maintains strong professional relationships with other key members of the squad. He shares a mutual respect and understanding with Dr. Jordan Hayes, particularly admiring Hayes's analytical abilities and scientific expertise. Their collaboration is marked by a shared commitment to discovery and a willingness to challenge the status quo when necessary [Data: Relationships (1, 10, 25, 41, +more)]. Mercer also acts as a mentor to Sam Rivera, providing guidance and support, and recognizing Rivera's technical skills as vital to the mission's success [Data: Relationships (2, 15, 16, 30, +more)]. His relationship with Taylor Cruz is more complex, defined by a professional rivalry and a competitive undercurrent. While Mercer acknowledges Cruz's authority and often follows their lead, he is not afraid to question decisions or advocate for a more flexible approach when the situation demands it [Data: Relationships (0, 5, 6, 19, +more)]. ## Personality and Motivations Mercer is depicted as someone who feels the weight of responsibility deeply, often reflecting on the broader implications of their mission for humanity. He is not content with simply following orders; instead, he seeks to understand the true significance of their discoveries and the potential impact on the world. This sense of duty, combined with his curiosity and willingness to challenge established norms, makes him a dynamic and sometimes conflicted leader [Data: Claims (3, 5); Sources (0, 3)]. ## Key Contributions - **Leadership:** Mercer is often at the forefront of mission planning and execution, guiding the team through high-stakes situations [Data: Relationships (4, 17, 24, 23, +more)]. - **Mentorship:** He provides mentorship to Sam Rivera, helping to develop Rivera's skills and confidence [Data: Relationships (2, 15)]. - **Collaboration:** Mercer works closely with Dr. Jordan Hayes, leveraging their combined expertise to solve complex problems related to alien technology [Data: Relationships (1, 10, 48, +more)]. - **Adaptability:** Despite his respect for protocol, Mercer is willing to adapt and question orders when necessary, demonstrating flexibility in the face of the unknown [Data: Claims (3); Sources (0, 3)]. ## Conclusion Agent Alex Mercer stands out as a determined, thoughtful, and adaptable leader within the Paranormal Military Squad. His ability to balance protocol with critical thinking, foster strong team relationships, and maintain a sense of duty makes him indispensable to Operation: Dulce and the ongoing efforts to unravel the mysteries of the Dulce base [Data: Entities (0, 4, 5, 7, 8); Relationships (1, 2, 3, 4, 5, 6, 17, 23, 24, +more); Claims (3, 5)].
In [14]
Kopiert!
question = "Tell me about Dr. Jordan Hayes"
result = await search_engine.search(question)
print(result.response)
question = "Erzähl mir von Dr. Jordan Hayes" result = await search_engine.search(question) print(result.response)
Warning: No community records added when building community context.
Reached token limit - reverting to previous context state
## Overview of Dr. Jordan Hayes Dr. Jordan Hayes is a scientist and a key member of the Paranormal Military Squad, recognized for their expertise in physics and their composed, analytical demeanor. Hayes is deeply involved in Operation: Dulce, a mission focused on investigating alien technology and its implications for humanity. Their role is characterized by a reflective and skeptical approach, often advocating for adaptability and critical thinking in the face of unknown variables [Data: Entities (2, 4, 5); Relationships (10, 27, 48, 51, +more)]. ## Role in Operation: Dulce Dr. Hayes is directly engaged in working with alien technology, often found in the lab meticulously analyzing enigmatic circuitry retrieved from the Dulce base. Their scientific insights are crucial to the team's understanding of the potential paradigm shifts that such technology could bring. Hayes is not only responsible for providing analytical assessments but also for identifying hidden elements within the base, such as a suspicious panel that suggested concealed secrets [Data: Entities (2, 13, 8); Relationships (48, 51, 26, 11, +more); Claims (10, 6)]. ## Team Dynamics and Relationships Within the Paranormal Military Squad, Hayes is respected for their analytical mind and is seen as a voice of reason, often challenging the strict adherence to protocols favored by Agent Taylor Cruz. This skepticism and emphasis on adaptability create a dynamic tension within the team, particularly during mission briefings and critical decision points. Hayes shares a mutual respect and understanding with Agent Alex Mercer, with both agents valuing each other's expertise and commitment to the mission. Their interactions are marked by a blend of professional camaraderie and a shared drive to uncover the truth behind the Dulce base [Data: Entities (2, 0, 1, 7); Relationships (1, 5, 25, 9, +more); Claims (2, 6)]. ## Notable Characteristics and Contributions Hayes is portrayed as someone who balances scientific rigor with a willingness to question established procedures. They are reflective, often contemplating the broader implications of their discoveries for humanity. Their recent actions have shown newfound assertiveness, particularly as the team prepares to enter and explore the Dulce base. Hayes's ability to identify anomalies and provide critical insights has made them an indispensable asset to the squad [Data: Entities (2); Claims (10, 6, 2)]. ## Summary In summary, Dr. Jordan Hayes stands out as a thoughtful, analytical, and adaptable scientist within the Paranormal Military Squad. Their expertise in physics, commitment to understanding alien technology, and willingness to challenge protocol make them a central figure in Operation: Dulce and a vital contributor to the team's efforts to navigate the mysteries of the Dulce base [Data: Entities (2, 4, 5); Relationships (10, 27, 48, 51, +more); Claims (10, 6, 2)].
Untersuchen der Kontextdaten, die zur Generierung der Antwort verwendet wurden¶
In [15]
Kopiert!
result.context_data["entities"].head()
result.context_data["entities"].head()
Out[15]
| id | entity | description | number of relationships | in_context | |
|---|---|---|---|---|---|
| 0 | 15 | BRIEFING ROOM | 2 | True | |
| 1 | 6 | DULCE | 5 | True | |
| 2 | 7 | THE TEAM | Das Team ist eine Gruppe von Individuen, die sich auf... | 5 | True |
| 3 | 3 | SAM RIVERA | Sam Rivera ist ein Cybersicherheitsexperte und ein talentierter... | 8 | True |
| 4 | 2 | JORDAN HAYES | Dr. Jordan Hayes ist eine Wissenschaftlerin und ein Mitglied... | 9 | True |
In [16]
Kopiert!
result.context_data["relationships"].head()
result.context_data["relationships"].head()
Out[16]
| id | source | target | description | weight | links | in_context | |
|---|---|---|---|---|---|---|---|
| 0 | 24 | ALEX MERCER | OPERATION: DULCE | Alex Mercer ist an Operation: Dulce beteiligt und Teil davon... | 24.0 | 7 | True |
| 1 | 27 | JORDAN HAYES | OPERATION: DULCE | Jordan Hayes ist Teil der Operation: Dulce | 8.0 | 7 | True |
| 2 | 48 | OPERATION: DULCE | JORDAN HAYES | Jordan Hayes arbeitet an außerirdischer Technologie als... | 16.0 | 7 | True |
| 3 | 1 | ALEX MERCER | JORDAN HAYES | Alex Mercer und Jordan Hayes sind beide Agenten, die... | 42.0 | 6 | True |
| 4 | 31 | SAM RIVERA | OPERATION: DULCE | Sam Rivera ist Teil der Operation: Dulce | 1.0 | 7 | True |
In [17]
Kopiert!
if "reports" in result.context_data:
result.context_data["reports"].head()
if "reports" in result.context_data: result.context_data["reports"].head()
In [18]
Kopiert!
result.context_data["sources"].head()
result.context_data["sources"].head()
Out[18]
| id | text | |
|---|---|---|
| 0 | 3 | Kontrast zu der starren Stille, die das ... |
| 1 | 0 | # Operation: Dulce\n\n## Kapitel 1\n\nDie thru... |
| 2 | 1 | , das leere Echo der Bucht eine deutliche Mahnung... |
In [19]
Kopiert!
if "claims" in result.context_data:
print(result.context_data["claims"].head())
if "claims" in result.context_data: print(result.context_data["claims"].head())
id entity object_id status start_date end_date \
0 4 SAM RIVERA NONE SUSPECTED NONE NONE
1 9 SAM RIVERA NONE TRUE NONE NONE
2 15 SAM RIVERA SIGNAL INCONSISTENCIES TRUE NONE NONE
3 2 JORDAN HAYES NONE SUSPECTED NONE NONE
4 6 JORDAN HAYES NONE SUSPECTED NONE NONE
description in_context
0 Sam Rivera is engaged in a fervent quest for a... True
1 Sam Rivera demonstrated technical expertise by... True
2 Sam Rivera identifies structured anomalies in ... True
3 Jordan Hayes is portrayed as skeptical of Tayl... True
4 Jordan Hayes is providing analytical insights ... True
Fragengenerierung¶
Diese Funktion nimmt eine Liste von Benutzeranfragen entgegen und generiert die nächsten Kandidatenfragen.
In [20]
Kopiert!
question_generator = LocalQuestionGen(
model=chat_model,
context_builder=context_builder,
tokenizer=tokenizer,
model_params=model_params,
context_builder_params=local_context_params,
)
question_generator = LocalQuestionGen( model=chat_model, context_builder=context_builder, tokenizer=tokenizer, model_params=model_params, context_builder_params=local_context_params, )
In [21]
Kopiert!
question_history = [
"Tell me about Agent Mercer",
"What happens in Dulce military base?",
]
candidate_questions = await question_generator.agenerate(
question_history=question_history, context_data=None, question_count=5
)
print(candidate_questions.response)
question_history = [ "Erzähl mir von Agent Mercer", "Was passiert in der Militärbasis Dulce?", ] candidate_questions = await question_generator.agenerate( question_history=question_history, context_data=None, question_count=5 ) print(candidate_questions.response)
Warning: No community records added when building community context.
Reached token limit - reverting to previous context state
['- What role does Agent Mercer play in the exploration of Dulce base?', '- How does Agent Mercer interact with other members of the team during Operation: Dulce?', '- What challenges does Agent Mercer face while investigating the secrets of Dulce base?', '- In what ways does Agent Mercer contribute to the success of the mission at Dulce base?', '- How does Agent Mercer’s relationship with the team influence the outcome of the operation at Dulce base?']