AI大模型应用开发入门-LangChain开发聊天机器人ChatBot
在大模型应用开发中,状态管理 和 对话追踪 是不可忽视的重要能力,尤其在需要保存上下文、重放对话或进行异步处理时尤为关键。
今天我们来演示如何用 LangChain + OpenAI 的 GPT 模型 + PostgreSQL 搭建一个 具备消息存储能力 的聊天机器人。
技术栈
LangChain(LangGraph 模块)
OpenAI GPT-4o-mini(或任意兼容模型)
PostgreSQL(用于状态和消息持久化)
Python 3.10+
目标功能
我们将实现如下能力:
构建一个简单但可扩展的对话工作流
用 PostgreSQL 存储多轮对话状态
支持根据 thread_id 恢复上下文
模型自动裁剪历史消息,保证 Token 数不超限
模拟一个“卡通语气”的 AI 角色进行回复
目录结构
.
├── llm_env.py # 初始化大模型
├── chatbot_base_on_postgres_demo.py # 主对话逻辑
初始化 LLM 环境(llm_env.py)
我们用 langchain.chat_models.init_chat_model
来加载 GPT-4o-mini:
from langchain.chat_models import init_chat_model
llm = init_chat_model("gpt-4o-mini", model_provider="openai")
你可以替换为任意你有权限使用的模型,比如 gpt-3.5-turbo
, gpt-4
, claude
, mistral
,甚至本地模型如 Ollama。
第二步:定义对话流程(chatbot_base_on_postgres_demo.py)
导入依赖
from langgraph.graph import START, MessagesState, StateGraph
from langgraph.graph.message import add_messages
from langgraph.checkpoint.postgres import PostgresSaver
from langchain_core.messages import HumanMessage, BaseMessage, trim_messages
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
状态定义与裁剪器(Token 管理)
我们定义对话状态,并用 LangChain 的 trim_messages
限制最大 token 数量,避免模型请求失败:
trimmer = trim_messages(
max_tokens=65,
strategy="last",
token_counter=model,
include_system=True,
allow_partial=False,
start_on="human",
)
Prompt 模板
prompt_template = ChatPromptTemplate.from_messages(
[
("system", "你说话像个卡通人物。尽你所能按照语言{language}回答所有问题。"),
MessagesPlaceholder(variable_name="messages"),
]
)
定义状态结构
class State(TypedDict):
messages: Annotated[list[BaseMessage], add_messages]
language: str
工作流定义
我们用 LangGraph 定义一个非常简单的图:
workflow = StateGraph(state_schema=State)
def call_model(state: State):
trimmed = trimmer.invoke(state["messages"])
prompt = prompt_template.invoke({
"messages": trimmed,
"language": state["language"]
})
response = model.invoke(prompt)
return {"messages": [response]}
workflow.add_edge(START, "call_model")
workflow.add_node("call_model", call_model)
第三步:接入 PostgreSQL 存储状态
DB_URI = "postgresql://postgres:123456@localhost:5432/langchaindemo?sslmode=disable"
with PostgresSaver.from_conn_string(DB_URI) as checkpointer:
checkpointer.setup()
app = workflow.compile(checkpointer=checkpointer)
LangGraph 的 PostgresSaver
会在数据库中为每个 thread_id
维护一份完整的状态记录(状态压缩 + 消息追踪),非常适合审计和调试。
启动聊天循环
input_thread_id = input("输入 thread_id: ")
config = {"configurable": {"thread_id": input_thread_id}}
while True:
query = input("你: ")
if query.strip().lower() == "exit":
break
input_messages = [HumanMessage(query)]
output = app.invoke({"messages": input_messages, "language": "中文"}, config)
for message in output["messages"]:
print(f"{message.type}: {message.content}")
你可以使用同一个 thread_id
多次调用 app.invoke
,来恢复之前的上下文继续对话。
效果展示
输入 thread_id: abc123
你: 今天天气怎么样?
ai: 哇哦,阳光明媚的天气最适合出去玩啦!️
你: 你是谁呀?
ai: 我是你的超级可爱聊天小助手,随时准备出发冒险!
总结
这只是 LangGraph 的一个入门示例,但它的潜力远不止如此。你可以:
添加更多节点(如知识检索、函数调用、代码执行等)
与前端(如 Gradio / Streamlit)结合打造完整应用
利用数据库管理多用户会话历史
AI大模型应用开发入门-LangChain开发聊天机器人ChatBot的更多相关文章
- AI大模型学习了解
# 百度文心 上线时间:2019年3月 官方介绍:https://wenxin.baidu.com/ 发布地点: 参考资料: 2600亿!全球最大中文单体模型鹏城-百度·文心发布 # 华为盘古 上线时 ...
- [嵌入式开发入门]4412开发板从零建立Linux最小系统
本文转自iTOP-4412开发板实战教程书籍 http://www.topeetboard.com iTOP-4412开发板不仅可以运行Android,还可以运行简单的Linux最小文件系统. 最小L ...
- spring boot + vue + element-ui全栈开发入门——windows开发环境
一.node.js开发环境 windows系统,去网站https://nodejs.org/en/download/,下载对应的安装程序,并安装Windows Installer (.msi) 接下 ...
- 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅
摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...
- 【转载】Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门
Servlet Filter(过滤器).Filter是如何实现拦截的.Filter开发入门 Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过F ...
- spring boot + vue + element-ui全栈开发入门——开篇
最近经常看到很多java程序员朋友还在使用Spring 3.x,Spring MVC(struts),JSP.jQuery等这样传统技术.其实,我并不认为这些传统技术不好,而我想表达的是,技术的新旧程 ...
- spring boot + vue + element-ui全栈开发入门——基于Electron桌面应用开发
前言 Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环 ...
- spring boot + vue + element-ui全栈开发入门
今天想弄弄element-ui 然后就在网上找了个例子 感觉还是可以用的 第一步是完成了 果断 拿过来 放到我这里这 下面直接是连接 点进去 就可以用啊 本想着不用vue 直接导入连接 ...
- Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门
Servlet Filter(过滤器).Filter是如何实现拦截的.Filter开发入门 Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过F ...
- 好饭不怕晚,Google基于人工智能AI大语言对话模型Bard测试和API调用(Python3.10)
谷歌(Google)作为开源过著名深度学习框架Tensorflow的超级大厂,是人工智能领域一股不可忽视的中坚力量,旗下新产品Bard已经公布测试了一段时间,毁誉参半,很多人把Google的Bard和 ...
随机推荐
- Docker使用手册--给你通用常用命令
卸载JDK rpm -qa | grep -i java rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps 安装JDK tar -zxvf jdk- ...
- Delphi 增加/获得windows用户帐号
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Bandit Python代码审计漏洞检测工具实战
系统概述 Bandit是一个用于分析Python代码审计安全漏洞的工具,旨在识别常见的安全问题,如硬编码密码.不安全的函数调用.SQL注入等.它通过构建抽象语法树(AST)并对节点运行适当的插件来检测 ...
- 【JDBC第7章】DAO及相关实现类
第7章:DAO及相关实现类 DAO:Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create.Retrival.Update.Delete),而不包含任何业务相 ...
- 离线版nrfutil工具安装方法
简介 nrfutil是Nordic提供的命令行工具集.支持以下功能: 基于Jlink的固件烧录.读取.flash擦除.recover 基于MCUBOOT的固件升级(DFU) 基于nRF5 bootlo ...
- Dify开发必备:分享8个官方文档不曾解释的关键技巧
Dify 是一个帮助你快速搭建 AI 应用的工具,其定位类似Coze.但相比Coze--Dify是免费的.开源的,人人都可以用.哪怕你不懂编程,也能用它参与到 AI 应用的设计和使用中.总之,如果你是 ...
- java中使用BigDecimal解决小数计算问题
1.示例 @Test public void test() { System.out.println(0.3 + 0.1); System.out.println(0.3 - 0.1); System ...
- 为什么 Java 的垃圾收集器将堆分为老年代和新生代?
为什么 Java 的垃圾收集器将堆分为老年代和新生代? Java 垃圾收集器通过将堆内存划分为 新生代 和 老年代,优化了内存管理,提高了垃圾回收的效率.这种分代思想是基于 对象生命周期的特点. 1. ...
- app自动化设计
一.在pom.xml引入依赖 testng:测试框架用例管理 appium:需要用到appium log4j:日志集成 allure:生成报告 二.po分层 分为基础层,page层,用例层,xml文件 ...
- 🚀 放弃 Oh-My-Posh,转而手搓 FastPrompt,打造快速高效的命令提示
「够用.够快.够自由」才是我心目中的终端提示符. 一个开发者的烦恼 每天打开 PowerShell,等待提示符加载完毕,我的内心就像在等待一个磨蹭的同事. 我用的是 Windows Terminal ...