news 2026/2/10 5:24:25

【AI进阶】LangChain 实战:手把手带你用 DeepSeek 打造 Text-to-SQL 智能体

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【AI进阶】LangChain 实战:手把手带你用 DeepSeek 打造 Text-to-SQL 智能体

作者:飞哥(一个喜欢讲故事的全栈开发者,擅长把复杂的代码翻译成“人话”)
难度:⭐⭐⭐⭐⭐
关键词:Agent, LangChain, Tool Use, Text-to-SQL, ReAct

大家好,我是飞哥!👋

之前的 RAG 主要是让 AI “”📖(检索文档)。
今天我们要让 AI “”🛠️(使用工具)。

想象一下,你问 AI:“上个月销售额是多少?” 🤔

  • 普通 LLM:“抱歉,我不知道你们公司的销售数据。”(因为它只读过预训练的数据)🤷‍♂️
  • RAG:可能会去搜文档,但如果没有现成的报表文档,它也歇菜。📚
  • Agent (智能体):“好的,我先去数据库查一下sales表… 查到了,上个月销售额是 170 万。”🕵️‍♂️

Agent 的本质,就是大模型 + 工具 (Tools) + 规划 (Planning)。今天我们就来造一个能写 SQL 的 Agent!🤖


📦 准备工作

1. 安装 Python 库

我们需要 LangChain 全家桶:

pipinstalllangchain langchain-openai langchain-community python-dotenv

2. 准备 API Key (.env 文件) 🔑

为了安全起见,我们不要把 Key 直接写在代码里,而是放在一个.env文件中。

  1. 在你的代码目录(和agent_demo.py同级)下,创建一个名为.env的文件。
  2. 在文件中填入你的 API Key:
# DeepSeek API Key DEEPSEEK_API_KEY=sk-your-key-here

注意

  1. LangChain 通常默认读取OPENAI_API_KEY,但我们在代码里显式指定了读取DEEPSEEK_API_KEY,所以请务必使用这个变量名。
  2. 如果你将代码上传到 GitHub,记得把.env加入.gitignore,防止 Key 泄露!

第一步:理解 ReAct 模式 🧠

1. 什么是 ReAct?

不是 React.js 前端框架哦!它是Reasoning (推理) + Acting (行动)

Agent 的思考过程像极了人类解决问题

  1. 思考 (Thought):用户问销售额 -> 我应该去查数据库。🤔
  2. 行动 (Action):调用run_sql_query工具。🏃
  3. 观察 (Observation):工具返回了数字1,700,000。👀
  4. 思考 (Thought):拿到了数据,我可以回答用户了。💡
  5. 回答 (Final Answer):上个月销售额是 170 万。✅

2. 流程图解 📊

为了让大家更直观地理解,我画了一张 Agent 工作的时序图:

🗄️ Database (SQLite)🛠️ Tool (execute_sql)🤖 Agent (大脑)👤 用户🗄️ Database (SQLite)🛠️ Tool (execute_sql)🤖 Agent (大脑)👤 用户🧠 思考 (Thought)🧠 思考 (Thought)🗣️ 提问: "2023年10月卖得最好的产品?"分析意图: 需要查询 sales 表筛选日期并按销量排序🎬 行动 (Action): execute_sql(...)执行 SQL 查询返回结果: [('iPhone 15', 1300000.0)]👀 观察 (Observation): 结果数据分析结果: 拿到数据了,是 iPhone 15💡 最终答案 (Final Answer): iPhone 15...

第二步:避坑指南 —— Agent 开发的 3 个真相 🚧

很多同学跑通了 Demo 就觉得万事大吉,一上生产环境就翻车。飞哥给你透个底:

1. 幻觉问题 (Hallucination) 😵

  • 现象:AI 可能会编造一个不存在的字段名(比如把amount猜成price),导致 SQL 报错。
  • 解法:Prompt 里一定要把 Schema 写得非常清楚!甚至可以加一个check_sql工具,让 AI 先查 Schema 再写 SQL。

2. 权限失控 (Security) 🚨

  • 现象:用户问“帮我删库跑路”,AI 傻乎乎地执行了DROP TABLE
  • 解法只给读权限 (Read-Only)!千万别给 Agent 连 root 账号。工具里最好加一层校验:if "DROP" in sql: return "禁止危险操作"

