图与矢量 RAG — 基准测试、优化手段和财务分析示例

图与矢量 RAG — 基准测试、优化手段和财务分析示例

Neo4j 和 WhyHow.AI 团队探索了图和矢量搜索系统如何协同工作以改进检索增强生成 (RAG) 系统。使用财务报告 RAG 示例,我们探索了图和矢量搜索之间的响应差异,对两种类型的答案输出进行了基准测试,展示了如何通过图结构优化深度和广度,并探索了为什么将图和矢量搜索结合起来是 RAG 的未来。

alt

图数据库(如 Neo4j)基于图的概念构建:节点和关系的集合。节点表示单个数据点,而关系定义它们之间的连接。每个节点都可以拥有属性,这些属性是键值对,提供有关节点的附加上下文或属性。这种方法提供了一种灵活而直观的方式来对数据中的复杂关系和依赖关系进行建模。知识图谱经常被认为 类似于人脑的工作方式 。图可以存储和查询明确的关系 - 通过上下文注入减少幻觉并提高准确性。

知识图谱存储数据和数据点之间的连接,通过提供所有相关信息的全面视图来增强推理和提取能力。这也体现了可解释性的好处,因为图中依赖的数据是可见且可追溯的。

alt

这种能力在财务分析等领域尤其有益,因为了解财务指标、市场状况和商业实体之间的复杂关系至关重要。

例如,图数据库可以将各种信息(例如高管声明、财务结果和市场状况)连接成一个反映现实世界互动的连贯模型。这样,财务分析师就可以探索复杂的场景,例如宏观经济变化对特定产品线的影响,方法是浏览图以查看直接和间接影响。使用 Neo4j 的图查询语言 Cypher,我们可以发现知识图谱中的复杂关系,例如影响者对产品的影响:


  
  def explore_impact_on_product(graph, product_name):
    query = """
    MATCH (p:Product {name: $product_name})<-[r:IMPACTS]-(m)
    RETURN m.name AS Influencer, r.description AS ImpactDescription
    "
""
    result = graph.run(query, product_name=product_name)
    for record in result:
        print(f"Influencer: {record['Influencer']}, Impact: {record['ImpactDescription']}")

在商业场景中,决策者可以看到孤立的数据点是如何连接的。图可以说明供应商动态的变化如何影响生产计划、库存水平和财务结果。图结构的灵活性使它们能够在引入新数据类型和关系时动态适应,而无需对底层数据库模式进行重大重新设计。

使用深度和广度图搜索

矢量搜索通常用于 RAG,它可以查找语义上相似的单词和短语,并将该信息返回给 LLM 以构建问题的答案。矢量搜索是一种强大的方法,可以带来一些可能与问题相关的相关信息。例如,关于“约翰养了什么宠物?”的问题可以检索有关约翰的猫或狗的信息,因为可以推断出“猫”和“狗”在语义上可能与“宠物”相似。这意味着在检索这些词之前,不必将其明确地与“宠物”的概念联系起来。但是,许多信息可能在语义上相似但不相关,或者相关但在语义上不相似。

图搜索提供了特定的手段和模式,可以对其进行优化,以实现信息检索中更精细的控制。对于需要在特定查询方向内进行更深层次信息检索的查询,图可以方便地浏览关系层,从而实现对特定模式的深入分析。相反,图可以允许在广泛的相邻关系中进行检索,以便查询寻求更广泛的数据视角并关注信息的整体范围。

这可以看作类似于图内的垂直(深度)和水平(宽度/广度)遍历。

通过财务报告 RAG 评估图和矢量搜索

让我们探索图和矢量搜索在财务信息检索系统中的应用,并查看苹果的季度财务报告。

财务分析师需要处理有关公司业绩、市场趋势和产品见解的复杂问题。假设有一位分析师负责评估外汇汇率对 iPhone 几个季度收入的影响。回答这样的问题需要了解产品性能、财务状况和外部经济因素。

知识图谱将收入电话会议记录转换为结构化格式,概述财务指标、产品和市场条件之间的关系,从而提供公司业绩的全面视图。这种结构化方法使分析师能够进行快速而精确的分析,深入了解不同业务部门如何相互作用和影响,从而增强战略投资决策。图结构可让您直接提取关键数据实体及其相邻实体。

下面的代码允许我们获取实体的名称、检索其邻居(相关节点)并安装依赖项:


  
  pip install numpy pyvis neo4j openai


from neo4j import GraphDatabase
from typing import Optional, Union, List, Dict 
import numpy as np 
from openai import OpenAI
from pyvis.network import Network


def get_embedding(text, model="text-embedding-3-small"):
    client = OpenAI()
    text = text.replace("\n"" ")
    
    return client.embeddings.create(input = [text], model=model).data[0].embedding


def calculate_similarity(embedding1, embedding2):
    # Placeholder for similarity calculation, e.g., using cosine similarity
    # Ensure both embeddings are numpy arrays for calculation
    return np.dot(embedding1, embedding2) / (np.linalg.norm(embedding1) * np.linalg.norm(embedding2))


class NodeSimilaritySearchMan():
    
    def __init__(self, neo4j_driver: GraphDatabase):
        """
        Initialize the NodeSimilaritySearchMan with a Neo4j driver instance.


        Args:
            neo4j_driver (GraphDatabase): The Neo4j driver to facilitate connection to the database.
        "
