langchain、langchain-core 和 langchain-community如何协作?
特性langchain内容接口、抽象基类、基础协议官方、高质量的集成和组件社区贡献、第三方集成稳定性高(变更会破坏所有其他包)高中/低(可能频繁变动)依赖关系无依赖(或极少依赖)依赖依赖,可选依赖langchain用户使用频率较少直接导入高(主要导入来源)按需导入(用于特定工具)给开发者的建议:大多数情况下,你只需要安装和导入langchain中的组件(例如现在趋向于它会帮你处理好一切。当你需要一
langchain
、langchain-core
和 langchain-community
是 LangChain 项目为了更清晰的组织架构和依赖管理而拆分出的三个主要包。它们之间的协作关系可以用一个清晰的模型来理解。
核心概念比喻
你可以把它们想象成一个公司的结构:
-
langchain-core
:基础架构部-
职责:定义公司的核心规章制度、通用接口(Interface)和基础工具。所有部门都必须遵守这些规则。
-
具体来说:它包含了最核心的抽象基类(ABCs),如
BaseChatModel
,BaseRetriever
,BaseTool
,Runnable interface
等。这些规定了“一个LLM应该有什么方法”、“一个检索器应该如何定义”,但不提供具体实现。
-
-
langchain
:核心产品与集成部-
职责:使用
core
定义的规则,开发和维护官方支持的、高质量的核心组件和第三方集成(Integrations)。 -
具体来说:它包含了基于
core
接口的具体实现,比如OpenAI、Anthropic的LLM封装,Chroma、Pinecone的向量存储检索器,以及各种链(Chains)、代理(Agents)的逻辑。这里的集成是经过LangChain团队精心维护和测试的。
-
-
langchain-community
:社区与第三方生态部-
职责:容纳大量由社区贡献的、或来自第三方服务的集成和工具。这里的组件更多样化,但可能不如核心包里的那么稳定或及时更新。
-
具体来说:它包含了无数个第三方模型的集成、不那么流行的向量数据库工具、各种小众的API工具等。它的存在是为了保持
langchain
核心包的轻量和稳定,同时又能拥抱庞大的社区生态。
-
三者如何协作
它们之间的依赖和协作关系如下图所示:
-
langchain-core
是基石:-
langchain
和langchain-community
都依赖于langchain-core
。 -
这意味着,无论你安装
langchain
还是langchain-community
,你都会自动安装langchain-core
。 -
langchain
和langchain-community
中的任何组件,只要是LLM、检索器、工具等,都必须实现langchain-core
中定义的对应接口。
-
-
langchain
是官方标准:-
它直接依赖
langchain-core
,并提供主要实现。 -
它通常不依赖
langchain-community
,以保证自身的简洁和稳定。 -
当你
import langchain.llms import OpenAI
时,你使用的是核心包里的官方实现。
-
-
langchain-community
是生态扩展:-
它同样依赖
langchain-core
(因为它要实现那些接口)。 -
它内部的很多组件在运行时可能需要
langchain
中的一些辅助工具或工具类,因此它对langchain
是可选依赖(optional dependency)。这意味着,如果你想使用langchain-community
里的某个特定工具,你可能需要额外安装对应的依赖(如langchain
本身或其他包)。
-
实际应用中的导入示例
假设你想使用 OpenAI 的模型,你有两种方式,这体现了包的分层:
1. 使用官方维护的核心包实现(推荐)
# 从核心包 langchain 中导入
from langchain_openai import ChatOpenAI # 这是最新的命名,旧版是 from langchain.chat_models import ChatOpenAI
from langchain_core.messages import HumanMessage
llm = ChatOpenAI(model_name="gpt-4")
message = [HumanMessage(content="Hello")]
response = llm.invoke(message)
-
这里
ChatOpenAI
是langchain
核心包提供的,它实现了langchain_core.language_models.BaseChatModel
这个接口。
2. 使用社区包中的实现(通常不需要,除非核心包没有)
# 从社区包 langchain_community 中导入(理论上存在,但通常不会这么做)
# from langchain_community.llms import OpenAI # 这是一个旧版示例,现在官方推荐用上面的方式
# 更常见的例子是使用一个非常小众的模型
# from langchain_community.llms import Petals
-
对于OpenAI这种主流服务,你绝对应该使用
langchain
中的版本。社区包通常用于存放那些还未被核心包收录或不够主流的小众集成。
总结与建议
特性 | langchain-core |
langchain |
langchain-community |
---|---|---|---|
内容 | 接口、抽象基类、基础协议 | 官方、高质量的集成和组件 | 社区贡献、第三方集成 |
稳定性 | 高(变更会破坏所有其他包) | 高 | 中/低(可能频繁变动) |
依赖关系 | 无依赖(或极少依赖) | 依赖 langchain-core |
依赖 langchain-core ,可选依赖 langchain |
用户使用频率 | 较少直接导入 | 高(主要导入来源) | 按需导入(用于特定工具) |
给开发者的建议:
-
大多数情况下,你只需要安装和导入
langchain
中的组件(例如from langchain_community.chat_models import ChatOpenAI
现在趋向于from langchain_openai import ChatOpenAI
)。它会帮你处理好一切。 -
当你需要一个非常小众的、核心包没有的工具体(比如一个特殊的PDF解析器或一个冷门模型的API),才去
langchain-community
里寻找。 -
当你需要自定义一个组件(例如自己实现一个检索器)时,你需要从
langchain-core
导入对应的抽象基类并继承它,以确保你的自定义组件可以和整个LangChain生态系统无缝协作。
更多推荐
所有评论(0)