1.认识LangChain
AI领域的“Spring”,它是构建GenAI产品的首选框架,足够灵活,功能强大,以AI为中心的一个toolkit。
那么LangChain有什么能力呢?其实官网也说得很清楚:
可以连接内部私有数据:能与自己的数据库连接或从文件中提取信息,并根据这些信息执行具体的操作。比如发送邮件等
互操作和替换性:提供了强大的组件,这些组件可以灵活的组装,也可以替换,比如可以灵活的换一个模型
强大的表达式语言(LangChain Expression Language-LCEL):支持并行、fallbacks、batch、streaming、async等能力
应该说它还是很强大的,那么怎么做到的呢?
2.LangChain Conceptual(相关概念)
LangChain包含了一些packages,主要有:
langchain-core:没有包含任何的第三方组件,有一些核心组件,如LLMs,vectorstores,retrievers等
langchain:包括了chains,agents,retrieval strategies,用于构建一个应用架构
langchain-community:包括第三方集成,由LangChain社区维护
langgraph:对langchain的扩展,构建robust、stateful的multi-actor应用
langserver:将langchain部署为restful api
这里再主要介绍一下核心的LangChain Expression Language(LCEL)
2.1 LangChain Expression Language(LCEL)
这个东西的目的,其实就是将components进行组合,最简单的 “prompt + LLM”,以及复杂一点的甚至可以达到100多个step的组合。
它支持:
流支持(First-class streaming support):可以直接从LLM到streaming output parser进行流输出,这样增量式的处理LLM的输出
异步支持(Async support):可以同步也可以异步调用API,这样可以并发的处理请求
并行执行(Parallel execution):很多steps是可以并行执行的,比如从多个retrievers中检索数据
故障处理(Retries and fallbacks):这是为了让chains更加reliable,在LCEL chain中可以配置retries、fallbacks机制
访问中间结果(Access intermediate results):为了增加可调试的特性,可以对中间的结果进行调试,访问中间的结果
输出和输出模式(Input and output schemas):每个chain可以支持Pydantic、JSONSchema的格式
这里还要介绍一个重要的点,就是Runnable interface。
2.2 Runnable interface
它里面有个所谓的 Runnable protocol,很多的LangChain组件,都实现了这个协议,包括 chat models,LLMs,output parsers,retrievers,prompt templates等等。
这个标准接口包括:
stream:将response作为流返回
invoke:接受某个input,调用chain
batch:接受list of inputs,调用chain
还有一些async methods:
astream/ainvoke/abatch:相应的异步方法
astream_log:输出中间的步骤
astream_events:当发生一些事件,输出
上面其实提到了input、output,每个组件的input、output类型都有点不一样。
这里有一个表格可以看到:
Component | Input Type | Output Type |
---|---|---|
Prompt | Dictionary | PromptValue |
ChatModel | Single string, list of chat messages or a PromptValue | ChatMessage |
LLM | Single string, list of chat messages or a PromptValue | String |
OutputParser | The output of an LLM or ChatModel | Depends on the parser |
Retriever | Single string | List of Documents |
Tool | Single string or dictionary, depending on the tool | Depends on the tool |