AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


KG RAG vs. Vector RAG:基准测试、优化杠杆和财务分析示例 - WhyHow.AI实践
发布日期:2024-06-09 09:40:15 浏览次数: 1677


Neo4j和WhyHow.AI团队探索了图形和向量搜索系统如何相互协作,以改进检索增强生成(RAG)系统。通过使用财务报告RAG示例,我们探讨了图形和向量搜索之间的响应差异,对比了这两种类型的答案输出,展示了如何通过图形结构来优化深度和广度,并发现将图形和向量搜索结合起来是RAG未来的方向。

图形数据库(如Neo4j)建立在图的概念基础上:图包含了节点和关系的集合。节点代表着单个的数据点,而关系定义了它们之间的连接。每个节点都可以拥有属性,这些属性是键值对,提供了有关节点的附加上下文或属性。这种方法提供了一种灵活而直观的方式来建模复杂的关系和数据依赖关系。人们经常将知识图与人脑的工作原理相对比。通过图,可以存储和查询显式的关系,这降低了幻觉,并通过上下文注入提高准确性。

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

此能力在金融分析等领域非常有益,当中对于理解财务指标、市场条件和商业实体之间错综复杂的关系至关重要。

例如,图数据库可将各种信息片段(如高管声明、财务结果和市场条件)连接起来,形成一个完整的模型,反映现实世界的互动。这使得金融分析师能够探索复杂的场景,例如宏观经济变化对特定产品线的影响,通过导航图表以查看直接和间接的影响。使用Cypher,Neo4j的图查询语言,我们可以发现知识图谱中错综复杂的关系,比如一个影响者对产品的影响:

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
RETURNneighbor.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


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

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



为了理解图谱搜索和向量搜索之间的区别,我们将使用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实例里面,我们可以建立如下的图谱.


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

与此同时,我们定义了一个检索链,它使用向量索引来存储与向量表示相同的文档,并使用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

答案的完整性,图谱和向量查询的限制


完整性指的是系统在没有丢失重要细节的情况下,能够提供有关查询的所有相关信息。由于图数据库具有关联性,它们可以通过对所有相互连接的数据进行彻底搜索来提供全面的答案。相反,尽管矢量索引在查找类似文本块方面效率高,但不一定能够完整地捕捉到更广泛的上下文或数据点之间的相互关系。想象一下,如果我们需要直接影响苹果 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()


当我们查询图时,我们检索所有影响苹果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



每个项目都被标记为影响Mac的,这是基于图数据库中的结构化关系。这种直接链接确保信息相关并且准确地针对查询的意图。

在我们基于向量存储的链上运行相同的查询可能会得到一个不太完整的答案:

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


影响Mac产品的市场条件包括外汇波动、重大供应限制和宏观经济环境。

与图搜索不同,向量搜索并不本质地理解或传达不同市场条件之间的关系及其对Mac的影响。它提供的是必须进一步分析以理解任何关联的文本块。这意味着在这种分析过程中可能会忽视重要信息,导致随着时间的推移回答不一致。没有基于关系的结构来突出和列举一套全面有关概念的相关性,使用向量搜索生成完整的回答是困难的。

然而,仅限于图搜索也存在一些限制。图表将文本的基础信息简化并表示为三元组(即实体 - 关系 - 实体)。这种信息的简化和抽象会导致丢失某些基础上下文的风险。

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


“我们认为将向量揭示的隐式关系与图形显示的明确和事实关系以及模式相结合是有价值的。”Neo4j的联合创始人兼首席执行官Emil Eifrem说,“客户在进行生成式人工智能创新时,还需要确保其部署的结果准确、透明和可解释。”

深度问题


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

深度参数是在Cypher查询的关系模式中指定的。在这种情况下,深度参数在[:REPORTS]和[:IMPACTED_BY]关系中都由1到20的范围指示。这个范围表示从起始节点('executive')到目标节点('financial metric'和'market condition')遍历的最小和最大跳数(或关系数):

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


我们得到以下子图。


图表显示了通过探索图搜索中我们指定深度与查询相关的相互连接的实体。我们还可以注意到图表能够利用从查询图构建使用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 和 Wearables 等各种苹果产品的销售情况来进行。他们还考虑了安装基数和 AppleCare 等因素。还考虑了 iPhone 14 Pro 和 Apple Watch Series 8 等特定产品的受欢迎程度。


  • 向量数据库的答案:高管讨论详细介绍了市场状况与苹果在大中华区的财务表现之间的关系,讨论了 COVID 限制和供应限制对需求和增长的影响。尽管面临这些挑战,苹果从十二月份开始看到了店铺交通和需求的显著变化。此外,尽管供应短缺,他们提到了他们的“Pro”产品的强劲周期,表明他们能够引导消费者选择更高端的产品。


