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

相关推荐
前端精髓8 小时前
结构化输出with_structured_output(抽卡)
python·langchain
Eloudy8 小时前
sgl-kernel 项目的演进:不同时间点的角色与去向
llm·sglang
zhangfeng113310 小时前
6篇RAG核心论文的工程启示:Vector + Graph + Agent路由混合架构实战
人工智能·架构·llm·agent
LMT流氓兔12 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
小许学java12 小时前
AI通识与基础
人工智能·langchain
kyrie_sakura14 小时前
大模型学习20 大模型学习 - LangChain3 - Agents
人工智能·学习·langchain
小易老师AI实战20 小时前
LangChain Deep Agents:新一代增强型通用智能体框架
langchain·大模型开发·deepagents·ai 智能体·agent 开发
沛东的认知和实践20 小时前
当 RAG 开始“要求找全”:一次 Agentic RAG 边界探索与 LLM Wiki 转向
llm·agent
郝学胜-神的一滴21 小时前
AI 编程智能体 20:技术栈选型与架构落地全攻略
人工智能·python·架构·langchain·1024程序员节·智能体
Eloudy1 天前
《Attention Is All You Need》的 Encoder–Decoder Transformer 一次完整训练
llm·transformer