LangChain集成SQLDatabaseToolkit遇类型错误,同时存在PyODBC连接警告问题
LangChain集成SQLDatabaseToolkit遇类型错误,同时存在PyODBC连接警告问题
嘿,我来帮你搞定这两个问题!先解决那个直接导致程序崩溃的类型错误,再处理连接时的警告提示。
一、解决SQLDatabaseToolkit的ValidationError类型错误
你遇到的这个错误核心原因很明确:SQLDatabaseToolkit需要的是LangChain封装的SQLDatabase实例,而不是SQLAlchemy直接返回的数据库连接对象。你现在用db = engine.connect()得到的是SQLAlchemy原生的Connection对象,完全不符合Toolkit的参数要求。
修改方法超简单,把创建db的代码换成LangChain的SQLDatabase实例即可:
# 替换原来的 db = engine.connect() db = SQLDatabase(engine)
或者你也可以直接用连接字符串创建SQLDatabase,效果是一样的:
db = SQLDatabase.from_uri(f"mssql+pyodbc://{SERVER}/{DATABASE}?Trusted_Connection=yes&Driver={{{DRIVER}}}")
这样再传入SQLDatabaseToolkit(db=db, llm=llm)就不会触发类型错误了。
二、解决PyODBC连接的SAWarning警告
这个警告是因为PyODBC在使用无DSN连接时,对驱动名称的格式有特殊要求——驱动名称必须用大括号{}包裹,而你的f-string直接输出了驱动名称,没有对大括号做转义处理,导致SQLAlchemy识别不到正确的驱动信息。
修改你的create_engine连接字符串,把Driver={DRIVER}改成Driver={{{DRIVER}}}(双重大括号在f-string里会自动转义成单个大括号):
engine = create_engine(f"mssql+pyodbc://{SERVER}/{DATABASE}?Trusted_Connection=yes&Driver={{{DRIVER}}}")
这样PyODBC就能正确识别驱动名称,烦人的警告就会消失了。
修改后的完整可运行代码
#import the appropriate capabilities from langchain from langchain.llms import OpenAI from langchain.agents import create_sql_agent from sqlalchemy import create_engine from langchain.agents.agent_toolkits import SQLDatabaseToolkit from langchain.sql_database import SQLDatabase from langchain.agents import AgentExecutor from langchain.agents.agent_types import AgentType from langchain.chat_models import ChatOpenAI import os #record our code in our environment os.environ['OPENAI_API_KEY'] = key #Establish connection with sample database (including: 'customers', 'agents', and 'orders' tables) DRIVER = 'ODBC Driver 17 for SQL Server' SERVER = 'tmwsql01' DATABASE = 'DBJimmyTest' # 修复连接字符串,解决SAWarning engine = create_engine(f"mssql+pyodbc://{SERVER}/{DATABASE}?Trusted_Connection=yes&Driver={{{DRIVER}}}") # 替换为LangChain的SQLDatabase实例,解决类型错误 db = SQLDatabase(engine) llm=OpenAI(temperature=0) toolkit = SQLDatabaseToolkit(db=db, llm=llm) #Create a SQL Agent to Process SQL Information agent_executor = create_sql_agent( #temperature rating from 0 to 1 determines how creative the ai is (0 = minimum creativity, 1 = maximum) llm=ChatOpenAI(temperature=0), toolkit=toolkit, verbose=True, agent_type="openai-functions" ) agent_executor("what is the name of each artist's longest song? Please put only one song per artist")
备注:内容来源于stack exchange,提问作者Jimmy Sgrazzutti
相关产品推荐
相关产品推荐

