函数调用及Chain——SQL+GLM
Langchain+chain+数据库操作_langchain 操作数据库-CSDN博客
本文和基于上述链接 进一步。
初始化数据库&模型
# temperature=0,此处仅需要SQL语句,不需要多样化返回。
from langchain.chains.sql_database.query import create_sql_query_chain from langchain_community.utilities import SQLDatabase from langchain_community.tools import QuerySQLDataBaseTool from langchain_openai import ChatOpenAI# sqlalchemy 初始化MySQL数据库的连接 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'test_db8' USERNAME = 'root' PASSWORD = '123123' # mysqlclient驱动URL MYSQL_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)# 创建模型 model = ChatOpenAI(model='glm-4-0520',temperature=0,api_key='0884a4262379e6b9e98d08be606f2192.TOaCwXTLNYo1GlRM',base_url='https://open.bigmodel.cn/api/paas/v4/' )db = SQLDatabase.from_uri(MYSQL_URI)# print(db.dialect) #打印方言 # print(db.get_usable_table_names()) #表名 # print(db.run('select * from t_emp;')) #SQL查询
生成SQL:create_sql_query_chain
create_sql_query_chain:只生成不执行,有完整的自带Prompt,因此 关键词question不能错
# chian.get_prompts()[0].pretty_print() 打印自带Prompt
chian = create_sql_query_chain(llm=model, db=db) # chian.get_prompts()[0].pretty_print() resp = chian.invoke({'question': '请问:一共有多少个员工?'}) print('大语言模型生成的SQL:' + resp) sql = resp.replace('```sql', '').replace('```', '') print('提取之后的SQL:' + sql)print(db.run(sql))
chain.invoke返回(与GPT4不同,GPT4可以直接获取SQL语句,但GLM的返回内容需要自行提取SQl语句)
自带Prompt
执行SQL:QuerySQLDataBaseTool
这里的lambda 其实也可以换成自定义函数名(不需要加小括号)。
from langchain_community.tools import QuerySQLDataBaseTool from langchain_openai import ChatOpenAI# 生成SQL语句 create_sql = create_sql_query_chain(llm=model, db=db)# 执行SQL语句 execute_sql = QuerySQLDataBaseTool(db=db) # langchain内置的工具chain = create_sql | (lambda x: x.replace('```sql', '').replace('```', '')) | execute_sqlresp = chain.invoke({'question': '请问:一共有多少个员工?'})print(resp)# resp = chian.invoke({'question': '请问:一共有多少个员工?'}) # print('大语言模型生成的SQL:' + resp) # sql = resp.replace('```sql', '').replace('```', '') # print('提取之后的SQL:' + sql) # # print(db.run(sql))
整合model-Prompt-chain
上述内容,仅介绍SQL的生成与执行。下述是完整的LLM问答。
create_sql:生成SQL链
answer_chain:LLM回答链
chain:完整链(create_sql——》execute_sql )+answer_chain
assign(query=create_sql):通过create_sql定义query变量
## chain理论上可以不用RunnablePassthrough写成=create_sql.assign(result= itemgetter('query')| execute_sql) ;但是这样create_sql出来的SQL语句传不到query变量中,就传不进Prompt。
from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import PromptTemplate from langchain_core.runnables import RunnablePassthroughcreate_sql = create_sql | (lambda x: x.replace('```sql', '').replace('```', ''))answer_prompt = PromptTemplate.from_template("""Given the following user question, corresponding SQL query, and SQL result, answer the user question. 用中文回答最终答案Question: {question}SQL Query: {query}SQL Result: {result}Answer: """ )answer_chain = answer_prompt | model | StrOutputParser()chain = RunnablePassthrough.assign(query=create_sql).assign(result= itemgetter('query')| execute_sql) | answer_chainresp = chain.invoke({'question': '请问:一共有多少个员工?'}) print(resp)resp = chain.invoke({'question': '请问:哪个员工的工资最高?并且返回该员工的工资'}) print(resp)
chain的流程