LangChain生态介绍与实战
概述
作为连接LLMs与实际应用场景的桥梁,极大简化复杂应用的开发流程,使得开发者能够快速构建从简单的聊天机器人到复杂的知识问答系统等各类智能应用。
核心优势与特性
- 智能链式处理:基于链的创新理念,实现模型调用的优雅串联;支持灵活的多级处理流程,如信息提取、分析和生成的无缝衔接;通过模块化设计,确保处理流程的可维护性和扩展性
- 无缝数据集成能力:提供丰富的数据源连接器,支持实时对接数据库、文档和各类API;实现数据的动态获取和更新,确保LLM始终基于最新信息进行决策;支持结构化和非结构化数据的统一处理
- 智能记忆管理:先进的上下文管理机制,实现对话的连贯性和上下文理解;灵活的记忆策略,支持短期和长期记忆的动态调节;智能的状态追踪,确保多轮对话的准确性
- 强大的工具生态:内置丰富的工具集成接口,支持计算器、搜索引擎等外部功能;插件化架构设计,便于开发者扩展自定义功能;支持工具的动态调用和组合使用
- 广泛的模型兼容性:灵活的适配机制,便于接入新型语言模型
应用场景
- 智能对话系统:构建具有深度理解能力的对话助手、支持多轮对话推理和上下文管理、实现个性化的用户交互体验
- 知识问答系统:打造基于专业知识库的智能问答平台、支持多源数据的融合查询、实现精准的答案定位和解析
- 智能工作流自动化:自动化文档处理和数据分析、智能报告生成和内容总结、多语言翻译和本地化处理
- 创意内容生成:智能文案创作和内容优化、代码生成和技术文档编写、创意设计方案生成
核心架构组件
- Prompt Templates:提示模板
- 专业的提示工程设计工具
- 支持动态参数注入和模板复用
- 优化模型输入以提升响应质量
- Chains:处理链
- 灵活的任务流程编排工具
- 支持条件分支和并行处理
- 确保处理流程的可控性和可追踪性
- Memory:记忆系统
- 智能的上下文状态管理
- 支持多种记忆策略的动态切换
- 确保对话的连贯性和准确性
- Agents:智能代理,智能体
- 自主决策的智能处理单元
- 动态规划任务执行路径
- 优化资源调用效率
- Data Loaders:数据加载器
- 统一的数据接入标准
- 支持多种格式数据的智能解析
- 确保数据处理的可靠性和效率
注:LangFlow并不属于LangChain生态。
概念
- Models
- LLMs:提供理解和生成文本的能力,是LangChain的核心;
- Chat Models:专门用于对话场景,使得模型能够进行流畅的对话;
- Text Embedding Models:将文本转换为向量,用于理解和比较文本内容。
- Prompt:提示词
- Prompt Templates:提示模板,定义如何指导模型生成特定的输出。它们是预定义的文本模板,可插入变量来定制化输入。
- Indexes(索引)
- Document Loaders:用于将不同格式的文档加载到系统中;
- Text Splitters:将长文本分割成更小的片段,以便模型处理;
- Vector Stores:存储文本的向量表示,便于快速检索;
- Retrievers:在向量存储中检索相关信息,用于提供上下文或回答问题。
- Memory:为链和代理提供记忆能力
- Chat Message History:保持对话的连贯性,使得模型能够参考之前的交互。
- Chain:一系列操作,可以是模型调用、提示、索引操作等,用于完成特定任务;
- LLM Chain:最简单的链,直接与LLM交互;
- Index-related Chains:结合索引操作的链,用于信息检索和上下文增强。
- Tools:接入外部工具
- Retrievers $ Vector Stores:检索器与向量数据库,支持从外部知识库中检索相关信息,常用于 RAG场景,兼容多种向量数据库(如FAISS、Milvus、Weaviate等)
- Agent:代理,智能实体,能够根据输入和上下文选择并执行一系列操作(工具)来完成任务。
- AgentExecutor:负责运行Agent,直到满足停止条件。
- Callback:用于获取语言模型操作后的延迟反馈。
- OutputParsers:输出解析器,用于结构化LLM的原始输出(如JSON、XML、固定格式文本),便于后续程序处理
LCEL
LangChain Expression Language,LangChain表达式语言,核心组件,旨在提供一种简洁、灵活的方式来定义和操作语言模型的工作流。允许开发者以声明式的方式构建复杂的语言模型应用,而无需编写大量的样板代码。
一种强大的工作流编排工具,可从基本组件构建复杂任务链条,并支持诸如流式处理、并行处理和日志记录等开箱即用的功能。
优势:
- 异步、批处理和流支持:采用LCEL构建的任何链都将自动、完全的支持同步、异步、批处理和流等能力;
- Fallbacks:由于LLMs的非确定性,使得具备优雅地处理错误的能力变得很重要;
- 并行性:由于LLMs应用涉及(有时长期的)API调用,因此支持并行处理很重要;
- 无缝集成LangSmith:所有步骤都会自动记录到LangSmith中,可最大程度实现可观测性和可调试性。
特点:
- 声明式语法
旨在通过一种直观的方式定义和组合不同类型的组件链。其核心目标是简化复杂应用程序的开发过程,使开发者能够专注于逻辑而非底层实现细节。 - 统一接口设计理念
为了支持灵活的组件组合,LCEL提供统一接口设计方案,允许所有组件共享相同的调用模式,无论是代理、工具还是数据源,均可以通过一致的方法进行交互。显著降低学习成本,提高系统的可扩展性和易维护性。
工作流程
- 输入解析阶段:输入被传递到LCEL解析器中,后者会依据预设的语言规则对其进行分析。涉及的关键技术包括语言解析和模式匹配,这些机制共同作用以识别输入中的语义结构。
- 组件映射阶段:完成输入解析后,系统将根据解析结果动态生成对应的LangChain组件实例。这一环节依赖于预先配置好的映射表,其中记录每种实体类型与其对应的具体实现之间的关系。
- 执行调度阶段:所有必要的组件准备就绪之后,进入实际的工作流执行阶段。在此期间,各模块按照既定顺序依次激活并完成各自的任务处理。得益于前面提到的统一接口特性,即使面对复杂的多层嵌套场景也能保持清晰流畅的操作体验。
- 输出转换阶段:当整个链条上的活动全部结束时,最终产生的结果会被送入指定的OutputParser中进一步加工。例如,在某些情况下可能需要提取最有可能的结果作为返回值;此时可以利用像StrOutputParser这样的专用类来达成目的,它负责把原始形式的数据转化为更加简洁实用的文字表述。
LangServe
LangChain子项目,GitHub,专注于简化LangChain组件(如Runnables和Chains)的部署流程。其核心目标是让开发者能够以最小的努力将这些组件暴露为REST API或其他可远程调用的形式。
功能
- REST API自动化生成:用户无需手动编写复杂的API接口逻辑,可自动生成基于FastAPI的RESTful接口。LangChain的Runnable或Chain都能被轻松地转化为HTTP请求/响应的服务端点;
- 高效集成能力:不仅限于Python生态,提供JS客户端库,允许前端开发人员通过简单的代码调用已部署的服务,极大地增强系统的灵活性和适用范围;
- 轻量级配置选项:用户只需定义好LangChain对象并将其传递给LangServe实例即可启动服务;
- 扩展性和定制性:如果默认的行为无法满足需求,还可以进一步调整参数或者引入中间件来增强安全性、性能监控等功能。
特点
- 高效并发处理:提供
/invoke、/batch和/stream端点,支持高并发请求处理; - 流事件处理:新增
/stream_events端点,简化流事件处理。 - 内置LangSmith Tracing:支持LangSmith追踪功能,只需添加API密钥即可启用。
安装
pip install --upgrade "langserve[all]"
# 客户端
pip install "langserve[client]"
# 服务器
pip install "langserve[server]"
实例
服务端:
from fastapi importFastAPI
from fastapi.middleware.cors import CORSMiddleware
from langchain_openai import ChatOpenAI
from langserve import add_routes
from langchain.prompts import ChatPromptTemplate
import osos.environ["DASHSCOPE_API_KEY"] = "xxx"
app = FastAPI(openapi_url="/api/v1/openapi.json",title="LangChain服务器",version="1.0",description="使用Langchain的Runnable接口的简单API服务器",
)
add_routes(app,ChatOpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",model="qwen-plus"),path="/openai",
)
# 设置所有启用CORS的来源
app.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"],expose_headers=["*"],
)
if__name__ == "__main__":import uvicornuvicorn.run(app, host="localhost", port=8000)
客户端:
from langchain.schema.runnable import RunnableMap
from langchain_core.prompts import ChatPromptTemplate
from langserve import RemoteRunnableopenai = RemoteRunnable("http://localhost:8000/openai/")
prompt = ChatPromptTemplate.from_messages([("system", "你是一个喜欢故事创作的助手"), ("user", "写个故事,主题是: {topic}")])
# 自定义链
chain = prompt|RunnableMap({"openai": openai})
print("同步调用/openai/invoke结果")
response = chain.invoke([{"topic": "一千零一夜"}])
print(response)
LangChain CLI
用于简化基于大型语言模型的应用程序开发过程:
# 创建新应用
langchain app new langchainserve
LangChain Hub
官网,是一个用于上传、浏览、拉取和管理提示词的地方。
LangChain Hub集成在LangSmith中,未登录LangSmith用户,仅限读取权限,可查看、下载和运行提示词;有LangSmith访问权限,拥有完全的读写权限。可通过登录并从管理面板导航到Hub,探索所有现有提示并上传个人提示词。