""
        self.driver = neo4j_driver
        
    def find_relationship_neighbors(self, node_name: str) -> List[Dict[str, Union[int, str]]]:
        """
        Finds neighbors of a given node based on direct relationships in the graph.


        Args:
            node_name (str): The name of the node for which to find neighbors.


        Returns:
            List[Dict[str, Union[int, str]]]: A list of dictionaries, each representing a neighbor with its ID and name.
        "
""
        
        result = self.driver.execute_query(
            """
            MATCH (n)-[r]->(neighbor)
            WHERE n.name = $node_name
            RETURN  neighbor.name AS name, 
                type(r) AS relationship_type
            "
"",
            {"node_name": node_name}
        )


            neighbors = [{ "name": record["name"], 
                        "relationship_type": record["relationship_type"]} for record in result]
        return neighbors


    def visualize_relationship_graph_interactive(self,neighbors, node_name,graph_name, edge_label='relationship_type'):
        # Initialize the Network with cdn_resources set to 'remote'
        net = Network(notebook=True, cdn_resources='remote')
        
        # Add the main node
        net.add_node(node_name, label=node_name, color='red')
        
        # Add neighbors and edges to the network
        for neighbor in neighbors:
            title = neighbor.get('neighbor_chunks_summary''')
            if edge_label == 'similarity':  # Adjust title for similarity
                title += f" (Similarity: {neighbor[edge_label]})"
            else:
                title += f" ({edge_label}: {neighbor[edge_label]})"
            net.add_node(neighbor['name'], label=neighbor['name'], title=title)
            net.add_edge(node_name, neighbor['name'], title=str(neighbor[edge_label]))


        net.show(f'{graph_name}_graph.html')
        return net

我们检索与“Apple”相关的节点:

driver = GraphDatabase.driver(uri=url,auth=(user,password))
query_obj = NodeSimilaritySearchMan(driver)
neighbors_by_relationship = query_obj.find_relationship_neighbors("Apple")
alt

为了理解图搜索和矢量搜索之间的区别,我们将使用 WhyHow.AI SDK 来生成知识图谱,因为它允许我们直接从 PDF 文件生成知识图谱。WhyHow SDK 是一个功能强大的工具,旨在简化知识图谱的构建。此 SDK 允许用户高效地创建、管理和查询范围明确的知识图谱,使企业能够以他们关心的方式组织和使用他们的数据。

使用 WhyHow SDK,用户可以根据预定义的模式构建知识图谱。在此上下文中的模式通过指定相关实体(节点)的类型、链接这些实体的关系类型(边)以及这些关系应遵循的模式来定义知识图谱的结构。这种方法提供了高度的控制力,允许用户根据自己的特定需求定制知识图谱,确保图谱准确反映原始数据中固有的关系。

通过定义模式,用户可以准确指定知识图谱应包含哪些元素和连接。这可以包括从文学分析中的人物和对象到商业应用中的产品和用户交互的任何内容。模式确保构建的图谱与定义的上下文保持一致性和相关性,使其成为从复杂文档中提取有意义见解的强大工具。

首先,我们初始化 WhyHow 客户端,并将我们想要在图中表示的文档添加到我们的命名空间中:


  
  from whyhow import WhyHow
import os
from dotenv import load_dotenv
load_dotenv()


user = os.getenv("NEO4J_USERNAME")
password = os.getenv("NEO4J_PASSWORD")
url = os.getenv("NEO4J_URL")


client = WhyHow(neo4j_user=user,neo4j_password=password,neo4j_url=url)


# Define namespace name
namespace = "apple-earning-calls"


documents = [
     "earning-calls-apple/Apple (AAPL) Q1 2023 Earnings Call Transcript _ The Motley Fool.pdf",
    "earning-calls-apple/Apple (AAPL) Q2 2022 Earnings Call Transcript _ The Motley Fool.pdf",
    "earning-calls-apple/Apple (AAPL) Q4 2022 Earnings Call Transcript _ The Motley Fool.pdf"
]


# Add documents to your namespace
documents_response = client.graph.add_documents(
  namespace = namespace, documents = documents
)

