大语言模型 (LLMs) 展现出巨大的潜力,但要利用它们构建强大的应用程序,往往需要复杂的编排、与外部数据的集成以及对会话上下文的管理。LangChain 正是一个旨在简化这一过程的开源编排框架。它提供了 Python 和 JavaScript 两个版本,提供了连接 LLM 与外部数据、管理多步骤流程并增强其功能(将它们转化为智能、具有上下文感知能力的代理)的组件和 API。本文将带您深入了解 LangChain 的核心概念、架构、关键组件以及入门方法,助力您快速掌握利用 LangChain 和 大模型 构建智能应用的技能。
LangChain 的核心概念与架构:构建大模型应用的基石
LangChain 是一个用于开发基于 大模型 的应用的开源编排框架,它为与各种 LLM 交互提供了一个通用的接口,提供了一个集中的环境,用于构建 LLM 应用并将它们与外部数据和软件工作流程集成。它的主要目标是简化由 LLM 驱动的应用程序的创建,例如聊天机器人和 AI 代理。其模块化的设计是其核心优势之一,它将复杂的应用逻辑分解为可重用的组件,从而简化了开发过程,提高了代码的可维护性和可扩展性。
模块化设计:构建块
LangChain 的架构是高度模块化的,基于可重用的组件构建:
- 组件 (Components): 用于特定任务的基本、可重用块,如数据处理、文本生成或外部访问。例如,可以使用一个组件来处理用户输入,另一个组件来调用 LLM,还有一个组件来解析 LLM 的输出。
- 模块 (Modules): 组合多个组件以实现更复杂的功能,例如内存管理或代理编排。例如,一个内存管理模块可以维护对话历史,以便 LLM 可以理解上下文。
- 链 (Chains): 连接组件或模块的序列,以实现特定目标,定义 LLM 应用程序的执行流程。例如,一个链可以包含一个提示模板、一个 LLM 和一个输出解析器,以生成特定类型的文本。
- 代理 (Agents): 动态控制单元,使用 LLM 作为“推理引擎”来决定和使用各种“工具”执行动作。例如,一个代理可以使用搜索引擎来查找信息,使用计算器来执行数学运算,或者使用 API 来访问外部服务。
通过这种模块化的设计,LangChain 允许开发者根据自身的需求灵活地组合和定制各种组件,构建出高度定制化的 大模型 应用。
LangChain 生态系统:关键软件包
LangChain 由几个专门的、相互连接的开源软件包组成:
- langchain-core: 包含核心组件(聊天模型、向量存储、工具)的基本抽象和接口,依赖性最小。这是 LangChain 的基础,提供了所有其他软件包都依赖的基石。
- langchain: 主要软件包,包含通用链、代理和检索策略。它提供了构建各种 LLM 应用所需的常用工具和组件。
- langchain-community: 一个由社区维护的第三方集成(聊天模型、向量存储、工具)的存储库。它提供了与各种外部服务和工具的连接器,扩展了 LangChain 的功能。
- 集成软件包: 用于流行的第三方集成的专用软件包(例如,langchain-openai),用于正确的版本控制和轻量级设计。这些软件包允许您轻松地将 LangChain 与您选择的 LLM 提供商集成。
- langgraph: 一种扩展,通过将步骤建模为图中的节点和边,用于构建健壮的、有状态的多参与者 LLM 应用程序。推荐用于复杂的代理。它提供了一种构建更复杂的、基于状态的 LLM 应用的方法。
- langserve: 通过将 LangChain 链转换为可用于生产的 REST API,简化了部署。它可以轻松地将您的 LLM 应用部署到生产环境中。
- LangSmith: 一个开发人员平台,用于在 LLM 应用程序的整个生命周期中调试、测试、评估和监控它们。它提供了调试、测试和监控 LLM 应用所需的工具。
LangChain 生态系统的这种划分允许开发者根据自身的需求选择和使用合适的软件包,避免了不必要的依赖,提高了代码的效率和可维护性。 例如,如果开发者只需要使用 LangChain 的核心功能,那么只需要安装 langchain-core
和 langchain
即可。如果开发者需要与 OpenAI 的 LLM 集成,那么可以安装 langchain-openai
。
关键组件实战:Prompt 模板、链、代理和内存管理
Prompt 模板:制作有效的 LLM 指令
Prompt 模板对于有效的 LLM 交互至关重要,可将用户输入转换为模型的精确指令。它们帮助 LLM 理解上下文并生成相关的输出。LangChain 提供了 PromptTemplate
用于单个字符串,ChatPromptTemplate
用于会话消息列表,包括用于动态历史注入的 MessagesPlaceholder
。
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, SystemMessage
# 字符串 Prompt 模板
string_prompt = PromptTemplate.from_template("为 {topic} 生成一个标题。")
print(string_prompt.invoke({"topic": "AI 伦理"}))
# ChatPromptTemplate
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有帮助的助手。"),
("user", " {technology} 有什么好处?")
])
print(chat_prompt.invoke({"technology": "量子计算"}))
# ChatPromptTemplate 带有 MessagesPlaceholder 用于历史记录
history_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个友好的聊天机器人。"),
MessagesPlaceholder(variable_name="chat_history"),
("user", "{question}")
])
dummy_history = [HumanMessage(content="我的名字是 Sarah")]
print(history_prompt.invoke({"chat_history": dummy_history, "question": "我叫什么名字?"}))
链:编排顺序 LLM 工作流程
链是 LangChain 用于多步骤工作流程的机制,按顺序链接任务,其中一个输出提供给下一个任务。这包括从简单的 LLMChain
调用到将 LLM 调用与自定义逻辑和工具集成的复杂工作流程。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)
prompt = PromptTemplate.from_template("为专注于 {industry} 的创业公司建议一个座右铭。")
motto_chain = LLMChain(prompt=prompt, llm=llm)
response = motto_chain.invoke({"industry": "可再生能源"})
print(f"座右铭:\"{response['text'].strip()}\"")
代理 & 工具:使 LLM 能够行动和互动
代理使用 LLM 作为“推理引擎”来动态地决定和使用“工具”来与外部系统交互,从而执行操作。工具可以是预先构建的(例如,维基百科、计算器)或自定义的。代理通常遵循“推理和行动”(ReAct)模式,迭代地思考、行动和观察,直到得出最终答案。LangChain 现在强烈建议使用 LangGraph 来构建健壮的代理,将步骤建模为图中的节点和边。
import os
from langgraph.prebuilt import create_react_agent
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
# 定义一个自定义工具
@tool
def get_current_weather(location: str) -> str:
"""获取给定位置的当前天气。"""
if "San Francisco" in location:
return "旧金山阳光明媚。"
else:
return "天气数据不可用。"
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
agent_runnable = create_react_agent(
model=llm,
tools=[get_current_weather],
prompt="你是一个有帮助的天气助手。"
)
response = agent_runnable.invoke({"messages": [HumanMessage(content="旧金山的天气怎么样?")]})
print(f"代理的回复:{response['messages'][-1].content}")
内存管理:维护会话上下文
内存对于会话 AI“记住”过去的交互至关重要,从而实现连贯和个性化的对话。LangChain 支持:
- 短期记忆: 在单个问题解决序列中回忆信息。
- 长期记忆: 回忆先前会话中的信息。
LangChain 提供了诸如显式消息传递、使用 LangGraph 持久性自动历史记录管理以及诸如修剪或总结消息之类的先进技术来管理上下文窗口限制之类的策略。
import os
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import START, MessagesState, StateGraph
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
def call_model(state: MessagesState):
messages = state["messages"]
response = model.invoke(messages)
return {"messages": response}
workflow = StateGraph(state_schema=MessagesState)
workflow.add_node("model", call_model)
workflow.add_edge(START, "model")
memory = MemorySaver()
app_with_memory = workflow.compile(checkpointer=memory)
# 第一次互动
app_with_memory.invoke({"messages": [HumanMessage(content="我的名字是 Sarah")]}, config={"configurable": {"thread_id": "user_sarah_123"}})
# 第二次互动(记住名字)
response = app_with_memory.invoke({"messages": [HumanMessage(content="我说我的名字是什么?")]}, config={"configurable": {"thread_id": "user_sarah_123"}})
print(f"助手:{response['messages'][-1].content}")
这些关键组件的灵活组合,使得 LangChain 能够支持各种复杂的 LLM 应用场景,例如:
- 智能客服机器人: 通过 Prompt 模板和链,可以构建能够理解用户意图、查询知识库、生成答案并进行多轮对话的智能客服机器人。内存管理组件则可以帮助机器人记住对话历史,提供更个性化的服务。
- 自动化内容生成: 可以使用 Prompt 模板和链,根据用户提供的关键词和主题,自动生成文章、博客、新闻稿等各种类型的内容。
- 数据分析与报告生成: 可以通过代理和工具,连接到各种数据源,执行数据分析任务,并将结果生成为易于理解的报告。
检索增强生成 (RAG):将 LLM 连接到外部知识
RAG 通过将 LLM 与外部知识库相结合来增强 LLM,允许它们回答有关未经训练的信息的问题,从而减少“幻觉”。
import os
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
# 创建虚拟文档
dummy_text_content = "LangChain 是 LLM 应用程序的开源框架。它支持 RAG,RAG 将 LLM 连接到外部知识。"
with open("rag_doc.txt", "w") as f:
f.write(dummy_text_content)
loader = TextLoader("rag_doc.txt")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)
splits = text_splitter.split_documents(docs)
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(splits, embeddings)
retriever = vectorstore.as_retriever()
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
rag_prompt = ChatPromptTemplate.from_template("仅根据上下文回答:{context}\n问题:{input}")
document_chain = create_stuff_documents_chain(llm, rag_prompt)
retrieval_chain = create_retrieval_chain(retriever, document_chain)
response = retrieval_chain.invoke({"input": "什么是 LangChain?"})
print(f"答案:{response['answer']}")
RAG 的核心思想是,在 LLM 回答用户问题之前,先从外部知识库中检索相关的信息,然后将这些信息作为上下文提供给 LLM。这使得 LLM 能够基于外部知识生成答案,从而避免了“幻觉”现象。
例如,可以利用 RAG 构建一个能够回答特定领域问题的问答系统。首先,将领域知识存储在向量数据库中,然后使用 LangChain 的 RAG 链,将用户问题和从向量数据库中检索到的相关信息一起传递给 LLM。LLM 将根据这些信息生成答案。
入门:您的第一步
安装
要开始使用 LangChain,请安装核心框架和特定的 LLM 集成软件包:
pip install -U langchain langchain-openai
用法
此基本示例显示了如何初始化 LLM 并进行简单的文本生成调用:
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
# 设置您的 API 密钥:os.environ["OPENAI_API_KEY"] = "sk-..."
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
try:
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)
prompt_template = ChatPromptTemplate.from_template("告诉我一个关于 {topic} 的事实。")
fact_chain = prompt_template | llm # 使用 LangChain 表达式语言 (LCEL)
response = fact_chain.invoke({"topic": "月亮"})
print(f"关于月亮的事实:{response.content}")
except Exception as e:
print(f"发生错误:{e}")
print("请确保您的 OPENAI_API_KEY 环境变量设置正确。")
LangGraph:构建更健壮的代理
LangGraph 是 LangChain 生态系统中的一个重要组件,它提供了一种构建更健壮、更可靠的代理的方法。传统的代理通常基于链式结构,容易受到错误传播的影响。如果链中的某个环节出错,整个代理的性能就会受到影响。
LangGraph 通过将代理的执行流程建模为一个图,从而解决了这个问题。图中的每个节点代表一个步骤,例如思考、行动或观察。节点之间的边代表步骤之间的依赖关系。通过这种方式,LangGraph 可以更好地控制代理的执行流程,并在出现错误时进行恢复。
LangGraph 的另一个优势是它支持状态管理。这意味着代理可以记住之前的交互,并根据这些信息做出决策。这对于构建需要长期记忆的代理非常重要,例如聊天机器人。
例如,可以使用 LangGraph 构建一个能够自动完成复杂任务的代理。该代理可以根据用户提供的指令,自动执行一系列步骤,例如搜索信息、分析数据和生成报告。
LangSmith:调试、测试和监控 LLM 应用
LangSmith 是一个开发人员平台,用于在 LLM 应用程序的整个生命周期中调试、测试、评估和监控它们。构建可靠且高性能的 LLM 应用面临诸多挑战,例如:
- 幻觉: LLM 有时会生成不真实或不准确的答案。
- 偏见: LLM 可能会受到训练数据中存在的偏见的影响。
- 可解释性: 很难理解 LLM 如何做出决策。
LangSmith 提供了解决这些挑战所需的工具。它可以帮助开发者识别和修复 LLM 应用中的错误,评估其性能,并监控其在生产环境中的行为。
例如,可以使用 LangSmith 跟踪 LLM 应用的输入和输出,分析其性能指标,并识别导致错误的模式。这可以帮助开发者改进 LLM 应用的质量和可靠性。
LLM 开发的未来之路
LangChain 是一个功能强大且全面的框架,用于构建复杂的 LLM 应用程序,从而普及了对高级 AI 功能的访问。它专注于用于代理的 LangGraph 和用于生产化的 LangSmith,突出了其向管理复杂的自主 AI 系统的演进。对于开发人员而言,参与 LangChain 提供了一个站在 AI 创新前沿的机会。 今天尝试用它构建一些东西吧! 随着 大模型 技术的不断发展,LangChain 也将不断进化,为开发者提供更强大的工具和更便捷的开发体验,最终推动 大模型 应用的普及和发展。