数字媒体商店示例数据库 下载数据库 chinook, 包含艺术家、专辑、顾客、订单等表

添加依赖

# 该依赖已归档, 但仍能使用
uv add langchain-community

示例代码

# 02.sql_agent.py
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain_community.agent_toolkits import SQLDatabaseToolkit
from langchain_community.utilities import SQLDatabase

llm = init_chat_model(
    model="deepseek-v4-flash",
    model_provider="deepseek",
    temperature=0,
    extra_body={"think": {"type": "disabled"}},
)

db = SQLDatabase.from_uri("sqlite:///chinook.db")

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

for tool in tools:
    print(f"{tool.name}: {tool.description}")


top_k = 5

system_prompt = f"""
您是旨在与SQL数据库交互的代理。
给定一个输入问题,创建一个语法正确的{db.dialect}查询来运行,
然后查看查询结果并返回答案。 除非用户
指定他们希望获得的特定数量的例子,始终限制你的
最多查询{top_k}个结果。
您可以按相关列对结果进行排序,以返回最有趣的
数据库中的示例。 永远不要查询特定表格中的所有列,
只询问给定问题的相关列。
在执行查询之前,您必须仔细检查您的查询。 如果您在
执行查询,重写查询,然后重试。
请勿对任何DML语句(插入、更新、删除、删除等)
数据库。
首先,你应该始终查看数据库中的表格,看看你
可以查询。 不要跳过这一步。
然后,您应该查询最相关的表格的模式。
"""

agent = create_agent(
    model=llm,
    tools=tools,
    system_prompt=system_prompt,
)

q = "平均而言,哪种类型的曲目最长"

for step in agent.stream(
    input={"messages": [{"role": "user", "content": q}]},
    stream_mode="values",
):
    step["messages"][-1].pretty_print()