其次,我们定义图所需的模式:


  
  {
  "entities": [
    {
      "name""Company",
      "description""The company discussed in the document, specifically Apple Inc."
    },
    {
      "name""Financial_Metric",
      "description""Quantitative measures of Apple's financial performance, including revenue, gross margin, operating expenses, net cash position, etc."
    },
    {
      "name""Product",
      "description""Physical goods produced by Apple, such as iPhone, Mac, iPad, Apple Watch."
    },
    {
      "name""Service",
      "description""Services offered by Apple, including Apple TV+, Apple Music, iCloud, Apple Pay."
    },
    {
      "name""Geographic_Segment",
      "description""Market areas where Apple operates, such as Americas, Europe, Greater China, Japan, Rest of Asia Pacific."
    },
    {
      "name""Executive",
      "description""Senior leaders of Apple who are often quoted or mentioned in earnings calls, like CEO (Tim Cook), CFO (Luca Maestri)."
    },
    {
      "name""Market_Condition",
      "description""External economic or market factors affecting Apple's business, such as inflation, foreign exchange rates, geopolitical tensions."
    },
    {
      "name""Event",
      "description""Significant occurrences influencing the company, including product launches, earnings calls, and global or regional economic events."
    },
    {
      "name""Time_Period",
      "description""Specific time frames discussed in the document, typically fiscal quarters or years."
    }
  ],
  "relations": [
    {
      "name""Reports",
      "description""An executive discusses specific financial metrics, typically during an earnings call."
    },
    {
      "name""Impacts",
      "description""Describes the influence of events or market conditions on financial metrics, products, services, or geographic segments."
    },
    {
      "name""Operates_In",
      "description""Denotes the geographic areas where Apple's products and services are available."
    },
    {
      "name""Presents",
      "description""Associates products or services with their financial performance metrics, as presented in earnings calls or official releases."
    },
    {
      "name""Occurs_During",
      "description""Connects an event with the specific time period in which it took place."
    },
    {
      "name""Impacted_By",
      "description""Shows the effect of one entity on another, such as a financial metric being impacted by a market condition."
    },
    {
      "name""Offers",
      "description""Indicates that the company provides certain services."
    },
    {
      "name""Influences",
      "description""Indicates the effect of strategies or innovations on various aspects of the business."
    }
  ],
  "patterns": [
    {
      "head""Executive",
      "relation""Reports",
      "tail""Financial_Metric",
      "description""An executive reports on a financial metric, such as revenue growth or operating margin."
    },
    {
      "head""Event",
      "relation""Impacts",
      "tail""Financial_Metric",
      "description""An event, like a product launch or economic development, impacts a financial metric."
    },
    {
      "head""Product",
      "relation""Presents",
      "tail""Financial_Metric",
      "description""A product is associated with specific financial metrics during a presentation, such as sales figures or profit margins."
    },
    {
      "head""Product",
      "relation""Operates_In",
      "tail""Geographic_Segment",
      "description""A product is available in a specific geographic segment."
    },
    {
      "head""Event",
      "relation""Occurs_During",
      "tail""Time_Period",
      "description""An event such as an earnings call occurs during a specific fiscal quarter or year."
    },
    {
      "head""Financial_Metric",
      "relation""Impacted_By",
      "tail""Market_Condition",
      "description""A financial metric is affected by a market condition, such as changes in foreign exchange rates."
    },
    {
      "head""Company",
      "relation""Offers",
      "tail""Service",
      "description""Apple offers a service like Apple Music or Apple TV+."
    },
    {
      "head""Service",
      "relation""Influences",
      "tail""Market_Condition",
      "description""A service influences market conditions, potentially affecting consumer behavior or competitive dynamics."
    }
  ]
}

然后我们使用刚刚定义的模式来生成图:


  
  schema = "../schemas/earnings_schema.json"
extracted_graph = client.graph.create_graph_from_schema(
  namespace = namespace, schema_file = schema
)
print("Extracted Graph:", extracted_graph)

在我们的 Neo4j 实例中,我们可以观察到正在创建的以下图。

alt

节点和关系分别是模式中定义的实体和关系,而模式是构成我们观察到的图的实际关系。

同时,我们定义了一个检索链,它使用矢量索引将相同的文档存储为矢量表示,并使用 GPT-4 模型对这些文档进行问答。我们还实现了 Cohere 的 Rerank 来优化检索流程:


  
  from langchain_community.document_loaders import PyPDFLoader
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import OpenAIEmbeddings
from langchain import hub
from langchain_openai import ChatOpenAI
from langchain_community.document_loaders import PyPDFDirectoryLoader
from langchain.retrievers.document_compressors import FlashrankRerank
from langchain.retrievers import ContextualCompressionRetriever
import os 
from langchain import PromptTemplate, LLMChain
from langchain_cohere import CohereRerank
from cohere import Client
from dotenv import load_dotenv
load_dotenv()
cohere_api_key = os.getenv("COHERE_API_KEY")
co = Client(cohere_api_key)
class CustomCohereRerank(CohereRerank):
    class Config():
        arbitrary_types_allowed = True

CustomCohereRerank.update_forward_refs()

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

