将vector_tool与sql_tool合并的代码如下:
import os, sys
import time
import gradio as gr
from llama_index.core import Settings, get_response_synthesizer, SQLDatabase
from llama_index.legacy import VectorStoreIndex, SimpleDirectoryReader, StorageContext, load_index_from_storage, Prompt, ServiceContext, set_global_service_context, SummaryIndex
from llama_index.core.memory import ChatMemoryBuffer
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.legacy.node_parser import SentenceSplitter
from llama_index.legacy.indices.struct_store.sql_query import NLSQLTableQueryEngine
import llama_index.core
from llama_index.core.tools import QueryEngineTool
from llama_index.core.retrievers import VectorIndexAutoRetriever
from llama_index.core.vector_stores import MetadataInfo, VectorStoreInfo
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.query_engine import SQLAutoVectorQueryEngine
from llama_index.core.callbacks import (
CallbackManager,
LlamaDebugHandler,
CBEventType,
)
llama_debug = LlamaDebugHandler(print_trace_on_end=True)
callback_manager = CallbackManager([llama_debug])
node_parser = SentenceSplitter()
Settings.llm = OpenAI(model="gpt-3.5-turbo", temperature=0.1, max_tokens=2200)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small", embed_batch_size=256)
Settings.chunk_size = 1024
from sqlalchemy import create_engine, MetaData, Table, Column, String, Integer, select, text
from llama_index.core.query_engine import SQLTableRetrieverQueryEngine
def load_database():
engine = create_engine("sqlite:///database/abc.db")
metadata_obj = MetaData()
sql_database = SQLDatabase(engine, include_tables=["boat_info", "boat_weight"], sample_rows_in_table_info=2)
from llama_index.core.objects import (
SQLTableNodeMapping,
ObjectIndex,
SQLTableSchema,
)
table_schema_objs = [
(SQLTableSchema(table_name="boat_info", context_str=("这是一张表,存储每艘船只名称,国家,尺寸,服役时间(年)"))),
(SQLTableSchema(table_name="boat_weight", context_str=("这是一张表,存储每艘船只重量(吨),boat_id对应boat_info表的id"))),
] # add a SQLTableSchema for each table
table_node_mapping = SQLTableNodeMapping(sql_database)
obj_index = ObjectIndex.from_objects(
table_schema_objs, table_node_mapping, VectorStoreIndex,
)
query_engine = SQLTableRetrieverQueryEngine(sql_database, obj_index.as_retriever(similarity_top_k=3))
return query_engine
def load_vector_index():
PERSIST_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__))) + ".\storage"
PATH = os.path.abspath(os.path.dirname(os.path.abspath(__file__))) + '\data'
service_content = ServiceContext.from_defaults(chunk_size=1024)
vector_query
```python
print("断点2")
# vector_tool = QueryEngineTool.from_defaults(
# query_engine=retriever_query_engine,
# description=(
# f"Useful for answering semantic questions about shipping industry related information"
# ),
# )
boats = [
"关于船舶行业的研究报告",
"关于船舶行业的规范",
]
vector_tools = []
for boat, query_engine in zip(boats, retriever_query_engine):
print("断点3")
vector_tool = QueryEngineTool.from_defaults(
query_engine=query_engine,
name=boat,
description=f"Useful for answering semantic questions about {boat}",
)
vector_tools.append(vector_tool)
# query_engine = SQLAutoVectorQueryEngine(
# sql_tool, vector_tool,llm=Settings.llm,
# )
from llama_index.core.query_engine import RouterQueryEngine,SQLJoinQueryEngine
from llama_index.core.selectors import (PydanticMultiSelector,PydanticSingleSelector,LLMSingleSelector,LLMMultiSelector)
query_engine = RouterQueryEngine(
selector=LLMSingleSelector.from_defaults(),
query_engine_tools=([sql_tool]+vector_tools),
verbose=True,
)
print("断点4")
return query_engine
sql_query_engine=load_database()
retriever_query_engine=load_vector_index()
query_engine = load_SQLAutoVectorQueryEngine(sql_query_engine,retriever_query_engine)
print("断点5")
## query_engine.callback_manager = callback_manager
response = query_engine.query("重大技术装备推广目录的通知?")
print(response)
error:
加载向量索引
断点1
断点2
断点3
断点3
断点4
断点5
Selecting query engine 1: The question is related to a research report about the shipbuilding industry, which is more closely related to choice 2..
Selecting query engine 2: The question is related to regulations in the shipbuilding industry, which is less relevant to choice 3..
重大技术装备推广目录的通知? The notice is about the release of the "Guidance Catalog for the Promotion and Application of Major Technical Equipment - Shipbuilding and Ocean Engineering Field (2022 Edition)" by the China Shipbuilding Industry Association.
Traceback (most recent call last):
File "e:\AiCompany\llama-index\llama_agent_copy_2.py", line 168, in
response = query_engine.query("重大技术装备推广目录的通知?")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\anaconda\Lib\site-packages\llama_index\core\instrumentation\dispatcher.py", line 274, in wrapper
result = func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\anaconda\Lib\site-packages\llama_index\core\base\base_query_engine.py", line 55, in query
dispatch_event(QueryEndEvent(query=str_or_query_bundle, response=query_result))
^\nFile "E:\anaconda\Lib\site-packages\pydantic\v1\main.py", line 341, in **init**
raise validation_error
pydantic.v1.error_wrappers.ValidationError: 7 validation errors for QueryEndEvent
response -> source_nodes -> 0 -> node
Can't instantiate abstract class BaseNode with abstract methods get_content, get_metadata_str, get_type, hash, set_content (type=type_error)
response -> source_nodes -> 1 -> node
Can't instantiate abstract class BaseNode with abstract methods get_content, get_metadata_str, get_type, hash, set_content (type=type_error)
response -> source_nodes -> 2 -> node
Can't instantiate abstract class BaseNode with abstract methods get_content, get_metadata_str, get_type, hash, set_content (type=type_error)
response -> source_nodes -> 3 -> node
Can't instantiate abstract class BaseNode with abstract methods get_content, get
7条答案
按热度按时间iugsix8n1#
要解决
pydantic.v1.error_wrappers.ValidationError
与 7 个验证错误相关的QueryEndEvent
问题,请确保query
和response
字段分别用QueryType
和RESPONSE_TYPE
的示例正确填充。此外,在将向量搜索查询与 SQL 查询合并时,请使用 LlamaIndex 框架提供的适当查询引擎和工具。以下是如何正确示例化和使用
QueryEndEvent
以及设置 SQL 和向量查询引擎的示例:确保
query_example
是QueryType
的有效示例,而response_example
是RESPONSE_TYPE
的有效示例。此外,请确保 SQL 和向量查询引擎已正确初始化并与SQLAutoVectorQueryEngine
类兼容。如果它们不兼容,您将遇到验证错误。SQLAutoVectorQueryEngine
类通过验证sql_query_tool.query_engine
是BaseSQLTableQueryEngine
或NLSQLTableQueryEngine
的示例,以及vector_query_tool.query_engine
是具有类型为VectorIndexAutoRetriever
的检索器的RetrieverQueryEngine
示例来确保兼容性。请确保满足这些条件以避免验证错误。此外,在使用向量搜索查询时,请确保正确填充
VectorSearchQueryRequest
模型。以下是如何使用VectorSearchQueryRequest
模型的示例:请确保
VectorSearchQueryRequest
中的字段正确填充,以避免出现验证错误 1(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/instrumentation/events/query.py)2(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/query_engine/sql_vector_query_engine.py)3(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/query_engine/sql_vector_query_engine.py)4(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/vector_stores/llama-index-vector-stores-wordlift/manager_client/models/vector_search_query_request.py)。详细信息
关于 Dosu
此响应旨在帮助您节省时间并提高效率。它不是精确解决方案,而是您自己研究的起点。
请帮助我变得更有用!如果您觉得有帮助,请留下一个赞成票(👍),如果无关紧要,请留下一个反对票(👎)。
qcbq4gxm2#
如何提高源代码质量?@dosu
ia2d9nvy3#
为了解决
pydantic.v1.error_wrappers.ValidationError
问题并正确使用 LlamaIndex 框架将向量搜索查询与 SQL 查询合并,您需要确保传递给from_sql_and_vector_query_engines
方法的类型和参数与预期类型一致。此外,您还应确保向量存储得到正确初始化和使用。以下是改进后的源代码:
vector_auto_retriever
参数正确地作为VectorIndexAutoRetriever
类型而不是RetrieverQueryEngine
类型。vector_auto_retriever
。此更改确保了
vector_auto_retriever
参数的正确类型和文档记录,以及向量存储的正确初始化和使用,这应该有助于解决pydantic.v1.error_wrappers.ValidationError
1(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/query_engine/sql_vector_query_engine.py)2(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/vector_stores/llama-index-vector-stores-relyt/llama_index/vector_stores/relyt/base.py)3(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/vector_stores/llama-index-vector-stores-postgres/llama_index/vector_stores/postgres/base.py) 问题。详细信息
关于 Dosu
此响应旨在帮助您节省时间并提高效率。它不是精确的解决方案,而是您自己研究的一个起点。
请帮助我变得更有用!如果您觉得有帮助,请留下一个 👍,如果不相关,请留下一个 👎。
k75qkfdt4#
但是我正在使用RouterQueryEngine,而不是SQLAutoVectorQueryEngine @dosu。
uxh89sit5#
要解决在使用
RouterQueryEngine
时出现的pydantic.v1.error_wrappers.ValidationError
问题,请确保传递给QueryEndEvent
的数据符合 Pydantic 模型的 schema。具体来说,检查final_response
是否符合预期的 schema。以下是如何验证和纠正
final_response
并确保在将其传递给QueryEndEvent
之前有效载荷包含所需字段的示例:确保
final_response
结构正确且类型正确,并确保有效载荷包含query
和response
字段以解决验证错误 1(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/query_engine/router_query_engine.py)2(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/instrumentation/events/query.py)3(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/output_parsers/pydantic.py)。详细信息
关于 Dosu
此响应旨在提供帮助并节省您的时间。它不是 精确解决方案,而是您自己研究的起点。
帮助我变得更有用!如果这有帮助,请留下一个 👍,如果无关紧要,请留下一个 👎。
gr8qqesn6#
我不明白,我不能@dosu。
fgw7neuy7#
@logan-markewich,这是一个复杂的问题,需要你的专业知识来解决。
细节
关于Dosu
这个回复是为了方便你并节省时间。它不是精确的解决方案,而是你自己研究的一个起点。
帮助我变得更有用!如果这个有帮助,请给我一个👍;如果不相关,请给我一个👎。