如何将缩写术语表集成到LangChain以优化SQL查询生成(NL2SQL)
解决LangChain对接含缩写列名Oracle数据库的方案
方法1:自定义数据库表与列的描述信息
LangChain的SQLDatabase类支持初始化时传入custom_table_info参数,你可以将缩写列名的映射嵌入表描述,让LLM关联缩写与实际含义。
步骤:
- 先构建包含术语映射的表信息字符串(以订单表为例):
custom_table_info = """ 表ORDERS的列信息: - CST_ID: 对应Customer ID(客户ID) - PRDCT_NUM: 对应Product Number(产品编号) - ORDR_DATE: 订单日期 - CNTRY: 客户所在国家/地区 """
- 初始化
SQLDatabase时传入自定义信息:
from langchain.sql_database import SQLDatabase db = SQLDatabase.from_uri("oracle+cx_oracle://user:pass@host:port/service_name", include_tables=["ORDERS"], # 指定需处理的表 custom_table_info=custom_table_info)
LLM生成SQL时会参考这些描述,将自然语言中的"Customer ID"对应到CST_ID。
方法2:修改SQL工具的系统提示词
通过自定义SQLDatabaseToolkit的提示模板,将缩写术语表直接注入工具提示,让LLM每次调用SQL工具时都能参考映射关系。
代码示例:
from langchain.agents.agent_toolkits import SQLDatabaseToolkit from langchain.prompts import PromptTemplate # 定义包含术语映射的提示模板 custom_prompt = PromptTemplate( input_variables=["input", "table_info", "top_k"], template="""你是SQL专家,需根据用户问题生成正确的Oracle SQL语句。 注意以下列名缩写映射: CST_ID = Customer ID PRDCT_NUM = Product Number 用户问题:{input} 数据库表信息:{table_info} 请生成最多{top_k}条结果的SQL语句,不要返回其他解释。""" ) # 自定义Toolkit并替换默认提示 toolkit = SQLDatabaseToolkit(db=db, llm=chat_client) # 替换sql_db_query工具的提示(第一个工具通常为该工具) toolkit.get_tools()[0].prompt = custom_prompt # 后续创建Agent的代码保持不变 agent_executor = create_sql_agent(llm=chat_client, toolkit=toolkit, agent_type="openai-tools", verbose=True, return_intermediate_steps=True)
方法3:自定义SQL代理的系统提示
对于OpenAI Tools类型的Agent,可直接修改系统提示,将术语表加入全局指令,让LLM全程感知映射关系。
代码示例:
from langchain.agents import create_sql_agent from langchain.agents.agent_toolkits import SQLDatabaseToolkit from langchain_core.messages import SystemMessage toolkit = SQLDatabaseToolkit(db=db, llm=chat_client) # 自定义系统提示,加入缩写映射 system_message = SystemMessage(content="""你是处理Oracle数据库查询的专家,需严格遵循以下列名缩写映射生成SQL: CST_ID = Customer ID PRDCT_NUM = Product Number 请根据用户的自然语言问题,生成准确的SQL语句查询数据库。""") agent_executor = create_sql_agent(llm=chat_client, toolkit=toolkit, agent_type="openai-tools", verbose=True, return_intermediate_steps=True, system_message=system_message)
注意事项
- 若存在大量表和缩写,建议将术语映射整理为结构化字符串(如Markdown列表),避免提示过长影响LLM理解。
- 优先测试方法3,OpenAI Tools类型的Agent对系统提示的感知更直接。
- 可结合方法1与方法3,同时在表描述和系统提示中加入映射,进一步提升准确率。
内容的提问来源于stack exchange,提问作者DataJanitor
相关产品推荐
相关产品推荐