def query_vector_db(query,faiss_index):
    
    retriever = faiss_index.as_retriever()
    compressor = CustomCohereRerank(client=co)
    compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor, base_retriever=retriever
    )
    template = """You are a helpful assistant who is able to answer any question using the provided context. Answer the question using just the context provided to you
    question: {question}
    context: {context}
    Provide a concise response with maximum three sentences"
""
    prompt = PromptTemplate(template=template,
                            input_variables=["context","question"])
    llm = ChatOpenAI(model="gpt-4")
    rag_chain = LLMChain(prompt=prompt,llm=llm)
    docs = compression_retriever.invoke(query)
    context = format_docs(docs)
    answer = rag_chain.invoke({"question":query,"context":context})
    return answer 

def index_docs_vectordb(path):
    
    loader = PyPDFDirectoryLoader(path)
    pages = loader.load_and_split()
    faiss_index = FAISS.from_documents(pages, OpenAIEmbeddings())
    return faiss_index

# index docs
path = "earning-calls-apple" # the path to the folder containing the PDF documents
index = index_docs_vectordb(path)

最后,我们定义两个函数——query_vectordb 和 query_graph——分别用于查询矢量存储和图:


  
  def query_vectordb(query):
    answer = query_vector_db(query,index)
    return answer

def query_graph(query,namespace):
    query_response = client.graph.query_graph(namespace, query)
    return query_response.answer

回答图和矢量查询的完整性和局限性

完整性是指系统能够提供查询的所有相关信息,而不会遗漏重要细节。由于关系性质,图数据库可以通过对所有互连数据进行详尽搜索来提供全面的答案。相反,尽管矢量索引可以有效地找到相似的文本块,但它可能并不总能捕捉到更广泛上下文或数据点之间相互关系的完整视图。想象一下,我们需要全面了解直接影响 Apple Mac 产品线的所有市场状况。这可能包括经济因素、供应链问题、竞争动态等。我们可以定义一个 GraphQueryManager 类来检索此信息:


  
  from neo4j import GraphDatabase
class GraphQueryManager:
    def __init__(self, uri, user, password):
        self.driver = GraphDatabase.driver(uri, auth=(user, password))
    def close(self):
        self.driver.close()
    def get_impacting_market_conditions(self, product_name):
        with self.driver.session() as session:
            result = session.run("""
            MATCH (n)-[r:IMPACTS]->(m) WHERE m.name=$product_name AND n.namespace="
apple-earning-calls"
            RETURN n.name as Condition, r.description as Description, m.name as Product
            "
"", product_name=product_name)
            return [{"Condition": record["Condition"], "Description": record["Description"], "Product": record["Product"]} for record in result]

# Usage
graph_manager = GraphQueryManager(url, "neo4j", password)
conditions = graph_manager.get_impacting_market_conditions("Mac")
graph_manager.close()

当我们查询图时,我们会检索所有影响 Apple Mac 的市场条件,从而让我们能够涵盖与该产品相关的所有市场条件。这将产生以下市场条件列表:


  
  for condition in conditions:
print(f"- {condition['Condition']}","\n")
- COVID-19
- foreign exchange
- macro environment
- macroeconomic outlook
- Market Condition
- product
- services
- softening macro
- PC industry
- iPhone
- revenue
- silicon shortage
- strong March results
- product launch
- sellout conditions
- tightness in the supply chain
- COVID disruptions
- foreign currency
- market condition
- macroeconomic headwinds
- macroeconomic outlook
- COVID-related impacts
- FX headwinds
- digital advertising
- gaming
alt

根据图数据库中的结构化关系,每个项目都被标记为对 Mac 有影响。这种直接联系可确保信息具有相关性,并准确针对查询意图。

在我们的基于矢量存储的链上运行相同的查询可能会产生不太完整的答案:

vectordb_conditions = query_vectordb(
"what are the market conditions that impact Mac products?")
print(vectordb_conditions)

影响 Mac 产品的市场条件包括外汇逆风、严重的供应限制以及宏观经济环境。

与图搜索不同,矢量搜索本身并不理解或传达不同市场条件之间的关系及其对 Mac 的影响。它提供的文本块必须经过进一步分析才能理解任何联系。这意味着在分析过程中可能会忽略重要信息,导致答案随着时间的推移不一致。如果没有基于关系的结构来突出显示和列举一组全面的相关概念,则很难使用矢量搜索生成完整的响应。

然而,纯图搜索也有局限性。图将文本的底层信息简化并表示为三元组(即实体-关系-实体)。这种信息的简化和抽象存在丢失部分底层背景的风险。

使用图结构合并基于图和矢量的搜索来发现相关的矢量块是结合确定性导航和上下文感知矢量块数据存储和检索的好方法。下面显示了一个示例,并在 Neo4j 关于 基于图的元数据过滤 的文章中进行了进一步解释。

alt

