乐于分享
好东西不私藏

LangChain文档

LangChain文档

一、概述

LangChain 为基于大语言模型(LLMs)构建全自定义智能体与应用提供了轻量化解决方案开发者仅需不到 10 行代码,就能实现与 OpenAI、Anthropic、谷歌等平台的对接。该框架内置成熟的智能体架构与模型集成模块,可帮助开发人员快速启动项目,将大语言模型能力无缝嵌入智能体及各类应用中。

LangChain 智能体基于 LangGraph 构建,以提供持久化执行、流式输出、人机协同、状态持久化等核心能力。

二、创建一个基础智能体

import osfrom langchain.agents import create_agentfrom langchain_community.llms import Tongyifrom dotenv import load_dotenv# 工具函数def get_weather(city: str) -> str:    """Get weather for a given city."""    return f"It's always sunny in {city}!"load_dotenv()from langchain_community.chat_models import ChatTongyillm = ChatTongyi(    model="qwen-plus",  # 可选:qwen-max/qwen-turbo/qwen-coder等    temperature=0.7,    dashscope_api_key=os.getenv("DASHSCOPE_API_KEY")  # 从.env读取)# 创建 Agentagent = create_agent(    model=llm,    tools=[get_weather],    system_prompt="You are a helpful assistant",)# 运行result = agent.invoke({    "messages": [        {"role""user""content""what is the weather in sf"}    ]})print(result)

三、智能体

智能体(Agents)将大语言模型与工具相结合,构建出能够对任务进行推理、自主决策使用何种工具,并通过迭代逐步推进直至解决问题的系统。create_agent 提供了可直接用于生产环境的智能体实现方案。大语言模型智能体通过循环调用工具来达成目标。智能体会持续运行,直到满足终止条件 —— 即模型生成最终输出,或达到迭代次数上限。

四、模型

模型是智能体的推理引擎。它支持多种指定方式,同时兼容静态与动态模型选择。

动态模型示例

import osfrom langchain.agents import create_agentfrom langchain_community.chat_models import ChatTongyifrom langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponsefrom dotenv import load_dotenv# 加载环境变量load_dotenv()# ===================== 1. 定义工具 =====================def get_weather(city: str) -> str:    """Get weather for a given city."""    return f"It's always sunny in {city}!"# ===================== 2. 定义阿里百炼双模型:基础 / 高级 =====================# 基础模型(短对话)basic_model = ChatTongyi(    model="qwen-turbo",    temperature=0.7,    dashscope_api_key=os.getenv("DASHSCOPE_API_KEY"))# 高级模型(长对话 >10 轮自动切换)advanced_model = ChatTongyi(    model="qwen-plus",    temperature=0.7,    dashscope_api_key=os.getenv("DASHSCOPE_API_KEY"))# ===================== 3. 动态模型选择中间件 =====================@wrap_model_calldef dynamic_model_selection(request: ModelRequest, handler) -> ModelResponse:    """根据对话长度自动切换模型:短对话用turbo,长对话用plus"""    message_count = len(request.state["messages"])    print(f"\n📊 当前对话轮数: {message_count}")    # 核心逻辑:超过10轮 → 自动用高级模型    if message_count > 10:        print("✅ 切换为高级模型: qwen-plus")        model = advanced_model    else:        print("✅ 使用基础模型: qwen-turbo")        model = basic_model    return handler(request.override(model=model))# ===================== 4. 创建 Agent =====================agent = create_agent(    model=basic_model,       # 默认模型    tools=[get_weather],     # 工具    middleware=[dynamic_model_selection],  # 动态模型中间件    system_prompt="You are a helpful assistant")# ===================== 5. 运行测试 =====================if __name__ == "__main__":    result = agent.invoke({        "messages": [            {"role""user""content""今天成都的天气如何?"}        ]    })    print("\n===== AI 回答 =====")    print(result)

五、工具

在动态工具机制下,智能体(Agent)可使用的工具集在运行时动态调整,而非在初始阶段就全部定义完成。并非所有工具都适用于每一种场景:工具过多会给模型造成负担(上下文过载),提升出错概率;工具过少则会限制智能体的能力。动态工具选择机制支持根据认证状态、用户权限、功能开关或对话阶段,灵活调整可用工具集。

根据工具是否可提前预知,存在两种实现方案:

  • Filtering pre-registered tools  筛选预注册工具