3. 循环死锁 (Loop) 🔄

  • 现象:AI 觉得自己没查到,反复重试,直到 Token 耗尽。
  • 解法:设置max_iterations=5(最大重试次数),到了次数强制停止。

第三步:代码实战 (Agent Demo) 🧩

为了让大家直接能跑起来,飞哥把创建数据库定义工具运行 Agent的代码合在了一起。而且,我们这次直接加上记忆功能,让它能跟你多轮对话!

创建一个agent_demo.py文件,复制以下代码:

importsqlite3fromlangchain.toolsimporttoolfromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportcreate_react_agent,AgentExecutorfromlangchainimporthubfromlangchain.memoryimportConversationBufferMemoryfromlangchain_core.promptsimportPromptTemplateimportosfromdotenvimportload_dotenv# 加载 .env 文件load_dotenv()# --- 1. 准备环境 (模拟数据库) ---# 为了演示,我们先创建一个本地 SQLite 数据库,并塞点数据进去defsetup_dummy_db():print("🛠️ 正在初始化测试数据库...")conn=sqlite3.connect("company.db")cursor=conn.cursor()# 建表cursor.execute("CREATE TABLE IF NOT EXISTS sales (id INTEGER PRIMARY KEY, amount REAL, date TEXT, product TEXT)")# 塞数据 (如果表是空的)cursor.execute("SELECT count(*) FROM sales")ifcursor.fetchone()[0]==0:data=[(1,500000,"2023-10-01","iPhone 15"),(2,300000,"2023-10-05","MacBook Pro"),(3,100000,"2023-10-10","AirPods"),(4,800000,"2023-10-15","iPhone 15"),]cursor.executemany("INSERT INTO sales VALUES (?, ?, ?, ?)",data)conn.commit()conn.close()print("✅ 数据库准备就绪!表名: sales")setup_dummy_db()# --- 2. 定义工具 (Tools) ---# 这是 Agent 的“手”,用来执行 SQL@tooldefexecute_sql(sql_query:str)->str:""" 当需要查询数据库信息时使用此工具。 输入是一个合法的 SQL 查询语句。 """try:conn=sqlite3.connect("company.db")cursor=conn.cursor()cursor.execute(sql_query)result=cursor.fetchall()conn.close()returnstr(result)exceptExceptionase:returnf"SQL执行出错:{e}"# 告诉 AI 数据库里有哪些表,这也是很重要的 Promptdb_schema=""" 表名: sales 字段: id (int), amount (float), date (text), product (text) """# --- 3. 组装 Agent ---print("🤖 正在初始化 Agent...")# (1) 初始化大模型# 💡 推荐使用 DeepSeek-Coder,写代码逻辑能力极强,且性价比高llm=ChatOpenAI(model="deepseek-coder",temperature=0,base_url="https://api.deepseek.com",api_key=os.getenv("DEEPSEEK_API_KEY"),# 从环境变量读取 DEEPSEEK_API_KEY)# (2) 准备工具列表tools=[execute_sql]# (3) 定义支持对话历史的 Prompt 模板# 注意:我们手动定义模板,以便加入 {chat_history}template="""Answer the following questions as best you can. You have access to the following tools: {tools} Instructions: {instructions} Use the following format: Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [{tool_names}] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question Begin! Previous conversation history: {chat_history} Question: {input} Thought:{agent_scratchpad}"""prompt=PromptTemplate.from_template(template)# (4) 把 Schema 信息注入 Promptinstructions=f""" 数据库结构如下:{db_schema}重要提示: 1. 当你找到答案时,必须以 'Final Answer:' 开头输出最终结果。 2. 不要只输出思考过程,最后一定要有 Final Answer。 """prompt=prompt.partial(instructions=instructions)# (5) 添加记忆功能memory=ConversationBufferMemory(memory_key="chat_history")# (6) 创建 Agentagent=create_react_agent(llm,tools,prompt)# (7) 创建执行器# max_iterations=5: 防止 AI 陷入死循环# handle_parsing_errors=True: 如果 AI 输出格式错了,自动纠正它agent_executor=AgentExecutor(agent=agent,tools=tools,verbose=True,max_iterations=5,handle_parsing_errors=True,memory=memory# 注入记忆)# --- 4. 运行 (多轮对话) ---print("\n💬 进入多轮对话模式。输入 'exit' 或 'quit' 退出。")whileTrue:try:user_input=input("\n🗣️ 用户提问: ")ifnotuser_inputoruser_input.lower()in["exit","quit"]:print("👋 再见!")breakresult=agent_executor.invoke({"input":user_input})print(f"\n💡 最终答案:{result['output']}")exceptEOFError:breakexceptKeyboardInterrupt:break