Neo4j 联合创始人兼首席执行官 Emil Eifrem 表示:“我们认为将矢量揭示的隐性关系与图阐明的明确事实关系和模式相结合很有价值。客户在使用生成式 AI 进行创新时,还需要相信其部署的结果是准确、透明且可解释的。”

深度问题

在 Neo4j 中实现深度参数提供了一种分析图数据库中复杂关系的机制。在下面的代码片段中,我们运行查询以检索 Tim Cook 报告的财务指标以及影响它们的市场状况。

深度参数在 Cypher 查询的关系模式中指定。在本例中,深度参数由 [:REPORTS] 和 [:IMPACTED_BY] 关系中的范围 *1..20 表示。此范围表示从起始节点(“执行”)到目标节点(“财务指标”和“市场状况”)的最小和最大跳数(或关系):


  
  MATCH path = (exec:EXECUTIVE)-[:REPORTS*1..20]->
(metric:FINANCIAL_METRIC)-[:IMPACTED_BY*1..20]->(cond:MARKET_CONDITION)
WHERE exec.name='Tim Cook'  
RETURN exec, metric, cond, path

作为回报,我们得到以下子图。

alt

该图通过探索我们指定的图搜索深度,显示了与我们的查询相关的互连实体。我们还可以注意到,该图能够使用查询使用 WhyHow SDK 构建的图返回的结果浏览面向深度的问题,同时利用最新的块链接功能,该功能使我们能够检索与图中节点相关的块。


  
  from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate, LLMChain
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

