小白学习langchain第二弹:连接mysql数据库实现对话的两种方式

两种方式介绍

使用的大模型是ollama本地启动的DeepsSeek-r1:8b模型,大模型可以根据连接数据库,根据你的问题,生成SQL语句,并通过langchain提供的工具包进行sql查询,并返回结果。

方式一 生成sql语句,之后查询给出结果

此种方式分为两个步骤,第一个chain根据问题得出具体的SQL语句,之后创建chain将查询语句、执行查询、问答模版、模型、输出模式解析,给出结果,这个方式每次就进行一次查询。

python 复制代码
# 创建模型与数据库的chain,负责将自然语言转为SQL
test_chain = create_sql_query_chain(model,db)

answer_prompt = PromptTemplate.from_template(
    """给定以下用户问题、SQL语句和SQL执行后的结果,回答用户问题。
    Question:{question}
    SQL Query:{query}
    SQL Result: {result}
    回答:"""
)
# 创建一个执行SQL语句的工具
execute_sql_tool = QuerySQLDataBaseTool(db=db)

# 生成sql,执行sql
chain = (RunnablePassthrough.assign(query=test_chain).assign(result=itemgetter('query')|execute_sql_tool)
         |answer_prompt|model|StrOutputParser())

resp = chain.invoke(input={'question':'请问:用户表有多少条数据'})

方式二 利用SQLDtabaseToolit连接数据库和模型,创建agent执行操作

agent方式可以进行多次查询和联表查询等复杂的查询,更推荐一些

python 复制代码
db = SQLDatabase.from_uri(MYSQL_URI)

toolkit = SQLDatabaseToolkit(db=db,llm=model)
tools = toolkit.get_tools()

system_prompt = """
您是一个被设计用来与SQL数据库交互的代理。
给定一个输入问题,创建一个语法正确的SQL语句并执行,然后查看查询结果并返回答案。
除非用户指定了他们想要获得的示例的具体数量,否则始终将SQL查询限制为最多10个结果。
你可以按相关列对结果进行排序,以返回MySQL数据库中最匹配的数据。
您可以使用与数据库交互的工具。在执行查询之前,你必须仔细检查。如果在执行查询时出现错误,请重写查询SQL并重试。
不要对数据库做任何DML语句(插入,更新,删除,删除等)。

首先,你应该查看数据库中的表,看看可以查询什么。
不要跳过这一步。
然后查询最相关的表的模式。
"""
system_message = SystemMessage(content=system_prompt)
# 创建代理,可以将工具、模型和系统信息关联,更直接方便
agent_executor = chat_agent_executor.create_tool_calling_executor(model,tools,system_message)

result = agent_executor.invoke({'messages':[HumanMessage(content='哪个部门下员工人数最多')]})

re1 = result['messages']
# 结果在最后一个索引地址
print(re1[len(re1) - 1])

本地搭建mysql容器

拉取mysql镜像,创建对应映射目录、创建配置、后台启动docker,在MAC下记得将docker启动哦!

shell 复制代码
#!/bin/bash

docker pull mysql:8.0.39
mkdir -p /Users/a/service/mysql/data
mkdir -p /Users/a/service/mysql/conf
mkdir -p /Users/a/service/mysql/logs


cat  << EOF >/Users/a/service/mysql/conf/my.cnf
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
default-time_zone = '+8:00'
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
EOF

docker run -p 3306:3306 --name mysql -v /Users/chenyijing/service/mysql/logs:/logs -v /Users/chenyijing/service/mysql/data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.39

执行完上述脚本后,可以进行数据库连接和测试,我是在pycharm的右侧边栏database测试的。

遇到了的问题

ModuleNotFound MQYSQLdb但在pip install mysql-client的时候报错 Trying pkg-config --exists mysqlclient Command 'pkg-config --exists mysqlclient' returned non-zero exit status 1.

参考以下安装mysql和安装mysql的客户端包

shell 复制代码
brew install mysql
pip install mysqlclient

完整代码

放到github上了 github.com/fleurchen/l...

本次文章参考:【绝对是B站最全最细的LangChain大模型全套教程(AI学习路线Langchain+项目深度实战),七天就能从入门到就业!让你少走99%的弯路!】www.bilibili.com/video/BV1YN...

相关推荐
明明跟你说过5 小时前
基于【Lang Chain】构建智能问答系统的实战指南
人工智能·语言模型·chatgpt·langchain
玲小珑5 小时前
5分钟学会LLM开发系列教程(五)Agent的最终形态LangGraph
langchain·node.js·ai编程
掘金安东尼6 小时前
DeepSeek-R1 全托管无服务器上线亚马逊云 Bedrock,为何值得关注?
人工智能·llm
掘金安东尼6 小时前
颠覆 LLM?Meta 提出 LCM 这个新范式
人工智能·llm
Goboy7 小时前
Java版的深度学习 · 手撕 DeepLearning4J实现手写数字识别 (附UI效果展示)
llm·aigc·ai编程
前端加油站7 小时前
LangChain.js:打造自己的 LLM 应用
langchain·llm
Goboy7 小时前
用AI从零理解推荐系统
llm·aigc·ai编程
yumuing16 小时前
AI 用电脑比你还溜?Agent S2 让复杂任务一键搞定
人工智能·gpt·llm
字节跳动视频云技术团队21 小时前
CVPR 2025 | 火山引擎获得NTIRE 视频质量评价挑战赛全球第一
llm·音视频开发
fleur1 天前
小白学习langchain第三弹:youtube视频信息搜索
langchain·llm