LangChain 标准目录结构(主干)
langchain-project/
├── README.md
├── .env
├── .gitignore
├── requirements.txt
│
├── app/ # 应用层(入口与编排)
│ ├── main.py # 主入口
│ ├── settings.py # 配置集中管理
│ └── lifecycle.py # 启动/初始化逻辑
│
├── chains/ # 业务链(Chain / Runnable)
│ ├── __init__.py
│ ├── qa_chain.py
│ ├── summary_chain.py
│ └── agent_chain.py
│
├── prompts/ # Prompt 资产(核心资产)
│ ├── __init__.py
│ ├── system/
│ │ └── qa_system.txt
│ ├── user/
│ │ └── question.txt
│ └── templates.py # PromptTemplate / ChatPromptTemplate
│
├── models/ # 模型封装层
│ ├── __init__.py
│ ├── openai.py
│ ├── anthropic.py
│ └── embeddings.py
│
├── loaders/ # 数据加载
│ ├── __init__.py
│ ├── pdf_loader.py
│ ├── doc_loader.py
│ └── web_loader.py
│
├── vectorstore/ # 向量存储
│ ├── __init__.py
│ ├── faiss_store.py
│ ├── chroma_store.py
│ └── retriever.py
│
├── tools/ # Agent 工具
│ ├── __init__.py
│ ├── search.py
│ ├── calculator.py
│ └── custom_tool.py
│
├── memory/ # 记忆机制
│ ├── __init__.py
│ ├── buffer.py
│ ├── summary.py
│ └── redis_memory.py
│
├── services/ # 领域服务(非 LangChain 逻辑)
│ ├── __init__.py
│ ├── user_service.py
│ └── document_service.py
│
├── api/ # 对外接口(FastAPI / Flask)
│ ├── __init__.py
│ ├── router.py
│ └── schemas.py
│
├── tests/ # 测试
│ ├── test_chains.py
│ ├── test_tools.py
│ └── test_retrieval.py
│
└── scripts/ # 一次性脚本
├── ingest_docs.py
└── rebuild_index.py
每一层为什么存在(不是形式主义)
app/ —— 系统中枢
这里只有「组合」,不写业务逻辑
- 初始化模型
- 装配 chain / agent
- 注入配置、依赖
原则:
app 不思考业务,只拉线
chains/ —— 真正的“智能行为”
这里是 LangChain 的心脏:
prompt | llm | parser
- 一个文件 = 一个稳定能力
- 不掺杂 I/O、不直接读 API
📌 经验法则:
chain 是“能被复用的思考方式”
prompts/ —— 最值钱的资产
Prompt ≠ 字符串 Prompt = 产品逻辑 + 认知约束
为什么单独拆?
- 要版本化
- 要 A/B 测试
- 要被产品经理“调教”
千万不要把 prompt 写死在 chain 里。
models/ —— 模型隔离层
def get_chat_model():
return ChatOpenAI(...)
好处:
- OpenAI → Anthropic 无痛切换
- 多模型策略(便宜 / 高质量)
模型是可替换件,不是业务核心
loaders/ + vectorstore/ —— RAG 的左右手
- loaders:把“世界”读进来
- vectorstore:把“记忆”存下来
你未来换:
- FAISS → Milvus
- Chroma → PGVector
上层代码不用改
tools/ —— Agent 的手和脚
一个 tool = 一种外部能力
- 查数据库
- 调接口
- 算数 / 搜索 / 控制系统
📌 经验之谈:
Tool 要小、要确定、要可失败
memory/ —— 对话的时间维度
- Buffer:短期记忆
- Summary:长期压缩
- Redis:多用户
不要在 chain 里硬编码 memory。
services/ —— 反腐层
这是很多人会忽略的一层。
用途:
- 放业务规则
- 放数据库逻辑
- 放非 AI 判断
不要让 LLM 直接碰业务数据
api/ —— 产品化出口
当你开始:
- 接前端
- 接第三方
- 上生产
这一层是 唯一对外的门。
三个铁律(实话)
Prompt ≠ Chain ≠ Model
混在一起,后期必死。
LangChain 只负责“认知编排”
业务判断放 services。
能测试的,才是工程
Chain 不可测 = 不可维护。
最小可用结构(如果你刚起步)
project/
├── main.py
├── chains/
├── prompts/
├── models/
└── vectorstore/
先活下来,再优雅。
更多精彩内容请关注微信公众号 “学GIS的小宝同学”