【Agent】LangChain 1.0架构

【Agent】大模型在线API接入基础入门
【Agent】智能体基础入门(技术发展路线+TAO循环+function calling)

文章目录

  • [一、LangChain 1.0框架简介](#一、LangChain 1.0框架简介)
    • [1.1 LangChain 1.0框架的应用](#1.1 LangChain 1.0框架的应用)
    • [1.2 LangChain 1.0 生态](#1.2 LangChain 1.0 生态)
    • [1.3 LangChain 1.0底层运行架构](#1.3 LangChain 1.0底层运行架构)
    • [1.4 Runnable底层执行引擎](#1.4 Runnable底层执行引擎)
      • [1.4.1 Prompt Runnable](#1.4.1 Prompt Runnable)
      • [1.4.2 Tool Runnable](#1.4.2 Tool Runnable)
  • [二、LangChain 1.0 包结构](#二、LangChain 1.0 包结构)
    • [2.1 langchain-core](#2.1 langchain-core)
    • [2.2 langchain主包](#2.2 langchain主包)
    • [2.3 langchain-community 第三方集成库](#2.3 langchain-community 第三方集成库)
    • [2.4 langchain-openai(厂商/提供者集成包)](#2.4 langchain-openai(厂商/提供者集成包))
  • 三、核心组件详解
    • [3.1 Model(模型)统一接口init_chat_model](#3.1 Model(模型)统一接口init_chat_model)
    • [3.2 init_embeddings](#3.2 init_embeddings)
    • [3.3 Message(消息)对话基础](#3.3 Message(消息)对话基础)
    • 3.4提示词模板
      • 3.4.1Prompt
      • [3.4.2 ChatPromptTemplate](#3.4.2 ChatPromptTemplate)
      • [3.4.3 Hub提示词模板库](#3.4.3 Hub提示词模板库)
    • [3.5 Content Blocks(多模态标准化)](#3.5 Content Blocks(多模态标准化))
    • [3.6 批处理(Batch)](#3.6 批处理(Batch))
    • [3.6 流式输出(Streaming)](#3.6 流式输出(Streaming))
    • [3.7 结构化输出(最常用功能)](#3.7 结构化输出(最常用功能))
  • 四、LangChain搭建对话机器人

一、LangChain 1.0框架简介

1.1 LangChain 1.0框架的应用

  • 构建RAG问答系统
  • 把LLM当做agent去调用外部API(搜索、数据库、文件系统)并 返回任务结果
  • 组织prompt--->模型--->后处理的可复用流水线(Chains)
  • 实现多轮对话带记忆(Memory)与长会话管理
  • 在生产中管理可观察与评估

1.2 LangChain 1.0 生态

1.3 LangChain 1.0底层运行架构

1.4 Runnable底层执行引擎

Runnable是LangChain 1.0的统一接口标准,任何可以运行的组件:模型、promot、工具、解析器、Memory、Graph节点,在1.0中都被抽象为Runnable。Runnable使所有LangChain组件能够以统一接口组合、执行、链式调用,并支撑ICEL (LangChain Expression Language) 的整个运行语义,支撑可组合、可并行、可路由的链式执行,是LangChain 1.0的核心底座之一。

1.4.1 Prompt Runnable

下载安装LangChain

pip install --upgrade langchain

python 复制代码
from langchain_core.prompts import ChatPromptTemplate

#定义一个Prompt
prompt = ChatPromptTemplate.from_template("Tell me a joke about {topic}")
print(prompt.invoke({"topic":"ice cream"}))
#messages=[HumanMessage(content='Tell me a joke about ice cream', additional_kwargs={}, response_metadata={})]

1.4.2 Tool Runnable

python 复制代码
from langchain_core.tools import tool

#定义一个简单的tool(Runnable)
@tool
def multiply(a: int, b: int) -> int:
    """Multiplies a and b."""
    return a * b

print(multiply.invoke({"a":1, "b":2}))
#2

结论:Runnable是ICEL的语法基础。任何ICEL chain=多个Runnable的组合。

二、LangChain 1.0 包结构

python 复制代码
pip install langchain                    # 主包,必须
pip install langchain-openai             # OpenAI(生产推荐)
pip install langchain-deepseek           # DeepSeek
pip install langchain-community          # PDF加载、Chroma等(可选)
依赖包名称 核心作用 详细功能介绍
langchain-core 核心抽象层和 LCEL 定义所有组件(如模型、消息、提示词模板、工具、运行环境)的标准接口和基本抽象。它包含了 LangChain 表达式语言 (LCEL) ,这是构建链式应用的基础。这是一个轻量级不含第三方集成的基石包。
langchain 应用认知架构(主包) 包含构建 LLM 应用的通用高阶逻辑,如 Agents (如新的 create_agent() 函数)、Chains 和通用的检索策略 (Retrieval Strategies)。它建立在 langchain-core 之上,是用于组合核心组件的"胶水"层。
langchain-community 社区第三方集成 包含由 LangChain 社区维护的非核心或不太流行的第三方集成,例如:大部分的文档加载器 (Document Loaders)、向量存储 (Vector Stores)、不太流行的 LLM/Chat Model 集成等。为了保持包的轻量,所有依赖项都是可选的。
langchain-openai / langchain-[厂商名称] 特定厂商深度集成 针对 关键合作伙伴 的集成包(如 langchain-openai, langchain-anthropic)。它们被单独分离出来,以提供更好的支持、可靠性更轻量级的依赖。它们只依赖于 langchain-core。
langchain-classic 旧版本兼容 包含 LangChain v0.x 版本中的已弃用 (deprecated) 或旧版功能 ,如旧的 LLMChain、旧版 Retrievers、Indexing API 和 Hub 模块。它的主要作用是为用户提供一个平稳的迁移期,确保旧代码在升级到 v1.0 后仍能运行。

2.1 langchain-core

python 复制代码
from langchain_core.prompts import PromptTemplate

prompt_template = PromptTemplate.from_template(
    "为生产{product}的公司起一个好名字?"
)

formatted_prompt = prompt_template.format(product="智能水杯")

response = model.invoke(formatted_prompt)

2.2 langchain主包

模块 核心内容 来源说明
langchain.agents create_agent, AgentState 智能体创建核心
langchain.messages AIMessage, HumanMessage, trim_messages 从langchain-core重新导出
langchain.tools @tool, BaseTool 从langchain-core重新导出
langchain.chat_models init_chat_model, BaseChatModel 统一模型初始化
langchain.embeddings init_embeddings 嵌入模型管理
python 复制代码
from langchain.agents import create_agent

# 创建智能体
agent_executor = create_agent(llm, tools)

result = agent.invoke({
    "messages": [{
        "role": "user",
        "content": "会议决定:张三需要在下周一前完成项目报告"
    }]
})

2.3 langchain-community 第三方集成库

langchain-community 作为 LangChain 1.0 的"功能扩展层",通过社区贡献的非官方集成组件显著扩展了主包的功能边界,其核心价值体现在工具类组件与平台集成两大维度。工具类组件覆盖文档处理全流程,包括 DirectoryLoader 文档加载器(支持 PDF、文本等多格式文件批量导入)、RecursiveCharacterTextSplitter 文本分割器(按语义边界将文档切分为检索友好的 Chunk)、PGVector 向量存储(PostgreSQL 生态的向量数据库适配)及 HuggingFaceEmbeddings 嵌入模型(本地部署模型的向量化能力),这些组件共同构成了 RAG 应用的技术基础。平台集成方面,支持与 DeepSeek、阿里云通义千问等模型的对接,例如通过 langchain_community.chat_models.ChatTongyi 类初始化通义千问模型,或利用 Ollama 类调用本地部署的 DeepSeek-R1 模型。

  • 收集并维护 社区/第三方贡献的集成 (例如某些云厂商、开源向量库、特殊工具适配器等)。这些集成实现了 langchain-core 定义的接口 ,但不属于主包维护范畴。官方会把这些放到 langchain-community 仓库/包,便于社区共同维护。

特点

  • 质量参差不齐:社区贡献,需自行验证稳定性

  • 更新滞后:依赖社区维护,响应速度慢于官方包

  • 功能丰富:覆盖95%的第三方服务集成需求

python 复制代码
from langchain_community.document_loaders import NotionDBLoader

# 从Notion数据库加载文档
loader = NotionDBLoader(
    integration_token="secret_...",
    database_id="your-db-id"
)

documents = loader.load()

print(f"加载了{len(documents)}条文档")

2.4 langchain-openai(厂商/提供者集成包)

  • 专门负责把 OpenAI 的 SDK 与 LangChain 抽象连接起来 :提供 ChatOpenAIOpenAIEmbeddingsOpenAI等类的实现。

  • 这类包通常是 "按厂商拆分":langchain-openailangchain-azurelangchain-anthropiclangchain-deepseek等。

  • 官方深度集成特定LLM提供商,更新频繁,功能最全.

python 复制代码
from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4o-mini")

question = "你好,请你介绍一下你自己。"

result = model.invoke(question)
print(result.content)

主流厂商包列表

  • langchain-openai:OpenAI, Azure OpenAI

  • langchain-anthropic:Claude系列

  • langchain-google:Gemini, Vertex AI

  • langchain-deepseek:DeepSeek模型

  • langchain-ollama:本地Ollama部署

三、核心组件详解

3.1 Model(模型)统一接口init_chat_model

python 复制代码
from langchain.chat_models import init_chat_model

# 一行代码切换模型,业务代码0改动
model = init_chat_model("gpt-4o-mini", model_provider="openai")
# model = init_chat_model("deepseek-chat", model_provider="deepseek")
# model = init_chat_model("claude-3-sonnet", model_provider="anthropic")

增强功能:

  • 速率限制。假如代码中有一个循环,要调用100次模型API,那么这100次请求在1秒全部发出去,会导致:账号被临时封禁、及时没有封禁也会被限流,后面请求全部失败。速率限制的作用就是可以在客户端主动限流:100个请求会被"排队",每秒只发出5个。

  • 重试机制with_retry。API调用有时会失败,原因有很多:网络抖动、API服务端临时过载、请求触发了某个bug。重试机制的作用是,失败之后自动重试,最多三次。第 1 次失败 等待 1 秒 等待 0.8-1.2秒; 第 2 次失败 等待 2 秒 等待 1.6-2.4 秒;第 3 次失败 等待 4 秒 等待 3.2~4.8 秒。抖动的作用:假设你有 1000 个请求同时失败,没有抖动的话:所有请求都在 1 秒后同时重试 → 再次把服务器打爆 💥有抖动的话:请求 A 等 0.9 秒重试;请求 B 等 1.1 秒重试;请求 C 等 1.3 秒重试... 重试时间分散开,服务器压力小很多。

python 复制代码
# 1. 速率限制
from langchain_core.rate_limiters import InMemoryRateLimiter
rate_limiter = InMemoryRateLimiter(requests_per_second=5) # 每秒最多 5 个请求
model = init_chat_model(..., rate_limiter=rate_limiter)

# 2. 重试机制(指数退避 + 抖动)
model = model.with_retry(stop_after_attempt=3, wait_exponential_jitter=True)

3.2 init_embeddings

python 复制代码
# 1. 使用init_embeddings初始化嵌入模型
from langchain.embeddings import init_embeddings

# 2. 初始化OpenAI的text-embedding-3-small嵌入模型
embedding = init_embeddings(model="text-embedding-3-small",provider="openai")   

# 3. 将文本转换为向量表示
res = embedding.embed_query("Hello world")    

# 4. 打印向量的前10个元素
print(res[:10])

定义load_embedding函数封装嵌入模型初始化逻辑

python 复制代码
# 该函数用于根据指定的模型名称、提供商和可选的自定义API地址,快速初始化并返回一个嵌入模型实例
from langchain.embeddings import init_embeddings

def load_embedding(
    model: str,    # 模型名称
    provider: str,    # 模型提供商
    base_url: str | None = None,    # 自定义API服务器地址
):
    # 调用init_embeddings完成嵌入模型的初始化
    return init_embeddings(
        model=model,    # 模型名称
        provider=provider,    # 模型提供商
        base_url=base_url    # 自定义API服务器地址
    )

3.3 Message(消息)对话基础

python 复制代码
from langchain.messages import SystemMessage, HumanMessage, AIMessage

messages = [
    SystemMessage("你是技术专家,回答要专业"),      # 最高优先级
    AIMessage("我准备好了,请问您遇到什么问题?"),   # 历史回复
    HumanMessage("我的电脑会自动重启")              # 当前问题
]
response = model.invoke(messages)

消息角色优先级:system > developer > user > assistant > tool

3.4提示词模板

3.4.1Prompt

python 复制代码
from langchain_core.prompts import ChatPromptTemplate

# 最常用的方式:消息模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是{role}专家"),
    ("human", "{question}")
])

chain = prompt | model
result = chain.invoke({"role": "Python", "question": "什么是装饰器?"})

partial_variables 预填固定变量:prompt.partial,提前设定好回复风格。

python 复制代码
template = ChatPromptTemplate.from_messages([
    ("system", "回答风格:{style}")
], partial_variables={"style": "简洁明了"})

# 运行时覆盖
prompt = template.partial(style="通俗易懂")

主要区别:

python 复制代码
# 普通方式:变量都需要在 invoke 时提供
prompt = ChatPromptTemplate.from_template("给{product}起名,风格{style}")
chain = prompt | model
result = chain.invoke({"product": "智能水杯", "style": "可爱"})  # 两个都要传

# partial 方式:预填固定值,invoke 时可以少传
prompt = ChatPromptTemplate.from_template("给{product}起名,风格{style}")
prompt = prompt.partial(style="可爱")  # 预填风格
chain = prompt | model
result = chain.invoke({"product": "智能水杯"})  # 只需要传 product

3.4.2 ChatPromptTemplate

python 复制代码
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import SystemMessage, HumanMessage

# 使用messages模板字符串(最常用)
chat_template = ChatPromptTemplate.from_messages([
        
    # SystemMessage: 定义AI角色和行为准则
    ("system", "你是一个专业的Python代码审查助手。请严格检查代码风格、潜在Bug和性能问题。"),

    # HumanMessage: 用户输入
    ("human", "请审查以下代码:\n\n{code_snippet}"),

    # AIMessage: 可选,提供示例输出(Few-shot)
    ("ai", "我发现了以下问题:1. 缺少类型注解 2. 使用全局变量"),

    # HumanMessage: 用户的后续指令
    ("human", "{follow_up_instruction}")
])

# 格式化:生成消息列表
messages = chat_template.format_messages(
        
    code_snippet="def add(a,b):\n    return a+b", 
        
    follow_up_instruction="请给出优化后的代码"
)

print("生成的消息结构:")
for i, msg in enumerate(messages):
    print(f"\n--- 消息 {i+1} ---")
    print(f"角色: {msg.schema}")
    print(f"内容: {msg.content}")

# 直接传递给模型
response = model.invoke(messages)
print("\n 模型审查结果:")
print(response.content_blocks[0]["text"])

3.4.3 Hub提示词模板库

python 复制代码
import os
from dotenv import load_dotenv
load_dotenv()

# 从langsmith库引入Client类
from langsmith import Client 

# 通过LangSmith的LANGSMITH_API_KEY创建Client实例化
client = Client(api_key=os.getenv("LANGSMITH_API_KEY"))

# 从hub上拉取对应的prompt模版
# 指定prompt标识符"rlm/rag-prompt",获取可用于RAG场景的提示模板
prompt = client.pull_prompt("rlm/rag-prompt", include_model=True)

# 使用模板
formatted = prompt.format(
        context="""
                LangChain 是一个构建 LLM 应用的框架,
                目标是把 LLM 与外部工具、数据源和复杂工作流连接起来 ------ 支持从简单的 prompt 封装到复杂的 Agent
                (能够调用工具、做决策、执行多步任务)""",   # 模板中定义的上下文变量,用于填充到模板中
        question="什么是LangChain?")                   # 模板中定义的问题变量,用于填充到模板中

print("\n格式化后:")
print(formatted)

response = model.invoke(formatted)

print(response.content)

LangChain 是一个用于构建大型语言模型(LLM)应用的框架。它旨在将 LLM 与外部工具、数据源和复杂工作流连接起来,支持从简单的提示封装到复杂的代理。这个框架可以实现工具调用、决策制定和多步任务执行。

3.5 Content Blocks(多模态标准化)

统一格式解决不同厂商输出格式不一致的痛点:

python 复制代码
from langchain_core.messages import HumanMessage, SystemMessage

# 创建系统提示
system_msg = SystemMessage("你是一个专业的问答专家。")

# 构造用户消息:文本+图像
human_msg = HumanMessage(content=[
    {"type": "text", "text": "请描述图像:"},
    {"type": "image_url", 
     "image_url": {"url": "https://zrj18330672592.oss-cn-beijing.aliyuncs.com/20251015134735612.png", 
     "mime_type": "image/jpeg",
     "metadata": "RAG基础流程图"}
    },
])

# 形成消息列表
messages = [system_msg, human_msg]

# 框架会懒解析 content -> content_blocks
for cb in human_msg.content_blocks:
    print(cb)   # content block 对象视图

3.6 批处理(Batch)

python 复制代码
from langchain_core.runnables import RunnableConfig

# 配置:最多 2 个并发任务
config = RunnableConfig(
    max_concurrency=2,    # 最大并发数:限制同时运行的任务数量,防止资源耗尽
    abstimeout=8.0,       # 单个任务超时时间(秒):超过此时间未完成的任务将被强制终止
    metadata={"request_id": "abc123", "task": "query"},  # 元数据:记录请求ID和任务类型,便于追踪和日志分析
)

# 创建一个带有{product}占位符变量的模板
prompt_template = PromptTemplate.from_template(
    "为生产{product}的公司起一个好名字?"
)

# 准备一个输入列表
inputs = ["彩色袜子", "环保咖啡杯", "智能水杯"]
formatted_prompts = [prompt_template.format(product=product) for product in inputs]

# Jupyter 已经支持顶级 await,无需 asyncio.run()
results = await model.abatch(formatted_prompts, config=config)

for i, r in enumerate(results):
    print(f"=== Query {i+1} ===")
    print(r.content)
    print(r.model_config)

# 可能输出: ['Fun Socks Co.', 'Green Cup Co.', 'HydraSmart']

3.6 流式输出(Streaming)

python 复制代码
# 基础流式
for chunk in model.stream("写一首诗"):
    print(chunk.content, end="")

# 消息块累加
full = None
for chunk in model.stream("你好"):
    full = chunk if full is None else full + chunk
    print(full.text)  # 逐字累积效果

# 语义事件监听(适合调试/UI)
async for event in chain.astream_events({"question": "..."}, version="v1"):
    if event["event"] == "on_chat_model_stream":
        print(event["data"]["chunk"].content, end="")

3.7 结构化输出(最常用功能)

python 复制代码
from pydantic import BaseModel, Field
from typing import Literal

class WeatherForecast(BaseModel):
    city: str = Field(description="城市名称")
    temperature: int = Field(description="温度(摄氏度)")
    condition: Literal["晴", "雨", "多云"] = Field(description="天气状况")

# 方式1:直接绑定
structured_llm = model.with_structured_output(WeatherForecast)
result = structured_llm.invoke("北京今天晴天,25度")
# result 是 WeatherForecast 对象

# 方式2:在 Agent 中使用
from langchain.agents import create_agent
agent = create_agent(model=model, tools=[], response_format=WeatherForecast)
result = agent.invoke({"messages": [{"role": "user", "content": "北京晴,25度"}]})
forecast = result["structured_response"]

四、LangChain搭建对话机器人

python 复制代码
from langchain_deepseek import ChatDeepSeek
from langchain.messages import HumanMessage, AIMessage, SystemMessage

# 1️⃣ 初始化模型(LangChain 1.0 接口)
model = load_chat_model(
    model="gpt-4o-mini",
    provider="openai",
)

# 2️⃣ 初始化系统提示词(System Prompt)
system_message = SystemMessage(
    content="你叫小智,是一名乐于助人的智能助手。请在对话中保持温和、有耐心的语气。"
)

# 3️⃣ 初始化消息历史
messages = [system_message]

print("🔹 输入 exit 退出对话\n")

# 4️⃣ 主循环(支持多轮对话 + 流式输出)
while True:
    user_input = input("👤 你:")
    if user_input.lower() in {"exit", "quit"}:
        print("🧩 对话结束,再见!")
        break

    # 追加用户消息
    messages.append(HumanMessage(content=user_input))

    # 实时输出模型生成内容
    print("🤖 小智:", end="", flush=True)
    full_reply = ""

    # ✅ LangChain 1.0 标准写法:流式输出
    for chunk in model.stream(messages):
        if chunk.content:
            print(chunk.content, end="", flush=True)
            full_reply += chunk.content

    print("\n" + "-" * 40)  # 分隔线

    # 追加 AI 回复消息
    messages.append(AIMessage(content=full_reply))

    # 保持消息长度(只保留最近50轮)
    messages = messages[-50:]
相关推荐
小橘子8312 小时前
(学习)Claude Code 源码架构深度解析
学习·程序人生·架构
C'ᴇsᴛ.小琳 ℡3 小时前
架构技术演进的方向
架构
刀法如飞4 小时前
Agentic Workflow 设计与实战指南
架构·agent·ai编程
tkevinjd4 小时前
基于LangChain的简易智能旅游助手Agent
langchain·agent
2301_764441334 小时前
claw-code:基于Claude Code架构的clean-room重写开源项目
人工智能·架构·开源
AI_零食4 小时前
开源鸿蒙跨平台Flutter开发:昼夜节律与睡眠相位-脑电波周期与最佳苏醒测绘架构
flutter·ui·华为·架构·开源·harmonyos·鸿蒙
CoovallyAIHub6 小时前
Sensors 2026 | 从无人机拍摄到跑道缺陷地图,机场巡检全流程自动化——Zadar机场全跑道验证
数据库·架构·github
CoovallyAIHub6 小时前
15K Star中文首发!$5部署一个会自我进化的私人Agent——NousResearch开源Hermes Agent
git·架构·github
liu****7 小时前
LangChain-AI应用开发框架(七)
人工智能·python·langchain·大模型应用·本地部署大模型