右侧的搜索筛选条件包括标签(如RAG、Chatbots)、类型(三种,ChatPromptTemplate、StringPromptTemplate、StructuredPrompt)和语言:

功能:
- 编辑提示语及提示语版本
- 类似Playground的提示语运行环境
- 在应用中加载提示语
- 与他人共享提示语
安装:pip install langchainhub
提示词使用(下载、上传等)三种方式:
- 使用
langchain:
from langchain import hub
prompt = hub.pull("hwchase17/eli5-solar-system")
print(prompt)
- 使用
langsmith:
from langsmith import Client
client = Client(api_key=LANGSMITH_API_KEY)
# 加载特定版本提示语:hub.pull("yakult/quickstart:c53fcc9d")
prompt = client.pull_prompt("hardkothari/prompt-maker", include_model=True)
- 使用
langchainhub(已废弃,不建议使用):
from langchainhub import Client
client = Client(api_key=LANGSMITH_API_KEY)
prompt = client.pull("rlm/rag-prompt")
print(prompt)

LangChain Community
GitHub,由三方社区维护,后由LangChain官方维护;很多包或模块若用户使用频次较高或其他情况,会变成独立的pip包,如langchain_openai、langchain_chroma等。
安装:pip install langchain-community。
在使用API前,最好先看一下源码,是否有被标记为@deprecated:

