llama_index ``` [问题]: pydantic.v1.error_wrappers.ValidationError: 7个验证错误,针对QueryEndEvent ```

4si2a6ki  于 2个月前  发布在  其他
关注(0)|答案(7)|浏览(44)

将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
iugsix8n

iugsix8n1#

要解决 pydantic.v1.error_wrappers.ValidationError 与 7 个验证错误相关的 QueryEndEvent 问题,请确保 queryresponse 字段分别用 QueryTypeRESPONSE_TYPE 的示例正确填充。此外,在将向量搜索查询与 SQL 查询合并时,请使用 LlamaIndex 框架提供的适当查询引擎和工具。
以下是如何正确示例化和使用 QueryEndEvent 以及设置 SQL 和向量查询引擎的示例:

from llama_index.core.instrumentation.events.query import QueryEndEvent
from llama_index.core.schema import QueryType
from llama_index.core.base.response.schema import RESPONSE_TYPE
from llama_index.legacy.query_engine.sql_vector_query_engine import SQLAutoVectorQueryEngine
from llama_index.legacy.indices.struct_store.sql_query import BaseSQLTableQueryEngine
from llama_index.legacy.query_engine.retriever_query_engine import RetrieverQueryEngine
from llama_index.legacy.tools.query_engine import QueryEngineTool

# Example query and response
query_example = QueryType("SELECT * FROM table WHERE vector_search = 'example'")
response_example = RESPONSE_TYPE({"result": "some_result"})

# Setting up SQL and vector query engines
sql_query_engine = BaseSQLTableQueryEngine()  # Replace with actual initialization
vector_auto_retriever = RetrieverQueryEngine()  # Replace with actual initialization

# Creating SQLAutoVectorQueryEngine instance
sql_vector_query_engine = SQLAutoVectorQueryEngine.from_sql_and_vector_query_engines(
    sql_query_engine=sql_query_engine,
    sql_tool_name="SQL Tool",
    sql_tool_description="SQL Query Engine Tool",
    vector_auto_retriever=vector_auto_retriever,
    vector_tool_name="Vector Tool",
    vector_tool_description="Vector Query Engine Tool"
)

# Creating an instance of QueryEndEvent
try:
    event = QueryEndEvent(query=query_example, response=response_example)
    print(event)
except ValidationError as e:
    print(e.json())

确保 query_exampleQueryType 的有效示例,而 response_exampleRESPONSE_TYPE 的有效示例。此外,请确保 SQL 和向量查询引擎已正确初始化并与 SQLAutoVectorQueryEngine 类兼容。如果它们不兼容,您将遇到验证错误。
SQLAutoVectorQueryEngine 类通过验证 sql_query_tool.query_engineBaseSQLTableQueryEngineNLSQLTableQueryEngine 的示例,以及 vector_query_tool.query_engine 是具有类型为 VectorIndexAutoRetriever 的检索器的 RetrieverQueryEngine 示例来确保兼容性。请确保满足这些条件以避免验证错误。
此外,在使用向量搜索查询时,请确保正确填充 VectorSearchQueryRequest 模型。以下是如何使用 VectorSearchQueryRequest 模型的示例:

from pydantic import ValidationError
from manager_client.models.vector_search_query_request import VectorSearchQueryRequest

# Example vector search query request
vector_search_query = VectorSearchQueryRequest(
    query_string="example query",
    similarity_top_k=5
)

try:
    print(vector_search_query.to_json())
except ValidationError as e:
    print(e.json())

请确保 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

此响应旨在帮助您节省时间并提高效率。它不是精确解决方案,而是您自己研究的起点。
请帮助我变得更有用!如果您觉得有帮助,请留下一个赞成票(👍),如果无关紧要,请留下一个反对票(👎)。

  • 要继续讨论,请提及 @dosu。*
qcbq4gxm

qcbq4gxm2#

如何提高源代码质量?@dosu

ia2d9nvy

ia2d9nvy3#

为了解决 pydantic.v1.error_wrappers.ValidationError 问题并正确使用 LlamaIndex 框架将向量搜索查询与 SQL 查询合并,您需要确保传递给 from_sql_and_vector_query_engines 方法的类型和参数与预期类型一致。此外,您还应确保向量存储得到正确初始化和使用。
以下是改进后的源代码:

  1. 确保 vector_auto_retriever 参数正确地作为 VectorIndexAutoRetriever 类型而不是 RetrieverQueryEngine 类型。
  2. 更正文档字符串以匹配参数名称 vector_auto_retriever
  3. 在查询中确保向量存储得到正确初始化和使用。
@classmethod
def from_sql_and_vector_query_engines(
    cls,
    sql_query_engine: Union[BaseSQLTableQueryEngine, NLSQLTableQueryEngine],
    sql_tool_name: str,
    sql_tool_description: str,
    vector_auto_retriever: VectorIndexAutoRetriever,
    vector_tool_name: str,
    vector_tool_description: str,
    selector: Optional[Union[LLMSingleSelector, PydanticSingleSelector]] = None,
    **kwargs: Any,
) -> "SQLAutoVectorQueryEngine":
    """From SQL and vector query engines.

Args:
sql_query_engine (BaseSQLTableQueryEngine): SQL query engine.
vector_auto_retriever (VectorIndexAutoRetriever): Vector retriever.
selector (Optional[Union[LLMSingleSelector, PydanticSingleSelector]]):
Selector to use.

"""
    sql_query_tool = QueryEngineTool.from_defaults(
        sql_query_engine, name=sql_tool_name, description=sql_tool_description
    )
    vector_query_tool = QueryEngineTool.from_defaults(
        vector_auto_retriever,
        name=vector_tool_name,
        description=vector_tool_description,
    )
    return cls(sql_query_tool, vector_query_tool, selector, **kwargs)

