小白学习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...

相关推荐
qq_5470261798 小时前
LangChain 输出解析器(OutputParser)
langchain
JaydenAI8 小时前
[RAG在LangChain中的实现]根据数据格式选择文档加载器和文本分割器
python·langchain·ai编程
人工智能小豪9 小时前
LLM的具身鸿沟有解了!微调让大模型真正学会人类的感官与动作感知
人工智能·ai·llm·prompt·embedding·agent·rag
ZzT9 小时前
飞书CLI开源:200+命令让Claude Code直接操控你的飞书
人工智能·llm·claude
java资料站1 天前
LangChain 中文入门教程
langchain
QWsin1 天前
【LangGraph Server】 LangGraph Server是什么?
人工智能·langchain·langgraph·langsmith
米小虾1 天前
从对话到行动:AI Agent 架构演进与工程实践指南
人工智能·langchain·agent
Csvn1 天前
🌟 LangChain 30 天保姆级教程 · Day 4|用 LLMChain 把 Prompt 和 LLM 打包成可复用组件!
langchain
coderlin_1 天前
langchain 基础
microsoft·langchain
哆啦code梦1 天前
一文理解Agent与MCP Server交互
llm·agent·mcp·agent和mcp