目标:理解新版 LangChain 的架构组成
内容框架:
-
层级关系:core(抽象层) → model(模型连接层) → community(集成层) → langchain(组合层)
-
LangChain 四层架构解析:
-
langchain_core- 功能:核心抽象层,包含 Runnable、Prompt、OutputParser 等基础组件
- 核心模块:[‘VERSION’, ‘caches’, ‘callbacks’, ‘documents’, ‘embeddings’]
-
langchain_openai- 功能:模型连接层,专为 OpenAI 模型提供集成支持
-
langchain_community- 功能:社区集成层,整合第三方工具、向量库和文档加载器
-
langchain- 功能:应用组合层,提供高级链、Agent 和 LangGraph 等功能
-
架构示意图:
┌─────────────────────────────────────────┐
│ langchain (应用层) │ ← 高级组合
│ Chains, Agents, LangGraph workflows │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ langchain-community (集成层) │ ← 第三方集成
│ VectorStores, Tools, DocumentLoaders │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ langchain-openai (模型层) │ ← 模型提供商
│ ChatOpenAI, OpenAIEmbeddings │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ langchain-core (抽象层) │ ← 核心抽象
│ Runnable, Prompt, OutputParser │
└─────────────────────────────────────────┘
Runnable 核心机制详解
-
Runnable统一接口- 功能:为所有组件提供标准化调用方式,实现类乐高积木的模块化设计
- 主要方法:
invoke(input):单次输入输出batch(inputs):批量处理stream(input):流式处理- 异步版本:
ainvoke(),abatch(),astream() with_retry:自动重试机制
-
LCEL 编排语言
- 语法:使用管道符
|连接 Runnable 组件 - 基础示例:
提示词 | 模型 | 输出解析器
from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser # 组件定义 prompt = ChatPromptTemplate.from_template("讲一个关于{topic}的笑话") model = ChatOpenAI(model="gpt-3.5-turbo") output_parser = StrOutputParser() # 链式组合 chain = prompt | model | output_parser # 执行调用 result = chain.invoke({"topic": "冰淇淋"}) print(result)数据流向:
{"topic": "冰淇淋"}→prompt→model→output_parser→ 最终输出 - 语法:使用管道符
-
任务拆分机制
- 功能:支持 Agent 将复杂任务分解为子任务
- 示例工具函数:
def get_weather(city: str) -> str: """获取城市天气信息""" return f"今天{city}的天气晴朗。"
最小实现示例
import os
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableBranch
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
# 工具函数
def generate_joke(topic: str) -> str:
joke_prompt = ChatPromptTemplate.from_template("讲一个关于{topic}的笑话。")
joke_chain = joke_prompt | model | output_parser
return joke_chain.invoke({"topic": topic})
# 初始化配置
load_dotenv(override=True)
model = ChatOpenAI(
model="qwen3-max",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("DASHSCOPE_BASE_URL"),
max_tokens=1000,
temperature=0.8,
streaming=True
)
output_parser = StrOutputParser()
# 分支处理链
poem_prompt = ChatPromptTemplate.from_template("写一首关于{topic}的短诗。")
poem_chain = poem_prompt | model | output_parser
branch = RunnableBranch(
(lambda x: "冰淇淋" in x["topic"], lambda x: generate_joke(x["topic"])),
poem_chain
)
# 执行示例
print(branch.invoke({"topic": "月亮"})) # 输出诗歌
print(branch.invoke({"topic": "冰淇淋"})) # 输出笑话
基础检查脚本
import langchain_core
import langchain_openai
import langchain_community
import langchain
for pkg in [langchain_core, langchain_openai, langchain_community, langchain]:
print(pkg.__name__, dir(pkg))
为什么 LangChain 1.0+ 采用模块化设计?
LangChain 1.0+ 版本采用了模块化设计,主要旨在提升框架的清晰度、可维护性和灵活性,同时确保向后兼容性并聚焦于核心功能,这一设计转变源于对早期版本的反思,其中包结构较为庞大,导致开发者在构建代理(agent)系统时面临不必要的复杂性。通过模块化,LangChain 将核心抽象分离出来,并将遗留功能迁移到专用包中,从而为开发者提供更精炼的构建块

877

被折叠的 条评论
为什么被折叠?



