文档问题描述
讨论中原始问题仍未得到解答,因此我不确定这是否是一个显而易见的问题,还是确实需要纠正的文档中的一个空白。
我已经查阅了文档、示例和源代码,但仍然不清楚当你执行 query()
NLSQLTableQueryEngine 时到底会发生什么。根据我所了解的,一个 SQL 检索器通过使用预定义的提示并将模式作为上下文来形成提示,将其发送到 LLM,获取 SQL 查询,从 SQL 服务器获取结果并将其附加到最终发送到 LLM 的提示。然而,我找到的关于模式的唯一提及似乎会产生一个巨大的冗长的模式,不适合上下文窗口。
整个过程应该被记录下来,这不应该超过几行。
非常感谢!
文档链接
https://docs.llamaindex.ai/en/stable/api_reference/query_engine/NL_SQL_table/?h=nlsqltablequeryengine#llama_index.core.query_engine.NLSQLTableQueryEngine
5条答案
按热度按时间2ledvvac1#
嘿,@szhydkov!我在这里帮助你解决任何bug、问题或贡献。让我们一起解决这个问题!
Llama Index API中的
NLSQLTableQueryEngine
使用管道将自然语言查询处理为SQL查询并执行它们。以下是当调用query()
方法时发生的详细过程:NLSQLTableQueryEngine
使用各种参数(包括SQL数据库、提示模板、上下文查询参数和响应合成和详细程度标志)进行初始化。NLSQLRetriever
的示例并分配给_sql_retriever
。query()
方法时,它会内部调用BaseSQLTableQueryEngine
类的_query()
方法。_query()
方法首先通过在sql_retriever
上调用retrieve_with_metadata()
来检索SQL查询和元数据。NLSQLRetriever
的retrieve_with_metadata()
方法处理自然语言查询以生成SQL查询。synthesize_response
为True
,则使用response_synthesis_prompt
的_query()
方法合成响应。get_response_synthesizer()
函数创建响应合成器,该函数将格式化SQL查询及其结果为连贯的响应。synthesize_response
为False
,则直接返回原始SQL查询结果。Response
对象中并返回。以下是说明此过程的相关代码片段:
此外,Llama Index文档提供了一个关于设置文本到SQL管道的高级指南,其中包括:
该指南演示了如何加载和摄取数据、定义核心模块(对象索引、检索器、SQLDatabase、Text-to-SQL Prompt、Response synthesis Prompt、LLM),以及使用表检索和行检索功能设置端到端文本到SQL管道。它还包括用于索引表、定义查询管道和运行查询的代码示例。
要获取更详细的信息,请参阅 Llama Index documentation1(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/indices/struct_store/sql_query.py)2(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/indices/struct_store/sql_query.py)3(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/pipeline/query_pipeline_sql.ipynb)。
hgncfbus2#
感谢Dosu,然而它仍然没有完全回答我的问题。考虑这样的代码:
我如何确切地查看正在发送的提示以生成SQL查询?当日志设置为INFO时,会打印出模式,但它有50k个令牌,所以我不明白这是如何发送到模型提供者(groq)的。
yb3bgrhw3#
要查看在使用
NLSQLTableQueryEngine
时发送的确切提示以生成 SQL 查询,您可以启用详细日志记录。这将记录提示的详细信息,包括从自然语言输入生成的 SQL 查询。以下是操作方法:设置
verbose=True
后,NLSQLTableQueryEngine
将记录提示的详细信息,包括从自然语言输入生成的 SQL 查询 1(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/indices/struct_store/sql_query.py)。关于大型模式,
NLSQLTableQueryEngine
通过允许您使用tables
参数指定表的子集来处理大型模式。这可以帮助在将其发送到 LLM 之前截断或汇总模式。以下是一个示例:这样,您可以管理模式大小并确保提示适应模型提供者 2(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/indices/struct_store/sql_query.py)1(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/indices/struct_store/sql_query.py) 的上下文窗口。
kd3sttzy4#
我无法让
verbose=True
正常工作,但是将日志级别设置为DEBUG有助于解决问题:它记录了发送给提供商API的请求。这揭示了使用完整模式大约需要5k个令牌,因此它适合在8k个令牌窗口内。如果我还想通过使用更简洁的表示形式来减少提示大小,我应该怎么做?oxcyiej75#
为了通过使用更简洁的模式表示来减小提示大小,您可以专注于模式的关键部分并删除冗余或不太重要的信息。以下是模式的更简洁表示:
这种简洁的表示在保留模式的核心功能和结构的同时省略了不太关键的细节。此外,您还可以使用提示模板进一步简化模式表示,如LlamaIndex示例所示:
使用提示模板有助于保持简洁和有序的模式表示。