使用LangGraph构建的智能职业转换顾问,具备生产就绪的持久内存,由PostgreSQL和vLLM推理提供支持。
该项目演示了一个具有对话记忆的状态化AI代理:
用户查询 → LangGraph代理 → [记忆检查] → vLLM + 工具 → 响应
↓
PostgreSQL检查点器
(持久记忆)
↓
Docker容器
(postgres:16-alpine)
关键特性:
git clone <your-repo-url>
cd langchain-vllm
# 在Docker中启动PostgreSQL
docker-compose up -d
# 验证是否正在运行
docker-compose ps
这会创建一个PostgreSQL 16容器,包含:
langchain_dblangchain5432postgres_datauv pip install -r requirements.txt
或者使用pip:
pip install -r requirements.txt
cp .env.example .env
# 编辑.env文件,添加您的API密钥、RunPod端点和PostgreSQL凭据
所需变量:
FIRECRAWL_API_KEY - 从firecrawl.dev获取RUNPOD_ENDPOINT_URL - 您的RunPod vLLM端点RUNPOD_API_KEY - 您的RunPod API密钥POSTGRES_PASSWORD - 设置为langchain_dev_password(与docker-compose.yml匹配)选项A:使用预构建的Docker镜像(最快):
vrknetha/langchain-vllm-workshop:latest.env选项B:构建自定义镜像:
# 构建vLLM Docker镜像
docker build -f Dockerfile.vllm -t your-dockerhub-username/vllm-hermes:latest .
# 推送到Docker Hub
docker push your-dockerhub-username/vllm-hermes:latest
# 使用自定义镜像在RunPod上部署
详细说明见DEPLOYMENT.md。
开发模式(热重载,内存存储):
langgraph dev --port 2024
# 使用内存存储,对话历史在重启时丢失
生产模式(PostgreSQL持久性):
langgraph up --port 2024
# 自动读取POSTGRES_URI从.env
# 对话历史在重启时保留
替代方式(显式postgres-uri):
langgraph up --port 2024 --postgres-uri "postgresql://langchain:langchain_dev_password@localhost:5432/langchain_db"
两种模式现在都使用PostgreSQL进行持久性。服务器将在以下地址启动:
首次运行时,代理会自动创建PostgreSQL表:
checkpoints - 对话状态快照checkpoint_blobs - 大型二进制数据checkpoint_writes - 检查点写操作本项目展示了一个职业转换顾问——一个引人注目的演示,通过实际应用场景展示了LangGraph v1的记忆和状态管理功能。
职业顾问帮助专业人士导航职业转换:
参见**DEMO_CAREER.md**,其中包含完整的10分钟演示脚本:
第1轮:"我是Sarah,一名拥有5年经验的Python开发者,想要转向AI/ML"
→ 代理:确认背景,开始建立关系
第2轮:"我缺少哪些技能?"
→ 代理:搜索工作要求,分析技能差距,利用Python作为基础
第3轮:"找到这些技能的相关课程"
→ 代理:记住第2轮的具体技能,找到相关学习资源
第4轮:"6个月内我可以瞄准哪些工作?"
→ 代理:综合整个对话上下文,建议现实的目标
线程隔离测试:
→ 新线程:"我的名字是什么?" → "我没有这些信息"
→ 原始线程:"我的名字是什么?" → "你是Sarah,Python开发者..."
对于更简单、通用的研究演示,请参见以下内容。
这是如何展示记忆特性的:
第1轮:设置背景
用户:"我的名字是Alex,我对电动汽车感兴趣"
代理:"很高兴见到你,Alex!我很乐意帮你了解电动汽车..."
第2轮:跟进(使用记忆)
用户:"前三名是什么?"
代理:[搜索电动汽车,记住Alex对电动汽车感兴趣]
第3轮:深入探讨(使用完整上下文)
用户:"哪一款最适合长途旅行?"
代理:[分析之前的搜索结果,考虑Alex的需求,提供建议]
第4轮:新线程测试
用户:[在新线程中]"我的名字是什么?"
代理:"我还没有这些信息..."
[演示线程隔离——每个对话都有独立的记忆]
langgraph up)langgraph devlanggraph up --postgres-uridocker-compose up -d)langgraph updocker-compose up -d)python src/agent.pydocker-compose up -d)查看对话历史:
docker exec -it langchain-postgres psql -U langchain -d langchain_db
# 列出表格
\dt
# 查看检查点
SELECT thread_id, checkpoint_id FROM checkpoints;
# 退出
\q
重置所有对话:
docker-compose down -v # 移除卷
docker-compose up -d # 新鲜数据库
停止PostgreSQL:
docker-compose down # 数据在卷中保留
langchain-vllm/
├── src/
│ └── career_advisor/ # LangGraph代理包
│ ├── __init__.py # 包导出
│ ├── config.py # 配置管理
│ ├── checkpointer.py # PostgreSQL持久性
│ ├── tools.py # MCP工具设置
│ ├── prompts.py # 系统提示
│ ├── nodes.py # 图节点
│ └── agent.py # 图构造
├── docker-compose.yml # PostgreSQL数据库配置
├── langgraph.json # LangGraph CLI配置
├── requirements.txt # Python依赖项(包括PostgreSQL库)
├── .env # 环境变量(API密钥 + 数据库配置)
├── start_vllm.sh # vLLM启动脚本
└── README.md # 此文件
"POSTGRES_PASSWORD环境变量是必需的"
.env.example到.envPOSTGRES_PASSWORD=langchain_dev_password连接被拒绝到localhost:5432
docker-compose up -ddocker-compose psdocker-compose logs -f postgres"关系'checkpoints'不存在"
checkpointer.setup()自动创建记忆未持久?
docker-compose up -d)thread_iddocker exec -it langchain-postgres psql -U langchain -d langchain_db -c "\dt"模型加载慢?
"模型不存在" 404错误
src/agent.py和vLLM服务器中的模型名称是否匹配curl https://your-pod-8000.proxy.runpod.net/v1/modelsFirecrawl搜索错误?
sources参数.env中设置了FIRECRAWL_API_KEYnpx所需)npx -y firecrawl-mcp工具无法工作?
.env中设置了所有必需的环境变量npx所需)服务器无法启动?
uv pip install -r requirements.txtdocker-compose psMIT许可 - 详情见LICENSE文件
欢迎贡献!请打开问题或PR。