# Example usage with PGVectorStore
from llama_index.vector_stores.postgres import PGVectorStore
import os

URL = "postgresql+psycopg2://{username}:{password}@{host}:{port}/{db_name}".format(
    port=os.getenv("RELYT_PORT", "5432"),
    host=os.getenv("RELYT_HOST", "localhost"),
    username=os.getenv("RELYT_USER", "postgres"),
    password=os.getenv("RELYT_PASS", "mysecretpassword"),
    db_name=os.getenv("RELYT_NAME", "postgres"),
)

vector_store = PGVectorStore.from_params(
    host=os.getenv("RELYT_HOST", "localhost"),
    port=os.getenv("RELYT_PORT", "5432"),
    database=os.getenv("RELYT_NAME", "postgres"),
    user=os.getenv("RELYT_USER", "postgres"),
    password=os.getenv("RELYT_PASS", "mysecretpassword"),
    table_name="example",
    embed_dim=1536  # Using OpenAI’s text-embedding-ada-002
)

vector_auto_retriever = VectorIndexAutoRetriever(vector_store=vector_store)

# Now use the from_sql_and_vector_query_engines method with the correct parameters
sql_query_engine = ...  # Initialize your SQL query engine
sql_tool_name = "SQL Tool"
sql_tool_description = "Description of SQL Tool"
vector_tool_name = "Vector Tool"
vector_tool_description = "Description of Vector Tool"

query_engine = SQLAutoVectorQueryEngine.from_sql_and_vector_query_engines(
    sql_query_engine=sql_query_engine,
    sql_tool_name=sql_tool_name,
    sql_tool_description=sql_tool_description,
    vector_auto_retriever=vector_auto_retriever,
    vector_tool_name=vector_tool_name,
    vector_tool_description=vector_tool_description
)

此更改确保了 vector_auto_retriever 参数的正确类型和文档记录,以及向量存储的正确初始化和使用,这应该有助于解决 pydantic.v1.error_wrappers.ValidationError1(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

此响应旨在帮助您节省时间并提高效率。它不是精确的解决方案,而是您自己研究的一个起点。
请帮助我变得更有用!如果您觉得有帮助,请留下一个 👍,如果不相关,请留下一个 👎。

  • 要继续讨论,请提及 @dosu。*
k75qkfdt

k75qkfdt4#

但是我正在使用RouterQueryEngine,而不是SQLAutoVectorQueryEngine @dosu。

uxh89sit

uxh89sit5#

要解决在使用 RouterQueryEngine 时出现的 pydantic.v1.error_wrappers.ValidationError 问题,请确保传递给 QueryEndEvent 的数据符合 Pydantic 模型的 schema。具体来说,检查 final_response 是否符合预期的 schema。
以下是如何验证和纠正 final_response 并确保在将其传递给 QueryEndEvent 之前有效载荷包含所需字段的示例:

from llama_index.core.query_engine import RouterQueryEngine
from llama_index.core.callbacks import CBEventType, EventPayload
from llama_index.core.output_parsers.pydantic import PydanticOutputParser
from llama_index.core.base.response.schema import Response

# Assuming `Response` is your Pydantic model
parser = PydanticOutputParser(output_cls=Response)

def _query(self, query_bundle: QueryBundle) -> RESPONSE_TYPE:
    with self.callback_manager.event(
        CBEventType.QUERY, payload={EventPayload.QUERY_STR: query_bundle.query_str}
    ) as query_event:
        # ... (other code)
        # Parse and validate final_response
        final_response = parser.parse(final_response_json)

        query_event.on_end(payload={
            EventPayload.QUERY_STR: query_bundle.query_str,
            EventPayload.RESPONSE: final_response
        })

    return final_response

async def _aquery(self, query_bundle: QueryBundle) -> RESPONSE_TYPE:
    with self.callback_manager.event(
        CBEventType.QUERY, payload={EventPayload.QUERY_STR: query_bundle.query_str}
    ) as query_event:
        # ... (other code)
        # Parse and validate final_response
        final_response = parser.parse(final_response_json)

        query_event.on_end(payload={
            EventPayload.QUERY_STR: query_bundle.query_str,
            EventPayload.RESPONSE: final_response
        })

    return final_response

确保 final_response 结构正确且类型正确,并确保有效载荷包含 queryresponse 字段以解决验证错误 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

此响应旨在提供帮助并节省您的时间。它不是 精确解决方案,而是您自己研究的起点。
帮助我变得更有用!如果这有帮助,请留下一个 👍,如果无关紧要,请留下一个 👎。

  • 要继续对话,请提及 @dosu。*
gr8qqesn

gr8qqesn6#

我不明白,我不能@dosu。

fgw7neuy

fgw7neuy7#

@logan-markewich,这是一个复杂的问题,需要你的专业知识来解决。

细节

关于Dosu

这个回复是为了方便你并节省时间。它不是精确的解决方案,而是你自己研究的一个起点。
帮助我变得更有用!如果这个有帮助,请给我一个👍;如果不相关,请给我一个👎。

  • 要继续对话,请提及@dosu。*

相关问题