【Ollama+langchain+mysql】langchain调用本地部署的ollama大模型,连接mysql进行查询

本文章省去ollama以及mysql本地部署的步骤

导言

在实际使用中,发现本代码存在一些生成SQL语句但是不执行的问题。这可以根据以下思路来解决:

  1. Prompt Engineering 通过控制整个交互流程的prompt,实现sql语句的自动执行

  2. Agent + Chain 的方式,手动控制每一个chain,来完成指定sql的运行

代码

from langchain.utilities import SQLDatabase
from langchain_ollama import ChatOllama
from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.agents.agent_types import AgentType

# 配置数据库连接信息
db_user = ""
db_password = ""
db_host = ""
db_name = ""

# 创建数据库连接
db = SQLDatabase.from_uri(f"mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}")

# 创建工具包
toolkit = SQLDatabaseToolkit(db=db, llm=ChatOllama(model="qwen2.5:14b"))

# 创建SQL代理,设置为处理自然语言查询
agent_executor = create_sql_agent(
    llm=ChatOllama(model="qwen2.5:14b"),
    toolkit=toolkit,
    verbose=True,
    handle_parsing_errors=True,
    agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)

# 开始问答循环
while True:
    # 用户输入查询
    query = input("请输入您的查询(输入'exit'退出):")

    # 检查退出条件
    if query.lower() == 'exit':
        print("谢谢使用,再见!")
        break

    try:
        # 让代理生成SQL查询
        sql_query = agent_executor.run(f"生成SQL查询以{query},但不要执行它")

        # 提取SQL语句(假设输出格式为 ```sql ... ```)
        if '```sql' in sql_query:
            start = sql_query.find('```sql') + len('```sql')
            end = sql_query.find('```', start)
            sql_statement = sql_query[start:end].strip()

            # 直接执行提取的SQL查询
            result = db.run(sql_statement)
            print("查询结果:", result)
        else:
            print("未能从LLM输出中提取有效的SQL语句。")
    except Exception as e:
        print(f"发生错误: {e}")
        if 'Could not parse LLM output' in str(e):
            print("提示:模型输出无法解析,请尝试更明确的查询语句。")

运行效果

提问:
在这里插入图片描述
回答:
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