示例(已被标记为废弃的langchain_community库里的ChatOpenAI类,正好可以和langchain_openai库里的ChatOpenAI用法对比一下,几乎没有什么区别):
from langchain_community.chat_models import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser# Ensure you have your OpenAI API key set as an environment variable (OPENAI_API_KEY)
llm = ChatOpenAI(model="gpt-4")
prompt = ChatPromptTemplate.from_messages([("system", "You are a helpful AI assistant."),("user", "{question}")
])
chain = prompt | llm | StrOutputParser()
resp = chain.invoke({"question": "中国的首都是?"})
print(resp)
LangSmith
可用于调试、测试、评估和监控基于任何LLM框架构建的链。
开源(GitHub,639 Star,150 Fork),官方文档,官网。
LangChain提供的AI应用开发监测平台,可用于观察调用链运行情况。功能:
- 记录运行日志
- 提示词版本管理
- 数据集评估
入门
登录后侧边栏如下

新增Prompt

LangGraph平台:一键部署LangGraph应用,仅限付费用户。

设置

可新增组织

新增API Key
实战
安装:pip install langsmith
提供Python和JS SDK接入:
# Create a LANGSMITH_API_KEY in Settings > API Keys
from langsmith import Client
client = Client(api_key=LANGSMITH_API_KEY)
# 加载特定版本的提示语:hub.pull("yakult/quickstart:c53fcc9d")
prompt = client.pull_prompt("hardkothari/prompt-maker", include_model=True)
LangMem
参考Agent记忆框架(三)。
LangGraph
有待单独另起一篇。
集成
OpenAI、FastAPI
安装:pip install langchain_openai fastapi。
上面的实例已展示过集成OpenAI、FastAPI。
Chroma
Chroma是轻量化,适合小规模应用和学习使用的向量数据库,参考向量数据库概述。
安装:pip install langchain_chroma。
一个最小RAG系统示例:
from langchain_core.documents import Document
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitterdef get_text_docs():docs = [Document(page_content="我的名字叫张三",metadata={"source": "name-doc"},)]return docsdef get_pdf_docs(file_path = "test.pdf"):loader = PyPDFLoader(file_path)docs = loader.load()print(f"{docs[0].page_content[:200]}\n") # 页面字符串内容print(docs[0].metadata) # 包含文件名和页码的元数据return docsdocs = get_text_docs()
# 分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200, add_start_index=True
)
all_splits = text_splitter.split_documents(docs)
# 向量嵌入和存储
vectorstore = Chroma.from_documents(all_splits,embedding=OpenAIEmbeddings(model="text-embedding-3-large"),
)
# 检索器
retriever = RunnableLambda(vectorstore.similarity_search).bind(k=1)
llm = ChatOpenAI(model="gpt-4o-mini")
message = """Answer this question using the provided context only.{question}Context:{context}
"""
prompt = ChatPromptTemplate.from_messages([("human", message)])
# 模型链
rag_chain = {"context": retriever, "question": RunnablePassthrough()} | prompt | llm
response = rag_chain.invoke("我是谁?")
print(response.content)
解读:RunnablePassthrough() :直接传递输入,将输入值原封不动地传递给下一个组件,不做任何修改,具体作用:当调用rag_chain.invoke("我是谁?")时,{"context": retriever}会通过检索器获取相关文档,{"question": RunnablePassthrough()}会将原始问题直接传递下去,提示词模板就能同时获得检索到的上下文和原始问题。
HuggingFace
安装:pip install langchain_huggingface transformers。
示例:
# 导入必要的库:transformers用于模型操作,langchain用于构建对话链,torch用于GPU计算
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
from langchain_huggingface import HuggingFacePipeline
import torchmodel_path = ""
# 加载分词器,trust_remote_code允许执行模型作者提供的自定义代码
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
# 加载预训练模型,未指定torch_dtype和device_map,将默认使用CPU或FP32精度
model = AutoModelForCausalLM.from_pretrained(model_path)
# 创建文本生成管道,设置最大生成长度为512个token
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=512)
# 将transformers管道封装为LangChain可用的大语言模型接口
llm = HuggingFacePipeline(pipeline=pipe)
ai_msg = llm.invoke("简单介绍一下大语言模型")
print(ai_msg)
ModelScope
有两种方式:
- 安装:
pip install modelscope - 安装:
pip install langchain_modelscope
示例:
from langchain_modelscope import ModelScopeChatEndpoint, ModelScopeEmbeddings, ModelScopeLLMllm = ModelScopeChatEndpoint(model="Qwen/Qwen2.5-Coder-32B-Instruct")
llm.invoke("你是谁")llm = ModelScopeLLM(model="Qwen/Qwen2.5-Coder-32B-Instruct")
llm.invoke("生命的意义")embeddings = ModelScopeEmbeddings(model_id="iic/nlp_corom_sentence-embedding_english-base")
embeddings.embed_query("宇宙的终点在哪里")