第四步:运行与观察 👀

在终端运行:

python agent_demo.py

你会看到 Agent 精彩的内心独白 (Verbose Output),而且它能记住你说的话!

Round 1:

🗣️ 用户提问: 帮我查一下 2023年10月 卖得最好的产品是哪个? > Entering new AgentExecutor chain... Thought: 用户想知道 2023年10月 销量最好的产品... Action: execute_sql Action Input: SELECT ... Observation: [('iPhone 15', 1300000.0)] Final Answer: 2023年10月卖得最好的产品是 iPhone 15,销售额为 130 万。

Round 2:

🗣️ 用户提问: 那它的销售额是多少? > Entering new AgentExecutor chain... Thought: 用户问“它”的销售额。根据历史记录,“它”指 iPhone 15。我之前已经查到了,但我可以再确认一下... Final Answer: 它的销售额是 1,300,000.0。

看!它不仅会写 SQL,还能结合上下文理解你的意图!这就是记忆 (Memory)的力量。✨


总结 📚

  1. Agent = LLM + Tools + Logic。🧩
  2. ReAct是最经典的 Agent 思考模式(先想后做)。🧠
  3. Memory让 Agent 拥有了“短期记忆”,能够处理连续的对话。💾

💡飞哥作业
尝试给 Agent 增加一个新的工具,比如send_email(content),让它查完数据后直接把报表发到你的邮箱!

创作不易,记得👇关注飞哥👇 ,点赞、收藏哦~~,下篇见👋

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/3 16:28:35

分布式深度学习训练框架Horovod

Horovod 主要用途:替代方案:核心区别对比表代码示例对比关键区别详解实际应用场景选择简单建议总结:Horovod 是一个分布式深度学习训练框架,主要用于在多个 GPU 或服务器上并行训练深度学习模型。 想象你要训练一个非常大的深度学…

作者头像 李华
网站建设 2026/2/8 20:04:49

维普AIGC检测合格线内,我是这样操作的

维普AIGC检测高?6款工具帮你降到合格线 TL;DR:维普AIGC检测算法和知网不同,很多知网能过的工具在维普可能过不了。实测对维普效果最好的是嘎嘎降AI(67%→9%),其次是比话降AI(60%→12%&#xff0…

作者头像 李华
网站建设 2026/2/5 17:53:13

维普AIGC检测高到离谱?我帮你拆解原因

维普AIGC检测高?6款工具帮你降到合格线 TL;DR:维普AIGC检测算法和知网不同,很多知网能过的工具在维普可能过不了。实测对维普效果最好的是嘎嘎降AI(67%→9%),其次是比话降AI(60%→12%&#xff0…

作者头像 李华
网站建设 2026/2/7 2:16:49

6款降AI工具维普实测,差距比你想的大

维普AIGC检测高?6款工具帮你降到合格线 TL;DR:维普AIGC检测算法和知网不同,很多知网能过的工具在维普可能过不了。实测对维普效果最好的是嘎嘎降AI(67%→9%),其次是比话降AI(60%→12%&#xff0…

作者头像 李华
网站建设 2026/2/5 19:59:03

【计算机毕业设计案例】基于springboot的房产交易服务平台的设计与实现基于Spring Boot的房产销售系统设计与实现(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/2/4 4:49:52

STM32智能大棚浇花花盆

目录 STM32智能大棚浇花花盆概述核心功能硬件组成软件实现应用场景 源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! STM32智能大棚浇花花盆概述 STM32智能大棚浇花花盆是一种基于STM32微控制器的自动化种植系统,通过传感器…

作者头像 李华