函数调用及Chain——SQL+GLM

发布于:2025-05-01 ⋅ 阅读:(31) ⋅ 点赞:(0)

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_sql

resp = 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 RunnablePassthrough


create_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_chain

resp = chain.invoke({'question': '请问:一共有多少个员工?'})
print(resp)

resp = chain.invoke({'question': '请问:哪个员工的工资最高?并且返回该员工的工资'})
print(resp)

chain的流程


网站公告

今日签到

点亮在社区的每一天
去签到