LangChain+LangGraph+MCP智能体与工作流开发知识点全整理
函数装饰器(@tool):最简单方式,示例:from langchain_core.tools import tool@tool"""两数相加的计算器工具"""Runnable对象转换:通过as_tool()将LangChain Runnable转为工具,示例:from langchain_core.runnables import RunnableLambda# 定义Runnable。
·
LangChain+LangGraph+MCP智能体与工作流开发知识点全整理
一、大模型选择与私有化部署
1. 主流大模型特性与选型
(1)核心推荐模型
| 模型系列 | 关键型号 | 核心特性 | 适用场景 |
|---|---|---|---|
| DeepSeek | DeepSeek-V3、DeepSeek-R1 | 支持思维链(reasoning_content)输出,API最大上下文64K,支持Function Calling/JSON Output | 复杂逻辑推理、代码生成、多轮对话 |
| Qwen3(通义千问) | Qwen3-235B-A22B(MoE)、Qwen3-30B-A3B、Qwen3-8B | 覆盖0.6B-235B参数量级,支持MoE与Dense两种架构;思维/非思维模式切换;支持119种语言;Agent能力增强(MCP支持) | 企业级应用、多模态处理、大参数量需求场景 |
| 其他主流模型 | GPT-4o、Claude-3.7-Sonnet、Gemini-1.5 | 闭源模型,功能全面(多模态、长上下文),但需依赖第三方API,私有化成本高 | 无需私有化、追求极致效果的场景 |
(2)模型关键参数对比(以Qwen3为例)
- Qwen3-235B-A22B:总参数量2350亿,激活参数量220亿,编码/数学/通用能力对标GPT-o1、DeepSeek-R1
- Qwen3-30B-A3B:小型MoE模型,激活参数量30亿(为Qwen3-32B的10倍)
- 小型模型(Qwen3-4B/8B):Qwen3-4B性能接近Qwen2.5-72B-Instruct,适合资源受限场景
2. 私有化部署方案
(1)部署工具选型:vLLM vs Ollama
| 对比维度 | Ollama | vLLM |
|---|---|---|
| 定位 | 轻量化本地部署(个人/原型验证) | 高性能推理框架(企业级生产环境) |
| 安全风险 | 默认无鉴权(11434端口暴露风险) | 支持APIKey鉴权、SSL配置,安全性更高 |
| 并发能力 | 有限(单会话/少量并发) | 支持Continuous Batching,高吞吐低延迟 |
| 硬件要求 | 支持CPU/GPU(最低16GB内存) | 强制GPU(NVIDIA Tesla系列),显存要求高 |
| 模型格式支持 | GGUF格式 | HuggingFace格式(.bin/.safetensors) |
| 生产环境推荐度 | 不推荐(安全/并发短板) | 推荐(企业级特性完善) |
(2)vLLM部署关键步骤
- 模型下载:通过ModelScope下载(推荐Qwen3系列),代码示例:
from modelscope import snapshot_download # 下载Qwen3-8B到指定目录 model_dir = snapshot_download('Qwen/Qwen3-8B', cache_dir='/root/autodl-tmp/models', revision='master') - vLLM安装:
pip install vllm - 核心部署命令(以Qwen3-8B为例):
python -m vllm.entrypoints.openai.api_server \ --model /root/autodl-tmp/models/Qwen/Qwen3-8B \ --served-model-name qwen3-8b \ --max-model-len 8k \ --host 0.0.0.0 \ --port 6006 \ --dtype bfloat16 \ --gpu-memory-utilization 0.8 \ --enable-auto-tool-choice \ --tool-call-parser hermes \ --enable-reasoning \ --reasoning-parser deepseek_r1 - API调用示例(OpenAI SDK兼容):
from openai import OpenAI client = OpenAI(api_key="EMPTY", base_url="http://localhost:6006/v1") response = client.chat.completions.create( model="qwen3-8b", messages=[{"role":"user", "content":"介绍大语言模型的核心原理"}], temperature=0.7, max_tokens=8192 ) print(response.choices[0].message.content)
(3)部署辅助工具
- 显存计算器:LlamaFactory显存估算工具,提前评估模型所需显存
- 镜像加速:HuggingFace镜像站(https://hf-mirror.com/),解决模型下载慢问题
二、新版LangChain应用开发
1. LangChain核心架构与组件
(1)三大核心包
| 包名 | 核心作用 | 依赖特点 |
|---|---|---|
| langchain-core | 定义基础抽象(LLM、向量存储、检索器接口),无第三方集成 | 轻量级,依赖极少 |
| langchain | 提供通用链、Agent、检索策略(非第三方集成) | 核心逻辑层,不绑定具体工具 |
| langchain-community | 社区维护的第三方集成(LLM、向量数据库、工具) | 依赖可选,按需引入 |
(2)核心功能模块
- 大模型连接:统一封装第三方LLM接口,支持标准化参数(
model/temperature/max_tokens等),示例:from langchain_openai import ChatOpenAI # 连接私有化部署的Qwen3 llm = ChatOpenAI( model='qwen3-8b', base_url="http://localhost:6006/v1", api_key="EMPTY", temperature=0.8 ) - 提示词模板(Prompt Template):分两类
- 字符串模板:适用于简单输入,示例:
from langchain_core.prompts import PromptTemplate template = PromptTemplate.from_template("生成关于{topic}的300字介绍") prompt = template.invoke({"topic": "人工智能"}) - 聊天模板:适用于多轮对话,支持系统/用户/助手消息,示例:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder template = ChatPromptTemplate.from_messages([ ("system", "你是专业的技术顾问"), MessagesPlaceholder("chat_history"), # 历史消息占位符 ("user", "{input}") ])
- 字符串模板:适用于简单输入,示例:
- 输出解析器(结构化输出):三种核心方式
with_structured_output():基于Pydantic定义结构,示例:from pydantic import BaseModel, Field class Joke(BaseModel): setup: str = Field(description="笑话铺垫") punchline: str = Field(description="笑话笑点") # 绑定结构化输出 runnable = llm.with_structured_output(Joke) result = runnable.invoke("生成关于程序员的笑话")SimpleJsonOutputParser:强制输出JSON格式,示例:from langchain_core.output_parsers import SimpleJsonOutputParser prompt = ChatPromptTemplate.from_template("输出JSON:{{'answer':'{question}的答案','followup':'后续问题'}}") chain = prompt | llm | SimpleJsonOutputParser() result = chain.invoke({"question":"地球自转周期"})- 工具调用(
bind_tools()):通过工具定义结构化输出,示例:class WeatherResponse(BaseModel): city: str = Field(description="城市名") temp: float = Field(description="温度") # 绑定工具 runnable = llm.bind_tools([WeatherResponse]) response = runnable.invoke("查询北京今天的温度") print(response.tool_calls[-1]['args']) # 提取结构化结果
2. RAG(检索增强生成)核心模块
(1)Embedding模型选型与部署
-
主流开源模型对比
模型 研发机构 向量维度 语言支持 开源协议 核心优势 BGE-Large-zh-v1.5 北京智源 1024 中英文(中文优) MIT 中文语义理解强,适合中文RAG场景 GTE-Large 阿里巴巴 1024 多语言 部分商用授权 多语言扩展性好,支持8k长上下文 Qwen3-Embedding 阿里云 768/1024 119种语言 Apache 2.0 与Qwen3生态兼容,多模态支持 -
私有化部署示例(BGE-Large):
from langchain.embeddings import HuggingFaceBgeEmbeddings model = HuggingFaceBgeEmbeddings( model_name="BAAI/bge-large-zh-v1.5", model_kwargs={'device': 'cuda'}, # GPU加速 encode_kwargs={'normalize_embeddings': True}, # 归一化(便于余弦相似度计算) query_instruction="为这个句子生成表示以用于检索相关文章:" # 查询指令(提升检索精度) )
(2)向量数据库选型
| 数据库 | 核心特点 | 适用场景 |
|---|---|---|
| Chroma | 轻量级,支持DuckDB/ClickHouse存储,Python/JS SDK完善 | 快速原型、中小规模数据(百万级向量) |
| FAISS | Facebook开源,支持GPU加速,适合高维向量快速检索 | 大规模数据(亿级向量),需自行管理存储 |
| Milvus | 分布式架构,支持水平扩展,提供完整的向量搜索服务(索引、备份、监控) | 企业级生产环境,高并发检索需求 |
(3)RAG完整流程
- 数据预处理:文档加载(PDF/Word)→ 文本切片(按语义分割,如500token/片)→ 向量化(Embedding模型)
- 向量存储:将向量写入数据库(如Chroma),示例:
from langchain.vectorstores import Chroma # 向量化文档并写入Chroma vector_db = Chroma.from_texts( texts=document_chunks, # 文本切片列表 embedding=model, # Embedding模型 persist_directory="./chroma_db" # 持久化目录 ) - 检索与生成:用户查询→向量化→相似度匹配(Top-K)→ 拼接上下文→LLM生成答案,示例:
# 检索相似文档(Top3) retriever = vector_db.as_retriever(search_kwargs={"k": 3}) # 构建RAG链 from langchain.chains import RetrievalQA rag_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", # 上下文拼接方式 retriever=retriever ) # 执行查询 result = rag_chain.run("介绍LangChain的核心组件")
三、基于LangGraph的Agent开发
1. Agent核心概念与定位
- 定义:具备“推理+工具调用”能力的智能体,通过LLM自主规划任务、调用工具、迭代执行,直至完成目标。
- 与Workflow的区别:
类型 核心逻辑 灵活性 Workflow 预定义代码路径,按固定流程执行(如“步骤1→步骤2→步骤3”) 低,需手动修改流程 Agent 动态推理决策,根据实时上下文调整工具调用与流程(如“需查询天气→调用天气工具→根据结果生成建议”) 高,自主适应场景 - LangGraph中Agent的本质:Agent是StateGraph中的一个节点,通过
create_react_agent快速创建,示例:from langgraph.prebuilt import create_react_agent # 定义工具 def get_weather(city: str) -> str: return f"{city}今日天气晴朗,温度25℃" # 创建Agent agent = create_react_agent(llm=llm, tools=[get_weather], prompt="你是贴心的天气助手") # 执行Agent response = agent.invoke({"messages": [{"role": "user", "content": "查询上海天气"}]})
2. LangGraph本地服务搭建
(1)环境准备(Python≥3.11)
- 创建虚拟环境:
pip install virtualenv virtualenv langgraph-env # 激活环境(Windows):langgraph-env\Scripts\activate # 激活环境(Linux/Mac):source langgraph-env/bin/activate - 安装LangGraph CLI:
pip install --upgrade "langgraph-cli[inmem]"
(2)服务搭建步骤
- 创建LangGraph应用:
langgraph new my-agent-app --template new-langgraph-project-python cd my-agent-app - 安装依赖:
pip install -e .(编辑模式,支持本地代码修改) - 修改核心逻辑(graph.py):
from langchain_openai import ChatOpenAI from langgraph.prebuilt import create_react_agent # 连接私有化Qwen3 llm = ChatOpenAI( model='qwen3-8b', base_url="http://localhost:6006/v1", api_key="EMPTY" ) # 定义工具 def get_weather(city: str) -> str: return f"{city}今日天气:晴朗,25℃" # 构建Agent图 graph = create_react_agent(llm=llm, tools=[get_weather]) - 启动服务:
langgraph dev(默认端口2024) - 测试服务(Python SDK):
from langgraph_sdk import get_sync_client client = get_sync_client(url="http://localhost:2024") # 发送请求 for chunk in client.runs.stream( None, # 无线程ID(单次请求) "agent", # 助手ID(langgraph.json配置) input={"messages": [{"role": "user", "content": "查询广州天气"}]} ): print(chunk.data)
3. Agent工具定义与上下文管理
(1)工具定义的三种方式
- 函数装饰器(@tool):最简单方式,示例:
from langchain_core.tools import tool @tool def calculator(a: int, b: int) -> int: """两数相加的计算器工具""" return a + b - Runnable对象转换:通过
as_tool()将LangChain Runnable转为工具,示例:from langchain_core.runnables import RunnableLambda # 定义Runnable weather_runnable = RunnableLambda(lambda city: f"{city}天气:25℃") # 转为工具 weather_tool = weather_runnable.as_tool(name="get_weather", description="查询城市天气") - BaseTool子类化:最灵活,支持自定义参数校验与异常处理,示例:
from langchain_core.tools import BaseTool from pydantic import BaseModel, Field # 定义工具参数模型 class SearchArgs(BaseModel): query: str = Field(description="搜索关键词") # 自定义工具 class SearchTool(BaseTool): name = "search_tool" description = "搜索互联网公开信息" args_schema = SearchArgs def _run(self, query: str) -> str: # 调用搜索API逻辑(示例) return f"搜索结果:{query}的相关信息..."
(2)上下文与记忆管理
- 短期记忆(会话级):通过
Checkpointer保存会话状态,支持多轮对话,示例:from langgraph.checkpoint.memory import InMemorySaver # 开发环境:内存存储 checkpointer = InMemorySaver() # 生产环境:Postgres/Redis存储 # from langgraph.checkpoint.postgres import PostgresSaver # checkpointer = PostgresSaver.from_conn_string("postgresql://user:pass@localhost:5432/db") # 创建带记忆的Agent agent = create_react_agent(llm=llm, tools=[get_weather], checkpointer=checkpointer) # 带线程ID执行(保持会话上下文) config = {"configurable": {"thread_id": "user-123"}} response1 = agent.invoke({"messages": [{"role": "user", "content": "查询北京天气"}], config=config) response2 = agent.invoke({"messages": [{"role": "user", "content": "那上海呢"}], config=config) # 保留历史对话 - 长期记忆(跨会话):通过
Store存储用户偏好/历史数据,示例:from langgraph.store.memory import InMemoryStore # 开发环境:内存存储 store = InMemoryStore() # 生产环境:Redis/Postgres存储 # from langgraph.store.redis import RedisStore # store = RedisStore.from_conn_string("redis://:pass@localhost:6379") # 存储用户偏好 store.put("user-123", "preference", "喜欢简洁的天气播报") # 读取用户偏好 preference = store.get("user-123", "preference")
四、MCP(Model Context Protocol)开发
1. MCP核心概念与价值
- 定义:2024年由Anthropic推出的开放协议,统一LLM与外部数据源/工具的通信标准,解决“数据孤岛”问题,支持本地/远程数据交互。
- 与Function Calling的核心区别:
维度 MCP(协议) Function Calling(功能) 性质 通用通信标准 模型调用工具的机制 适用范围 多数据源/工具/系统(LLM、应用均可对接) 单一模型与工具的交互 复用性 一次开发,多场景复用 需为每个任务单独开发函数 灵活性 支持动态扩展与适配 功能扩展需额外开发
2. MCP工作原理与通信机制
(1)核心架构(客户端-服务器-资源)
- 客户端:发起请求(如LLM/Agent),维护与服务器的1:1连接
- 服务器:转发请求至资源,控制访问权限,返回处理结果
- 资源:实际提供服务的组件(数据库、工具、API等)
(2)三种通信机制
| 机制 | 核心特点 | 适用场景 |
|---|---|---|
| stdio(本地) | 基于标准输入输出,适用于本地工具交互 | 本地部署的轻量工具(如本地文件读取) |
| SSE(远程) | 基于HTTP的单向流,服务器实时推送数据 | 需实时通知的场景(如任务进度更新) |
| Streamable-HTTP(推荐) | 统一HTTP端点(支持POST/GET),简化通信模型,支持无状态/有状态模式 | 企业级生产环境,高可扩展性需求 |
3. FastMCP(Python MCP服务器实现)
(1)环境安装
pip install langchain-mcp-adapters # LangChain与MCP适配
pip install fastmcp # FastMCP核心库
(2)核心功能与认证
- 认证机制:基于JWT(Bearer Token),流程如下:
- 生成RSA密钥对:
from fastmcp.auth import RSAKeyPair key_pair = RSAKeyPair.generate() # 生成公钥/私钥 - 配置认证提供方:
from fastmcp.auth import BearerAuthProvider auth = BearerAuthProvider( public_key=key_pair.public_key, issuer="http://localhost:8000", # 签发方 audience="mcp-server" # 目标服务标识 ) - 生成Token(服务器端):
token = key_pair.create_token( subject="user-123", # 用户ID scopes=["tool:read", "tool:write"], # 权限范围 expires_in_seconds=3600 # 1小时过期 ) - 客户端携带Token请求:
import requests headers = {"Authorization": f"Bearer {token}"} response = requests.post("http://localhost:8000/mcp/request", headers=headers, json={"query": "查询天气"})
- 生成RSA密钥对:
五、基于LangGraph的WorkFlow开发
1. StateGraph核心概念(图结构)
LangGraph的WorkFlow基于有向图(Directed Graph) 实现,核心三要素:
(1)State(状态)
- 图的共享数据结构,通常用
TypedDict或Pydantic BaseModel定义,支持reducer函数(控制状态更新方式),示例:from typing_extensions import TypedDict from langgraph.graph.message import add_messages # 定义状态(含消息历史与额外字段) class State(TypedDict): messages: Annotated[list, add_messages] # 消息历史(add_messages:追加而非覆盖) documents: list[str] # 额外字段(文档列表) - Reducer函数:控制状态更新逻辑,常用
add_messages(消息追加)、operator.add(列表拼接)。
(2)Node(节点)
- 执行具体逻辑的Python函数(同步/异步),输入为当前State,输出为更新后的State,示例:
# 定义“生成笑话”节点 def generate_joke(state: State) -> dict: prompt = f"生成关于{state['topic']}的笑话" response = llm.invoke(prompt) return {"messages": [{"role": "assistant", "content": response.content}]} # 添加节点到图 from langgraph.graph import StateGraph builder = StateGraph(State) builder.add_node("generate", generate_joke) # 节点名:"generate",节点逻辑:generate_joke
(3)Edge(边)
- 定义节点间的路由关系,分两类:
- 普通边:固定路由(从节点A到节点B),示例:
from langgraph.graph import START, END builder.add_edge(START, "generate") # 从START到"generate"节点 - 条件边:根据State动态路由,示例:
# 路由函数:根据笑话是否幽默决定下一步 def route_joke(state: State) -> str: last_msg = state["messages"][-1]["content"] return "approve" if "幽默" in last_msg else "reject" # 添加条件边(从"evaluate"节点根据路由函数跳转) builder.add_conditional_edges( "evaluate", # 源节点 route_joke, # 路由函数 {"approve": END, "reject": "generate"} # 路由映射(批准→结束,拒绝→重新生成) )
- 普通边:固定路由(从节点A到节点B),示例:
2. 典型WorkFlow案例:笑话生成与评估流程
(1)流程设计
START → generate(生成笑话) → evaluate(评估) → 条件路由(approve→END / reject→generate)
(2)完整代码
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langchain_core.pydantic_v1 import BaseModel, Field
# 1. 定义状态
class State(TypedDict):
topic: str # 笑话主题
messages: list # 消息历史
is_funny: bool # 是否幽默(评估结果)
# 2. 定义评估结构化输出模型
class Evaluation(BaseModel):
is_funny: bool = Field(description="笑话是否幽默")
feedback: str = Field(description="改进建议")
# 3. 定义节点
def generate_joke(state: State) -> dict:
"""生成笑话节点"""
prompt = f"生成关于{state['topic']}的短笑话"
response = llm.invoke(prompt)
return {
"messages": [{"role": "assistant", "content": response.content}],
"topic": state["topic"]
}
def evaluate_joke(state: State) -> dict:
"""评估笑话节点"""
last_joke = state["messages"][-1]["content"]
# 结构化评估
evaluator = llm.with_structured_output(Evaluation)
result = evaluator.invoke(f"评估笑话:{last_joke}")
return {
"is_funny": result.is_funny,
"messages": [{"role": "system", "content": f"评估结果:{result.feedback}"}]
}
# 4. 定义路由函数
def route_evaluation(state: State) -> str:
return END if state["is_funny"] else "generate"
# 5. 构建并编译图
builder = StateGraph(State)
builder.add_node("generate", generate_joke)
builder.add_node("evaluate", evaluate_joke)
# 连接边
builder.add_edge(START, "generate")
builder.add_edge("generate", "evaluate")
builder.add_conditional_edges("evaluate", route_evaluation)
# 编译图
workflow = builder.compile()
# 6. 执行流程
result = workflow.invoke({"topic": "程序员", "messages": [], "is_funny": False})
print("最终笑话:", result["messages"][0]["content"])
六、实战项目方向
- 携程AI智能助手:集成多模态交互(语音/文本/图片)、行程规划工具、实时票务查询(对接12306 MCP服务)
- RAG企业知识库:基于BGE-Large+Milvus,实现企业文档(PDF/Word)的语义检索与问答
- TEXT2SQL+Qwen3:通过Qwen3的代码生成能力,将自然语言转为SQL,对接业务数据库实现数据查询
- 多智能体监督系统:基于langgraph-supervisor,构建中心监督Agent,协调多个专业Agent(天气查询、日程管理、文档分析)
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)