评论:在图查询中,提到了特定产品的流行度相关的细节,并进行了探讨。在向量查询中,答案似乎更加泛泛地谈到与疫情相关的影响,这可能是因为术语“市场状况”没有特别强调与中国市场的表现密切相关。

问题: 苹果在智能手机市场面临竞争挑战时采取了哪些详细策略?


  • 图查询答案:苹果通过不断创新和强大的营销活动应对智能手机市场的竞争挑战。他们还利用独特特性并培养了客户忠诚度。这些策略帮助他们在市场上保持竞争力。


  • Vector DB答案:苹果应对智能手机市场上的竞争挑战的策略包括长期管理以及快速适应其无法控制的环境变化。他们还投资于创新、人才和积极的社会影响。其他策略还包括创建能够丰富客户生活并帮助释放他们创造潜力的技术。


评论:在图查询中,答案对所使用的策略类型更具体(专属功能和强力营销活动),而与向量查询相比,后者似乎更广泛(投资创新)。

广度问题


广度问题需要整体概述,从与特定主题相关的各种概念中提取洞见。在图查询中控制广度意味着我们扩展或缩小搜索范围,从而使之受限。这样,我们可以回答需要探索一个节点周围的直接连接以及扩展外部以查看一个起始节点直接连接到多少不同节点或节点类型的问题。


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

例如,如果按照关系类型:

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

或者根据节点类型:

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

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

  • 图查询答案:苹果通过大力投资研发创新产品来平衡技术创新与成本管理。他们还优化供应链效率以控制成本。此外,他们与供应商协商有利的定价以保持低成本。


  • 向量数据库答案:苹果通过适应不断上涨的零部件成本和其他市场条件,在产品开发中平衡技术创新和成本管理。他们努力管理零部件成本的上升和下降,并试图有效地应对具有挑战性的环境。苹果还继续投资于创新和人才,专注于提供能够丰富客户生活并帮助释放创造潜力的技术。


评论:图形查询答案提到了像供应商谈判和供应链管理这样具体的行动。与此相比,Vector DB的答案更加模糊,涉及到“应对艰难环境”和“投资创新”。

深度和广度问题


经常在现实世界的情境中遇到需要探索图的深度和广度的问题。这些问题需要理解深层概念信息以及该信息与其他概念之间的关系。

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

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

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

为了这类问题,WhyHow的块链接功能通过允许我们使用节点及其对应的块来为LLM提供完整的上下文。

问题: 蒂姆·库克在苹果2022财年第四季度业绩电话会议中,针对科技支出增长放缓对于苹果产品创新和市场拓展计划引发的投资者担忧,详细阐述了哪些具体策略?


  • 图形查询答案:在2022年苹果第四季度收益电话会议上,蒂姆·库克提出了缓解投资者对科技支出增长放缓的担忧的策略。他强调通过引入iPhone 14和iPad Pro等产品的新功能来持续创新,以保持市场领导地位和客户兴趣。库克还强调了苹果在印度和拉丁美洲等新兴市场的增长,这对于扩大其客户基础和销售至关重要。此外,他强调了像Apple Music这样的服务的提升,以及公司对可持续发展的承诺,包括朝着碳中和和使用再生材料的努力,这与环保意识强的利益相关者产生了共鸣。


  • Vector DB答案:在2022年苹果第四季度收益电话会议上,蒂姆·库克通过强调在像iPhone 14这样的产品中持续创新、进入新兴市场、提升Apple Music等服务以及专注于可持续发展工作,解决了有关科技支出放缓的担忧。


评论:在图查询的答案中,我们可以看到提到的策略涵盖了多个地理区域和产品线,同时更深入地提到了特定国家或特定策略的目的。虽然向量数据库的答案中提到了部分内容,但答案的覆盖面较小(广度)和详细程度较低(深度)。

深度和广度作为图搜索杠杆来增强向量搜索。


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

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

是否优化广度或深度取决于特定业务场景或执行查询的用户角色,并可以根据其基础进行定制。例如,面向消费者的综合研究平台可能更倾向于最初针对广度搜索进行优化,并在发现用户正在更深入地遍历特定主题时,逐渐优化为深度搜索。相反,律师使用的面向内部的法律RAG平台可能更倾向于从一开始就优化深度搜索。RAG的个体个性化也可以通过允许搜索系统根据用户的风格和偏好优化广度或深度来实现。

Conclusion 结论


图结构有助于创建广度和深度的杠杆用于答案检索。通过一个真实的金融分析示例,我们发现图结构在深度和广度两方面提供了更多的杠杆,从而能够创建更完整的答案。它们还可以创建一种语义一致、准确和确定性的信息检索方式。将图形结构与向量搜索结合使用可以提供高水平的确定性和完整性。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询