1.简介
langchain的构成其包含langchain-core,langchain-community,langchain,langgraph,langserve,langSmith。
2,构件的详解
LangChain Core
LangChain Core是LangChain框架的核心组成部分,它包含了不同组件的基本抽象以及将它们组合在一起的方法。这个包定义了核心组件的接口,如LLM(大型语言模型)、向量存储、检索器等,并没有定义第三方集成,依赖项被设计得非常轻量级。LangChain Core为LangChain生态系统的其余部分提供了基础的抽象,使得任何提供商都可以实现所需的接口,然后轻松地在LangChain生态系统的其余部分中使用。这种设计使得开发人员不需要理解如何进行模型底层API调用,从而简化了开发过程。
LangChain Core的概念之一是Runnable,这是大多数LangChain Core组件实现的接口,为它们提供了一个通用的调用接口(调用、批处理、流等),并提供了用于重试、回退、模式和运行时可配置性的内置实用程序。使用LangChain表达式语言(LCEL)可以声明式地使用LangChain Core对象,或者通过命令式方式直接调用它们。此外,LangChain Core还允许通过LangServe轻松部署应用程序。
LangChain框架的目标是为各种大型语言模型应用提供通用接口,从而简化应用程序的开发流程。通过LangChain Core,开发人员可以更容易地将大型语言模型的多样形态与向量数据库、灵活多变的交互层、外部世界的广阔知识海洋以及高效的外部代理工具巧妙地编织在一起,构建出独一无二的LLM应用。
langchain-community
LangChain的langchain-community是一个包含由LangChain社区维护的第三方集成的集合。
合作伙伴包(例如 langchain-openai,langchain-anthropic等):一些集成已进一步拆分为自己的轻量级包,仅依赖于langchain-core。
上图中可以看出,大概分为三大类第三方集成包。
模型的输入和输出,model I/O 模型,提示词、示例、输出解释器。
Retrieval(rag相关) ,Retrieval ,文本加载器,向量数据库,文档切分,嵌入模型(将文件切分后进行向量化)
Agent Tooling(工具),比如搜索工具等
langchain
其主要作用是构成应用程序认知架构的链、代理和检索策略。
Chains链路,将提示词、大模型、输出解释器就构成了一个链,在代码中用|进行分隔。
Agents, 通过大模型和第三方工具做成一个agents智体,如Chains就是其中一部分。
langgraph
通过将步骤建模为图中的边和节点,使用LLM构建健壮且有状态的多角色应用程序。
LangGraph 的核心概念
LangGraph 将应用程序的工作流程表示为一个图结构,其中:
节点(Nodes):代表不同的操作或步骤,例如调用一个 LLM、访问一个数据库、处理用户输入等。
边(Edges):代表步骤之间的关系或流程,例如数据流、决策路径等。
这种图形结构允许创建复杂的、有状态的多角色应用程序,每个角色可以独立执行操作,互相通信,并根据前一步骤的结果动态调整。
LangGraph 的主要特点
高级接口:LangGraph 提供了用于创建常见代理的高级接口,使开发者可以快速构建代理应用。
低级 API:允许开发者自定义和组合自己的工作流程,以满足特定需求。
状态管理:支持构建有状态的应用程序,能够在多步骤和多角色之间传递和管理状态。
动态调整:基于前一步骤的结果,可以动态调整工作流程,适应不同的情况和需求。
langserve
将langChain链部署为REST API。
LangSmith
一个开发者平台,可让你调试、测试、评估和监控LLM应用程序,并与LangChain无缝集成。
3,LCEL相关代码
langchain开发表达式(LCEL)
LCEL表达式语言,这块在之前文章里展示过,就是文章中的一个实例,里面就有LCEL。
那么什么是LCEL了,它是一种使用注解轻松的构建链的声明式方法。
- 强大的流支持
- 异步支持
- 优化的并行执行
- 输入和输出样式
- 无缝LangSmith追踪
- 无缝LangServe步骤
例子:
import os
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableParallel,RunnablePassthrough
os.environ["QIANFAN_AK"] = "*****" # 这里需要修改为自己的实际值
os.environ["QIANFAN_SK"] = "****" # 这里需要修改为自己的实际值
#例子1
#提示词
prompt = ChatPromptTemplate.from_template(
"中国有哪些{topic}"
)
#输出介绍解释器
output_parser = StrOutputParser()
#语言模型
model = QianfanChatEndpoint(
streaming=True,
model="ERNIE-Bot",
)
#这里是管道处理
chain = (
{"topic":RunnablePassthrough()}
| prompt
| model
| output_parser
)
chain.invoke("节日")
print(chain)
print(output_parser)
这里用的是千帆语言模型
流式传输例子:
import os
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableParallel,RunnablePassthrough
os.environ["QIANFAN_AK"] = "*****" # 这里需要修改为自己的实际值
os.environ["QIANFAN_SK"] = "****" # 这里需要修改为自己的实际值
prompt = ChatPromptTemplate.from_template(
"请给我讲一个笑话,主题是:{topic}"
)
output_parser = StrOutputParser()
model = QianfanChatEndpoint(
streaming=True,
model="ERNIE-Bot",
)
chain = prompt | model | output_parser
chain.invoke({"topic": "小鸭子"})
print(chain)
迷你RAG例子:
import os
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableParallel,RunnablePassthrough
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
#例子3
def load_embedding_mode():
return HuggingFaceEmbeddings(model_name='text2vec-base-chinese',
model_kwargs={'device': 'cpu'})
vectorstore = FAISS.from_texts(
["张三在华为工作","熊喜欢吃蜂蜜"],
load_embedding_mode(),
)
retriever = vectorstore.as_retriever()
model = QianfanChatEndpoint(
streaming=True,
model="ERNIE-Bot",
)
template = """仅根据以下上下文回答问题:
{context}
问题:{question}
"""
prompt = ChatPromptTemplate.from_template(template)
output_parser = StrOutputParser()
setup_and_retrieval = RunnableParallel(
{"context": retriever, "question": RunnablePassthrough()}
)
chain = setup_and_retrieval | prompt | model | output_parser
chain.invoke("张三在哪里工作?")