def run_chain(question,txt_context):
    template = """ You are a helpful assistant who is able to answer any question using the provided context. Answer the question using just the context provided to you
    Question : {question},
    Context:{context}
    Provide a concise response with maximum three sentences"
""
    prompt = PromptTemplate(template=template,
                            input_variables=["context","question"])

    # load the model
    chat = ChatOpenAI(model_name="gpt-4",openai_api_key=OPENAI_API_KEY, temperature=0.0)
    chain = LLMChain(llm=chat, prompt=prompt)
    answer = chain.invoke({"question":question,'context':txt_context})

def query_graph_with_chain(question):
    context = client.graph.query_graph(
    query = question,
    namespace = "apple-earning-calls",
    include_chunks = True
    )
    txt_context = context.answer 
    txt = " "
    for chunk in context.chunks:
        for text in chunk.chunk_texts:
            txt += text 
    txt_context += txt
    chain_answer = run_chain(question,txt_context)
    return chain_answer['text']

gr = query_graph_with_chain(question['question'])
vc = query_vector_db(question['question'],index)
print("Graph: ", gr)
print("Vector: ", vc['text'])

:高管如何描述疫情期间消费者行为变化对苹果商业模式的影响?

  • 图查询答案 :高管们将疫情期间消费者行为变化的影响描述为导致对苹果产品和服务的需求增加。这在远程工作、在线学习和数字娱乐方面尤为明显。因此,疫情对苹果的商业模式产生了积极影响。
  • Vector DB 回答 :在疫情期间,消费者行为的变化显著影响了 iPhone 14 Pro 和 iPhone 14 Pro Max 的供应。这导致运输时间延长,这是苹果没有预料到的。此外,该公司的产品和服务也受到了一定影响,其中 Mac 和可穿戴设备受到的影响最大,而 iPhone 受到的影响最小。

评论 :图查询提到了消费者行为在特定细分消费者行为(远程工作、在线学习和数字娱乐)中的具体影响。在矢量查询中,答案似乎更笼统地谈论与疫情相关的影响。

:高管讨论如何详述市场状况和苹果大中华区财务业绩之间的关系?

  • 图查询答案 :高管讨论通过研究 iPhone、Mac、iPad 和可穿戴设备等各种 Apple 产品的销售情况,详细说明了大中华区市场状况与 Apple 财务业绩之间的关系。他们还考虑了安装基数和 AppleCare 等因素。iPhone 14 Pro 和 Apple Watch Series 8 等特定产品的受欢迎程度也被考虑在内。
  • Vector DB 回答 :高管讨论通过讨论 COVID 限制和供应限制对需求和增长的影响,详细介绍了市场状况与 Apple 在大中华区的财务业绩之间的关系。尽管面临这些挑战,但 Apple 从 12 月开始看到门店客流量和需求发生了明显变化。此外,尽管供应短缺,但他们提到他们的“Pro”产品周期强劲,表明他们有能力推动消费者选择更高端的产品。

评论 :在图查询中,提到并探讨了特定产品受欢迎程度的详细信息。在矢量查询中,答案似乎更笼统地谈论与疫情相关的影响,大概是因为使用了“市场状况”一词,而不是将其与中国的具体表现更紧密地联系起来。

:苹果采取了哪些具体策略来应对智能手机市场的竞争挑战?

  • 图查询答案 :Apple 通过持续创新和强大的营销活动应对了智能手机市场的竞争挑战。他们还利用独有的功能并在客户中培养品牌忠诚度。这些策略帮助他们在市场上保持竞争力。
  • Vector DB 回答 :苹果应对智能手机市场竞争挑战的策略包括长期管理和快速适应无法控制的情况。他们还投资于创新、人才和积极的社会影响。其他策略还包括创造能够丰富客户生活并帮助释放其创造潜力的技术。

评论 :在图查询中,答案更具体地说明了所使用的策略类型(独有的功能和强大的营销活动),而矢量查询则显得更为宽泛(投资于创新)。

广度问题

广度问题需要广泛的概述,从与特定主题相关的各种概念中提取见解。控制图查询中的广度意味着我们可以扩大或缩小搜索范围。这使我们能够回答需要探索节点周围直接连接的问题,向外扩展以查看起始节点直接连接到多少个不同节点或类型的节点。

alt

在此图中,您可以将此信息输入到 LLM 中以执行后期处理,并通过查找语义相似性来确定哪些数据点最相关,从而识别我们想要跟踪的特定关系类型或特定节点类型。

例如,如果按关系类型:

MATCH (n:PRODUCT)-[r]->(m)
WHERE n.name="iPhone"
RETURN n, r, m
alt

或者按节点类型:

MATCH (n:PRODUCT)-[r]->(m)
WHERE (m:GEOGRAPHIC_SEGMENT OR m:FINANCIAL_METRIC) AND n.name="iPhone"
RETURN n, r, m
alt

:苹果在产品研发中如何平衡技术创新与成本管理?

  • 图查询答案 :Apple 通过大量投资研发来创造先进产品,从而平衡技术创新与成本管理。他们还优化供应链效率来管理成本。此外,他们与供应商协商优惠价格以降低成本。
  • Vector DB 回答 :Apple 通过适应不断上涨的零部件成本和其他市场条件,在产品开发中平衡技术创新和成本管理。他们管理零部件成本的上升和下降,试图有效地应对充满挑战的环境。Apple 还继续投资于创新和人才,专注于提供能够丰富客户生活并帮助释放其创造潜力的技术。

评论 :图查询答案提到了供应商谈判和供应链管理等具体行动。Vector DB 的答案在“应对挑战环境”和“投资创新”方面更加含糊。

深度和广度问题

需要探索图的深度和广度的问题在现实场景中经常遇到。这些问题需要理解深层概念信息,以及这些信息与其他概念的关系。

图数据库允许我们在图查询中结合两种类型的搜索,从而更容易检索具有丰富见解的复杂子图。

在我们的用例中,假设我们想要了解 Apple 的战略决策如何影响其在一系列季度中不同地理区域的财务指标,以及这些指标如何影响产品开发策略。我们可以构建一个图查询来表示这些实体之间的相互关系:


  
  MATCH (exec:EXECUTIVE)-[r1:REPORTS]->(metric:FINANCIAL_METRIC),
(metric)-[r2:IMPACTED_BY]->(cond:MARKET_CONDITION),
(prod:PRODUCT)-[r3:PRESENTS]->(metric),
(prod)-[r4:OPERATES_IN]->(geo:GEOGRAPHIC_SEGMENT),
(event:EVENT)-[r5:OCCURS_DURING]->(time:TIME_PERIOD),
(event)-[r6:IMPACTS]->(metric)
WHERE exec.name IN ['Tim Cook''Luca Maestri'] AND
geo.name IN ['Americas''Europe''Greater China'] AND
time.name IN ['Q1 2023''Q2 2023''Q3 2023']
RETURN exec, metric, cond, prod, geo, event, time, r1,r2,r3,r4,r5,r6
alt

WhyHow 的块链接功能可以解决这些类型的问题,它允许我们使用节点及其对应的块为 LLM 提供完整的上下文。

:蒂姆·库克在苹果 2022 年第四季度财报电话会议上概述了哪些具体策略,以缓解投资者对技术支出增长减速的担忧,特别是与苹果的产品创新和市场扩张计划相关的担忧?

  • 图查询答案 :在 Apple 2022 年第四季度财报电话会议上,蒂姆·库克 (Tim Cook) 提出了缓解投资者对科技支出增长放缓担忧的策略。他强调通过在 iPhone 14 和 iPad Pro 等产品中引入新功能来不断创新,旨在保持市场领先地位和客户兴趣。库克还强调了 Apple 在印度和拉丁美洲等新兴市场的增长,这对于扩大其客户群和销售至关重要。此外,他强调了 Apple Music 等服务的增强以及公司对可持续发展的承诺,包括努力实现碳中和和使用再生材料,这与具有环保意识的利益相关者产生了共鸣。
  • Vector DB 答案 :在苹果 2022 年第四季度财报电话会议上,蒂姆·库克 (Tim Cook) 强调了 iPhone 14 等产品的持续创新、向新兴市场扩张、增强 Apple Music 等服务以及专注于可持续发展努力,解决了人们对技术支出放缓的担忧。

评论: 在图查询答案中,我们可以看到提到的策略涵盖多个地域和产品线,同时更深入地提到特定国家或特定策略的目的。虽然在矢量数据库答案中提到了一些部分,但答案不够详尽(广度)且不够详细(深度)。

深度和广度作为图搜索的手段,增强了矢量搜索

通过图搜索,广度和深度可以被视为多代理系统中检索的潜在手段。协调代理可以评估问题,以确定其检索是否需要更多的广度和/或深度。然后,可以使用离散范围(例如 0.0-1.0)作为图查询的一部分来配置广度或深度的级别。 递归检索 代理可用于帮助确定和进一步评估在水平(广度)或垂直(深度)遍历图时要保留和删除的内容。

仅使用矢量 RAG 很难构建这种特定类型的检索,尤其是以确定性和准确性的方式。这些类型的检索模式展示了使用图结构存储数据以供检索以及 存储语义结构 以供信息导航的新机会。

是否针对广度或深度进行优化取决于具体业务场景或执行查询的用户角色,并且可以根据具体业务场景或执行查询的用户角色进行定制。例如,面向消费者的通用研究平台最初可能更有兴趣针对广度搜索进行优化,在发现用户正在深入研究特定主题后,会逐渐针对深度搜索进行优化。相比之下,律师使用的面向内部的法律 RAG 平台可能从一开始就针对深度搜索进行更多优化。还可以通过允许搜索系统根据用户的风格和偏好针对广度或深度进行优化来实现 RAG 的个性化。

结论

图结构有助于为答案检索的广度和深度创造手段。使用现实世界的财务分析示例,我们看到图结构为在深度和广度上创建更完整的答案提供了更大的手段。它们还创建了一种语义一致、准确且确定的信息检索方法。将图结构与矢量搜索结合使用可实现高水平的确定性和完整检索,这对于企业工作流程至关重要。

原文链接:https://medium.com/neo4j/graph-vs-vector-rag-benchmarking-optimization-levers-and-a-financial-analysis-example-001587219683

原文作者:Chia Jeng Yang

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/684059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# 反射类Assembly 程序集(Assembly)用法

常见的两种程序集&#xff1a; 可执行文件&#xff08;.exe文件&#xff09;和 类库文件&#xff08;.dll文件&#xff09;。 在VS开发环境中&#xff0c;一个解决方案可以包含多个项目&#xff0c;而每个项目就是一个程序集。 他们之间是一种从属关系&#xff0c;也就是说&…

算法第五天之力扣第27题:移除元素

一、移除元素 该题的题目链接如下所示&#xff0c;看题解前先点击或复制下面链接进入力扣做题哦&#xff0c;做题后看会更好哦。 https://leetcode.cn/problems/remove-element/description/https://leetcode.cn/problems/remove-element/description/ 给你一个数组 nums 和一…

【工具】批量SKU生成器

一个用户加我&#xff0c;要我帮忙写一个生成SKU的工具&#xff0c;他希望可以自定义生成的选项&#xff0c;可以批量生成。我到网上找了好久也没有找到好用的&#xff0c;就花了一下午写了这个生成sku的功能 工具支持批量生成SKU&#xff0c;支持自定义配置项&#xff0c;支持…

03_Windows11_PyTorch_GPU版本安装

1. 创建虚拟环境 1.1 查看所有的虚拟环境 使用超级管理员,打开 Anaconda Prompt conda info --envs conda env list 1.2 创建 PyTorch 虚拟环境 使用 nvidia-smi 命令,查看本机 CUDA 版本 打开pytorch官网 PyTorch ,查看相应版本pytorch即依赖关系 创建虚拟环境 conda…

自定义类型:枚举和联合体

在之前我们已经深入学习了自定义类型中的结构体类型 &#xff0c;了解了结构体当中的内存对齐&#xff0c;位段等知识&#xff0c;接下来在本篇中将继续学习剩下的两个自定义类型&#xff1a;枚举类型与联合体类型&#xff0c;一起加油&#xff01;&#xff01; 1.枚举类型 …

模拟实现priority_queue

文章目录 priority_queue简介priority_queue的实现Myless和Mygreaterpushpop常规接口 全部代码测试代码 总结 priority_queue简介 priority_queue是优先级队列。 什么是优先级队列&#xff1f; 优先级队列&#xff08;Priority Queue&#xff09;是一种数据结构&#xff0c;用于…

【动手学深度学习】使用块的网络(VGG)的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 多层感知机模型选择、欠拟合和过拟合 &#x1f30d;3.2 练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 理解块的网络结构&#xff1b;比较块的网络与传统…

Linux基础 (十四):socket网络编程

我们用户是处在应用层的&#xff0c;根据不同的场景和业务需求&#xff0c;传输层就要为我们应用层提供不同的传输协议&#xff0c;常见的就是TCP协议和UDP协议&#xff0c;二者各自有不同的特点&#xff0c;网络中的数据的传输其实就是两个进程间的通信&#xff0c;两个进程在…

activiti用法随记

案例&#xff1a; 摘抄于官网&#xff0c;假设我们有如下流程&#xff1a; 流程对应的bpmn文件如下&#xff1a; <definitions xmlns:activiti"http://activiti.org/bpmn" xmlns:bpmndi"http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc&quo…

configuration_auto.py in getitem raise KeyError(key) KeyError: ‘llama‘解决方案

运行LLaMA-7b模型有时候会报错“configuration_auto.py in getitem raise KeyError(key) KeyError:llama”如下所示&#xff1a; 解决办法升级安装transformer库即可&#xff0c;如下所示&#xff1a; pip install transformers4.30.0

vue3设置全局变量并获取 全局响应式变量 窗口大小

设置 js文件统一管理全局变量 方法1 app provide() 全局提供变量 通过inject()使用 方法2 app实例配置全局变量 获取 通过 getCurrentInstance.appContext.config.globalProperties.$innerWidth访问到 code import { ref } from vue export const useGlobalState () > {c…

新型AI编程语言Mojo来了!比Python快68000倍! 坚持每天写代码,真的能提高编程水平吗?

2024 年 3 月 29 日&#xff0c;Modular Inc. 宣布开源 Mojo 的核心组件。 Mojo语言是一种新的编程语言&#xff0c;由 Chris Lattner&#xff08;LLVM 和 Swift 语言的创始人&#xff09;创建的 Modular AI 公司开发。 它结合了Python的易用性和C的性能&#xff0c;旨在为人…

二说springboot3的自动配置机制

大家好&#xff0c;这里是教授.F 目录 SpringBootApplication&#xff1a; EableAutoConfiguration&#xff1a; 上一篇文章粗略的讲了自动配置机制&#xff0c;二说系列将从源码的角度进行讲解。 SpringBootApplication&#xff1a; 首先我们还是得从SpringBootApplication…

电商APP用户体验提升技巧:一个实战案例

随着网络和移动技术的快速发展&#xff0c;加上全球疫情的影响&#xff0c;电子商务应用程序改变了人们的购物方式&#xff0c;积累了大量的用户群体。如今&#xff0c;一个成功的电子商务应用程序&#xff0c;除了网站用户界面的美&#xff0c;电子商务用户体验的设计&#xf…

图片格式怎么转成pdf,简单的方法

在现代数字化时代&#xff0c;图片格式转换成PDF已经成为许多人的日常需求。无论是为了存档、分享还是打印&#xff0c;将图片转换为PDF都是一项非常实用的技能。本文将详细介绍如何将图片格式转换成PDF的方法。 用浏览器打开 "轻云处理pdf官网&#xff0c;上传图片。 图…

SpringBoot 请求响应

SpringBoot 请求响应 来源于黑马程序员JavaWeb课程&#xff0c;总结笔记 1.ApiFox Apifox快速入门教程 2.基本参数 简单参数&#xff1a;在向服务器发起请求时&#xff0c;向服务器传递的是一些普通的请求数据。 //RequestController.java import jakarta.servlet.http.Htt…

一线教师教学工具汇总

亲爱的教师们&#xff01;我们的教学工具箱里也该更新换代啦&#xff01;今天&#xff0c;就让我来给大家安利一波超实用的教学神器&#xff1a; 百度文库小程序 —— 在线图书馆 百度文库&#xff0c;一个宝藏级的在线文档分享平台&#xff01;在这里&#xff0c;你可以找到海…

康谋技术 | 自动驾驶:揭秘高精度时间同步技术(二)

在自动驾驶中&#xff0c;对车辆外界环境进行感知需要用到很多传感器的数据&#xff08;Lidar&#xff0c;Camera&#xff0c;GPS/IMU&#xff09;&#xff0c;如果计算中心接收到的各传感器消息时间不统一&#xff0c;则会造成例如障碍物识别不准等问题。 为了对各类传感器进…

VSCode插件EditorConfig for VS Code

1. 安装 2. 配置 # http://editorconfig.orgroot true[*] # 表示所有文件适用 charset utf-8 # 设置文件字符集为 utf-8 indent_style space # 缩进风格&#xff08;tab | space&#xff09; indent_size 4 # 缩进大小 end_of_line lf # 控制换行类型(lf | cr | crlf) tr…

鸿蒙低代码开发一个高频问题

在版本是DevEco Studio 3.1.1 Release&#xff0c;SDK是3.1.0(API9)。 创建和设计的visual文件经常会遇到无法渲染的情况&#xff0c;或者自定义组件在Custom列表中突然不见了的情况。 有以下报错信息的&#xff1a; JSON schema validation error: data/visualModel/value/…