当在智能体(Agent)创建阶段就已知所有可能的工具时,你可以预先注册这些工具,并根据运行状态、用户权限或上下文,动态筛选出向模型暴露的工具。
其中一种方式
import osfrom langchain.agents import create_agentfrom langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponsefrom langchain_community.chat_models import ChatTongyifrom dotenv import load_dotenvfrom typing import Callable# 加载环境变量load_dotenv()# ===================== 1. 定义 3 个工具(和官方例子完全对应)=====================def public_search(query: str) -> str:    """公开搜索工具(未登录也能用)"""    return f"[公开搜索结果] {query}"def private_search(query: str) -> str:    """私有搜索工具(登录后才能用)"""    return f"[私有搜索结果] {query}"def advanced_search(query: str) -> str:    """高级搜索工具(对话超过5轮才能用)"""    return f"[高级搜索结果] {query}"tools = [public_search, private_search, advanced_search]# ===================== 2. 阿里百炼模型 =====================llm = ChatTongyi(    model="qwen-plus",    dashscope_api_key=os.getenv("DASHSCOPE_API_KEY"),    temperature=0.1)# ===================== 3. 核心:状态驱动动态工具过滤中间件 =====================@wrap_model_calldef state_based_tools(    request: ModelRequest,    handler: Callable[[ModelRequest], ModelResponse]) -> ModelResponse:    """根据对话状态动态过滤可用工具(官方示例原版逻辑)"""    state = request.state    is_authenticated = state.get("authenticated"False)    message_count = len(state.get("messages", []))    print(f"\n===== 工具过滤逻辑 =====")    print(f"已认证: {is_authenticated}")    print(f"消息轮数: {message_count}")    # 1. 未登录 → 只允许 public_ 开头的工具    if not is_authenticated:        filtered_tools = [t for t in request.tools if t.name.startswith("public_")]        request = request.override(tools=filtered_tools)        print("→ 未登录,仅保留公开工具")    # 2. 已登录但对话 <5 轮 → 禁用 advanced_search    elif message_count < 5:        filtered_tools = [t for t in request.tools if t.name != "advanced_search"]        request = request.override(tools=filtered_tools)        print("→ 对话轮数不足,禁用高级搜索")    # 3. 已登录 + 对话 ≥5 轮 → 所有工具都可用    else:        print("→ 已认证+长对话,所有工具可用")    return handler(request)# ===================== 4. 创建 Agent =====================agent = create_agent(    model=llm,    tools=tools,    middleware=[state_based_tools])# ===================== 5. 测试运行 =====================if __name__ == "__main__":    # 测试场景:未登录 + 短对话    result = agent.invoke({        "messages": [{"role""user""content""请搜索智能家居资料"}],        "authenticated"False  # 未登录    })    print("\n===== 最终回答 =====")    print(result)
  • Runtime tool registration  运行时工具注册

当工具在运行时被发现或创建时(例如,从MCP 服务器加载、基于用户数据生成,或从远程注册表拉取),你需要同时对工具进行动态注册与动态执行处理。

六、动态提示词

对于需要基于运行时上下文或智能体状态修改系统提示词的高级场景,你可以使用中间件。

@dynamic_prompt 装饰器可创建中间件,该中间件能够基于模型请求生成系统提示词。

import osfrom dotenv import load_dotenvfrom typing import TypedDictfrom langchain_community.chat_models import ChatTongyifrom langchain.agents import create_agentfrom langchain.agents.middleware import dynamic_prompt, ModelRequestload_dotenv()def web_search(query: str) -> str:    """公开搜索工具(未登录也能用)"""    return f"[公开搜索结果] {query}"class Context(TypedDict):    user_role: str@dynamic_promptdef user_role_prompt(request: ModelRequest) -> str:    """Generate system prompt based on user role."""    user_role = request.runtime.context.get("user_role""user")    base_prompt = "You are a helpful assistant."    if user_role == "expert":        return f"{base_prompt} Provide detailed technical responses."    elif user_role == "beginner":        return f"{base_prompt} Explain concepts simply and avoid jargon."    return base_promptllm = ChatTongyi(    model="qwen-flash",    dashscope_api_key=os.getenv("DASHSCOPE_API_KEY"),    temperature=0.1)agent = create_agent(    model=llm,    tools=[web_search],    middleware=[user_role_prompt],    context_schema=Context)# The system prompt will be set dynamically based on contextresult = agent.invoke(    {"messages": [{"role""user""content""Explain machine learning"}]},    context={"user_role""expert"})print(result)