LangChain LLM应用完整开发流程
核心链路:需求分析 → 数据准备 → 向量库构建(RAG) → Prompt设计 → Chain/Agent编排 → 接入大模型 → 测试调优 → 部署上线 → 监控迭代
分为普通问答链、RAG知识库、Agent智能代理三种典型场景。
一、整体架构流程
-
需求确定
明确业务:知识库问答 / 工具调用Agent / 文档摘要 / 数据解析 / 多轮对话
确定:大模型(OpenAI/通义千问/LLama/Qwen)、是否需要私有文档、是否需要调用外部工具、是否要记忆会话。
-
数据预处理(RAG场景必做)
-
加载文档:
Document Loaders
支持pdf、md、txt、docx、网页、数据库、csv -
文档分割:
TextSplitter文本 → 分块(chunk) → 每个chunk生成Document对象(page_content+metadata)重点:chunk_size、chunk_overlap,避免切碎语义。
-
清洗:过滤无用字符、空文档。
- 向量化 & 向量数据库构建
- Embedding模型:把文本块转为向量
- 写入向量数据库:Chroma、FAISS、Milvus、PGVector、Weaviate
离线知识库到此完成,后续检索直接用向量库,不需要重复embedding。
- Prompt 模板设计
- System Prompt:角色、规则、约束、回答格式
- Human Prompt:用户输入 + 检索上下文
- 使用
ChatPromptTemplate,不要硬编码字符串。
RAG经典:只使用提供的上下文回答,不知道就说不知道,不要编造
-
检索(Retriever)
向量库 similarity_search:输入用户query,返回top‑N相关文档块。
可增强:重排序Reranker、Self‑query、Multi‑query。
-
Chain 链路编排(LangChain核心)
把:
检索器 + Prompt + LLM + 记忆组装成链。
典型RAG链流程
用户问题
↓
Retriever 检索知识库片段
↓
把检索上下文 + 用户问题灌入Prompt模板
↓
传给LLM生成回答
↓
输出给用户
Agent流程(能调用工具)
用户问题
↓
Agent:思考需要什么工具(搜索、计算器、API)
↓
调用Tool工具得到结果
↓
把工具返回结果再交给LLM
↓
循环直到可以给出最终答案
- 记忆 Memory(多轮对话)
保存历史对话,支持:
- ConversationBufferMemory:完整保存全部历史
- SummaryMemory:对历史做摘要节省token
- WindowMemory:只保留最近N轮
RAG+对话:记忆只存对话历史,不要把全部知识库塞进记忆。
- 调用大模型 LLM / ChatModel
- LLM:文本补全接口(老接口)
- ChatModel:对话接口(推荐,如ChatOpenAI、ChatQwen)
- 测试、评估与调优
- 业务样例测试:看是否幻觉、是否引用错文档
- 可调参数:
- chunk大小、overlap
- retriever返回top‑k数量
- temperature(越低越确定,越高创造性)
- prompt约束、增加reranker重排
- 评估:RAGAS做自动评估(召回率、忠实度、回答相关性)
- 应用封装与部署
- 封装API:FastAPI封装Chain,对外http接口
- 前端对接:Web页面、Chatbot
- 部署:docker容器,向量库独立服务
- 线上监控与迭代
- 记录输入query、llm输出、检索到的文档、token消耗、错误
- badcase收集,迭代prompt、切分策略、知识库更新
二、最简RAG伪代码流程(Python)
python
#1 加载文档
from langchain_community.document_loaders import TextLoader
loader = TextLoader("data.txt")
docs = loader.load()
#2 切分
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
splits = splitter.split_documents(docs)
#3 embedding + 向量库
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={"k":3})
#4 prompt
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system","基于下面上下文回答问题,不知道就如实说不知道:\n{context}"),
("human","{question}")
])
#5 构建RAG链
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(model="gpt‑4o‑mini", temperature=0)
rag_chain = (
{"context": retriever | (lambda docs:"\n".join([d.page_content for d in docs])),
"question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
#6 调用
res = rag_chain.invoke("你的问题")
print(res)
三、开发中常见坑点
- chunk切分不合理:过大语义混杂,过小丢失完整信息
- Prompt没有强约束,LLM产生幻觉编造内容
- retriever召回无关文档,污染上下文 → 增加reranker
- 历史对话无管理,上下文超长token溢出
- Embedding模型和检索模型不匹配
- Agent工具描述写的差,大模型不会选工具
四、LangChain两种开发范式
- Legacy Chain(旧版) :
RetrievalQA.from_chain_type,简单但灵活性差 - LCEL(LangChain Expression Language,新版推荐) :Runnable,管道符号
|,可组合、流式、异步,生产环境首选。
Agent 开发优先使用 LangGraph(LangChain官方状态图框架),替代老版Agent,支持循环、状态、断点,适合复杂业务。
五、LangGraph(复杂Agent)流程补充
当业务需要:多步骤、分支判断、循环调用工具、人工介入、状态持久化,就升级到LangGraph:
- 定义Graph状态State(保存query、中间结果、历史、工具返回)
- 编写节点node:大模型节点、工具调用节点
- 定义条件边(条件路由,判断是否继续调用工具还是输出结果)
- 编译图 → invoke执行