LangChain-架构(前导篇)

conjuring-ai
134
2025-03-23

个人大数据码农,深耕大数据 5 年 +,但是也逃不过疫情之后的就业紧缩,22 年 OpenAi 在科技圈掀起轩然大波,那个时候都在尝试怎么去注册使用,能否第一时间上手体验,帮助自己完成编码部分,日常问答搜索成了当时最受追捧岂能之一,那时候各大贩卖账号和 API Key 的中间商不计其数,国内想要尝鲜还需要自己会一点魔法才行,再就是各大套壳应用蜂拥而至,我也是其中之一,见过很多用户同时购买了很多个平台的....,废话截止,咱步入正题。

我是从 22 年开始接触 AI,22 年有了自己的小网站,阅者可以微信搜索公众号:兔程互联 或 笔头写作 - 兔程科技 去体验,24 年忙于工作同时也是国内 AI 爆发期,25 年因为自己工作的公司业务问题,目前我不得不再次进入求职大军,目前大模型基础已经很成熟,但是缺少应用场景,而今年又是 Agent 的发热期,自己也开始接触这个方向,顺便写下自己的学习记录,也做好自己的转型。

后期会同步更新 LangChain 源码学习和解读。

一、LangChain是什么?

LangChain架构

图 1: LangChain 架构

如上是 LangChain 官网对 LangChain 的大致描述。

简而言之,LangChain 是一个框架,LangChain 团队和开发者共同维护包含 LangGraph,Intergrations 以及 LangChain

Intergrations(组件)有很多如 langchain-OpenAI,langchain-Cloude,langchain-ELk,向量数据库等诸多组件,以不同的功能或模型分类为不同的项目模块以提供给 LangChain 框架使用,这是整个框架的基础,也就是大模型本身。如你想通过 OpenAI 来实现你的功能,就可以使用 LangChain-OPenAI 这个组件对接到 OpenAI 的请求地址,之后便可以借助框架构造你的应用或知识库等。

LangChain(链)这是一个通用组件,因为在这所有链、代理和检索策略都不特定于任何一种集成。换而言之 LangChain 是一个通用的桥梁,借助他可以将其他的内容进行联系和应用。

