优化SQL问答:应对大型数据库的策略

0 阅读2分钟

引言

在处理大型数据库时,直接将所有表名、表结构和特征值包含在提示中对于SQL问答是不切实际的。本文将介绍如何在查询生成步骤中动态插入最相关的信息。我们将讨论如何识别相关的表子集及列值子集,为您提供实用的方法和见解。

主要内容

识别相关表子集

当数据库包含许多表时,无法在单个提示中适配所有表的结构。通过工具调用,我们可以提取与用户输入相关的表名,只包含它们的结构。

使用langchain库,我们可以创建一个提示模板,从中提取与用户问题相关的表:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI

class Table(BaseModel):
    name: str = Field(description="Name of table in SQL database.")

prompt_template = ChatPromptTemplate.from_messages(
    [
        ("system", "Return the names of ALL the SQL tables that MIGHT be relevant to the user question."),
        ("human", "{input}"),
    ]
)

llm = ChatOpenAI(model="gpt-4o-mini")
table_names = llm.bind_tools([Table]).invoke({"input": "What are all the genres of Alanis Morissette songs"})

为了改进模型的判断,我们可以通过类别来简化表选择:如“音乐”和“商业”。

识别相关列值

处理高基数列时,我们可以利用向量存储辅助查询。首先,我们从数据库中提取独特的值,然后将它们存储在向量数据库中以供检索:

from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

# 提取独特的值
def query_as_list(query):
    res = db.run(query)
    return [el[0] for el in res]

proper_nouns = query_as_list("SELECT Name FROM Artist")
vector_db = FAISS.from_texts(proper_nouns, OpenAIEmbeddings())
retriever = vector_db.as_retriever(search_kwargs={"k": 15})

我们可以将检索到的值插入提示中,以帮助纠正拼写错误并提高查询准确性。

代码示例

以下是一个结合上述方法的完整示例:

from operator import itemgetter
from langchain.chains import create_sql_query_chain
from langchain_core.runnables import RunnablePassthrough

query_chain = create_sql_query_chain(llm, db)
retriever_chain = (itemgetter("question") | retriever | (lambda docs: "\n".join(doc.page_content for doc in docs)))
full_chain = RunnablePassthrough.assign(proper_nouns=retriever_chain) | query_chain

query = full_chain.invoke({"question": "What are all the genres of Alanis Morissette songs"})
print(query)
result = db.run(query)
print(result)

这个示例展示了如何从大型数据库中动态选取相关信息,并生成准确的SQL查询。

常见问题和解决方案

总结和进一步学习资源

通过方法结合与动态插入技巧,我们可以更高效地处理大型数据库中的SQL问答任务。建议进一步学习langchain和相关系统的官方文档提升技能。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---