LangGraph(图)不难理解,这个应该是LangChain基础上的一个扩展,旨在能够借助LangChainIntergrations通过将步骤建模为图中的边和节点来构建健壮且有状态的多角色应用程序。(多智能体 ,如 MetaGPT 和 Manus

LangSmith(平台)这个我理解应该是建立在Intergrations,LangChainLangGraph之上,可以全部多单独的对接上面的角色去形成自己的需求,让你能够调试、测试、评估和监控 LLM 应用程序。事实上也是如此,在接下来的架构中我会在细化的阐述。

二、LangChain架构

LangChain 是一个由多个包组成的框架。框架中分的相对较细,又将图 1 中进行了进一步抽象,咱们一一说来:

langchain-core(核心组件):包含不同组件的基本抽象以及将它们组合在一起的方式。这里定义了核心组件(如聊天模型、向量存储、工具等)的接口。此处未定义任何第三方集成。依赖项非常轻量。

LangChain(主包) 包含构成应用程序认知架构的链和检索策略。非第三方集成。这里的所有链、代理和检索策略都不是针对任何特定集成,而是适用于所有集成。

Integration packages(集成包)这里也就是第一节中介绍到的Intergrations中的一部分将目前流行的大模型或其他工具集成到自己的保重(例如 langchain-openailangchain-anthropic 等),在这里可以正确版本控制和适当轻量。

langchain-community(langchain 社区)包含由 LangChain 社区维护的第三方集成。关键集成包已单独列出(见integrations packages)。含各种组件(聊天模型、向量存储、工具等)的集成。所有依赖项都是可选的,以尽可能保持包的轻量级。

langgraph (智能体编排)langgraphlangchain 的扩展,旨在通过将步骤建模为图中的边和节点,使用 LLMs 构建健壮和有状态的多参与者应用程序。

LangGraph 公开了创建常见类型代理的高级接口,以及用于组合自定义流程的低级 API。

如果需要进一步了解,可以异步官网进一步阅读:

LangGraph 概述LangGraph 学院课程

langserve(API 服务)一个用于部署 LangChain 链作为 REST API 的包。使创建一个可投入生产的 API 变得简单。

LangServe 主要用于部署简单的可运行对象,并与 langchain-core 协同工作。

如需要 LangGraph 的部署,可查看 LangGraph 平台(beta),它更适合部署 LangGraph 应用程序。

有关更多信息,请参阅 LangServe 文档

LangSmith(平台)能够调试、测试、评估和监控 LLM 应用程序的开发平台。跟多关注LangSmith 文档

三、LangChain案例

3.1 LangSmith

是一个用于构建生产级 LLM 应用的平台。它允许您密切监控和评估您的应用,以便您可以快速且自信地发布。

Observability 分析 LangSmith 中的跟踪并基于这些配置指标、仪表板和警报。

Evals 评估应用程序在生产流量中的表现——评分应用程序性能并获取您数据的人性化反馈。

Prompt Engineering 迭代提示,具有自动版本控制和协作功能。

LangSmith 是框架无关的——它可以与 LangChain 的开源框架 langchainlanggraph 一起使用,也可以单独使用。

如果使用其中任何一个,都可以通过单个环境变量启用 LangSmith 跟踪。

1、安装

pip install langchain_openai langchain_core

2、环境配置

export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=<your-api-key>
# This example uses OpenAI, but you can use any LLM provider of choice
export OPENAI_API_KEY=<your-openai-api-key>

3、记录跟踪

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful assistant. Please respond to the user's request only based on the given context."),
    ("user", "Question: {question}\nContext: {context}")
])
model = ChatOpenAI(model="gpt-4o-mini")
output_parser = StrOutputParser()

chain = prompt | model | output_parser

question = "Can you summarize this morning's meetings?"
context = "During this morning's meeting, we solved all world conflict."
chain.invoke({"question": question, "context": context})

3.2 LangGraph

LangSmith 与 LangGraph(Python 和 JS)无缝集成,帮助追踪代理工作流程,无论使用 LangChain 模块还是其他 SDK。

1、安装

pip install langchain_openai langgraph

2、环境配置

export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=<your-api-key>
# This example uses OpenAI, but you can use any LLM provider of choice
export OPENAI_API_KEY=<your-openai-api-key>

3、记录跟踪

from typing import Literal

from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langgraph.graph import StateGraph, MessagesState
from langgraph.prebuilt import ToolNode

@tool
def search(query: str):
    """Call to surf the web."""
    if "sf" in query.lower() or "san francisco" in query.lower():
        return "It's 60 degrees and foggy."
    return "It's 90 degrees and sunny."

tools = [search]

tool_node = ToolNode(tools)

model = ChatOpenAI(model="gpt-4o", temperature=0).bind_tools(tools)

def should_continue(state: MessagesState) -> Literal["tools", "__end__"]:
    messages = state['messages']
    last_message = messages[-1]
    if last_message.tool_calls:
        return "tools"
    return "__end__"


def call_model(state: MessagesState):
    messages = state['messages']

    # Invoking `model` will automatically infer the correct tracing context
    response = model.invoke(messages)
    return {"messages": [response]}


workflow = StateGraph(MessagesState)

workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)

workflow.add_edge("__start__", "agent")
workflow.add_conditional_edges(
    "agent",
    should_continue,
)
workflow.add_edge("tools", 'agent')

app = workflow.compile()

final_state = app.invoke(
    {"messages": [HumanMessage(content="what is the weather in sf")]},
    config={"configurable": {"thread_id": 42}}
)
final_state["messages"][-1].content

3.2 和 3.1 相似

动物装饰