LangChain 智能体开发框架
测吧(北京)科技有限公司
霍格沃兹测试开发学社
LangChain
LangChain 是一个由大型语言模型 (LLM) 驱动的应用程序开发框架。主要为开发者提供一个简单易用的接口来构建基于大语言模型的应用。LangChain = Language + Chains

LangChain 的生态架构
- LangChain 核心
- LangChain 社区生态
- LangChain 智能体
- Templates 提示词模板
- LangServe 服务运行框架
- LangSmith 监控分析工具
- LangGraph 智能体开发框架

开源 OSS VS 商业 Commercial
不推荐使用官方的商业方案。因为很多服务都在海外,访问会不方便。推荐使用开源替代。
\
- FastApi 代替 LangServe
- Jaeger 代替 LangSmith
- 本地提示词 代替 Prompt Hub

Jaeger VS LangSmith


为什么需要学习 LangChain
- 功能强大,接口简约,架构设计非常先进
- 文档丰富,工具齐全,示例丰富
- 生态丰富,最早最流行的 LLM 开发框架,很多成熟的项目基于 LangChain
同类智能体框架

主要框架介绍
| 框架 | 简介 | 优势 |
|---|---|---|
| LangChain | 模块化、"链式"结构(Chains) | 灵活性最强、生态系统成熟、社区庞大、模型无关性好、易于集成各种工具和数据库 |
| LangGraph | 基于图的流程编排(Graph-based) | 明确的流程控制(节点和边)、支持循环和分支、方便调试和高级错误处理。 |
| LlamaIndex | RAG(检索增强生成)与 Agent 结合 | 专注于数据索引和检索,能高效地为 Agent 注入大量外部数据知识。 |
| CrewAI | 基于角色的多智能体协作(Role-based Crew) | 强调角色(Role)、任务(Task)和团队(Crew)的结构化,易于创建并行的、有记忆的工作流程。 |
| AutoGen (Microsoft) | 多智能体聊天(Multi-Agent Conversation) | 大厂出品 |
| Google ADK | 强调多智能体协作 | 大厂出品 |
| Pydantic.AI | 类型化 将 FastAPI 的感觉带入 GenAI 应用程序和代理开发。 | 技术特色强 mcp a2a ag-ui |
{.!text-xs}
热门 Agent 框架对比
LangChain 核心能力
- Chat models
- Messages
- Prompt templates
- Example selectors
- LLMs
- Output parsers
{}
- Document loaders
- Text splitters
- Embedding models
- Vector stores
- Retrievers
- Indexing
{}
- Tools
- Multimodal
- Agents
- Callbacks
- Custom
- Serialization
大模型调用
基本的大模型调用,发起一次请求。增加了一行代码初始化模型的能力。简化大模型的使用。
from langchain.chat_models import init_chat_model
from langchain_ollama import ChatOllama
def test_llm():
llm = init_chat_model("openai:gpt-4.1")
llm.invoke('北京天气如何')
def test_llm_oop():
llm = ChatOllama(model='qwen3', base_url='http://127.0.0.1', temperature=0)
llm.invoke('北京天气如何')
智能体 Demo
graph TD
%% Outside the agent
QUERY([query])
LLM{thought}
TOOL(tools)
ANSWER([answer])
%% Main flows (no inline labels)
QUERY --> LLM
LLM --"action"--> TOOL
TOOL --"observation"--> LLM
LLM --"finish"--> ANSWER
{.bg-white}
# pip install -qU "langchain[openai]" to call the model
from langchain.agents import create_agent
from langchain_core.globals import set_debug
set_debug(True)
def get_weather(city: str) -> str:
"""查询特定城市天气"""
return f"{city} 总是晴天!"
agent = create_agent(
model="openai:gpt-4",
tools=[get_weather],
prompt="你是一位乐于助人回答简洁高效的助手",
)
# Run the agent
agent.invoke(
{"messages": [{"role": "user", "content": "北京天气如何"}]}
)
{.!grow-2}
对接 MCP
mcp 与 openapi 是当下主流的 2 类工具注册协议。langchain 通过扩展支持 mcp。
\
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
client = MultiServerMCPClient(
{
"math": {
"transport": "stdio", # Local subprocess communication
"command": "python",
# Absolute path to your math_server.py file
"args": ["/path/to/math_server.py"],
},
"weather": {
"transport": "streamable_http", # HTTP-based remote server
# Ensure you start your weather server on port 8000
"url": "http://localhost:8000/mcp",
}
}
)
tools = await client.get_tools()
agent = create_agent(
"anthropic:claude-3-7-sonnet-latest",
tools
)
math_response = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what's (3 + 5) x 12?"}]}
)
weather_response = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what is the weather in nyc?"}]}
)
RAG

{.!grow-2}
import requests
from langchain_core.tools import tool
from langchain.chat_models import init_chat_model
from langchain.agents import create_agent
@tool
def fetch_url(url: str) -> str:
"""Fetch text content from a URL"""
response = requests.get(url, timeout=10.0)
response.raise_for_status()
return response.text
system_prompt = """\
Use fetch_url when you need to fetch information from a web-page; quote relevant snippets.
"""
agent = create_agent(
model=init_chat_model("ollama:qwen3"),
tools=[fetch_url], # A tool for retrieval
prompt=system_prompt,
)
文档处理

{.!grow-2}
loader_multiple_pages = WebBaseLoader(
["https://www.example.com/", "https://google.com"]
)
docs = loader.load()
# docs[0]输出
Document(metadata={'source': 'https://www.example.com/', 'title': 'Example Domain', 'language': 'No language found.'}, page_content='\n\n\nExample Domain\n\n\n\n\n\n\n\nExample Domain\nThis domain is for use in illustrative examples in documents.')
文档分割
url = "https://plato.stanford.edu/entries/goedel/"
headers_to_split_on = [
("h1", "Header 1"),
("h2", "Header 2"),
("h3", "Header 3"),
("h4", "Header 4"),
]
html_splitter = HTMLHeaderTextSplitter(headers_to_split_on)
# for local file use html_splitter.split_text_from_file(<path_to_file>)
html_header_splits = html_splitter.split_text_from_url(url)
嵌入模型
flowchart LR
subgraph "📥 Indexing phase (store)"
A[📄 Documents] --> B[🔢 Embedding model]
B --> C[🔘 Embedding vectors]
C --> D[(Vector store)]
end
subgraph "📤 Query phase (retrieval)"
E[❓ Query text] --> F[🔢 Embedding model]
F --> G[🔘 Query vector]
G --> H[🔍 Similarity search]
H --> D
D --> I[📄 Top-k results]
end
\
from langchain_ollama import OllamaEmbeddings
embeddings = OllamaEmbeddings(model="llama3")
embeddings.embed_query("Hello, world!")
向量存储
from pprint import pprint
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_ollama import OllamaEmbeddings
embeddings = OllamaEmbeddings(model="qwen3-embedding")
vector_store = InMemoryVectorStore(embedding=embeddings)
vector_store.add_texts(
texts=[
'hello world',
'你好世界',
'你好思寒',
'hello',
'无关内容',
]
)
r = vector_store.similarity_search_with_score('hello', k=5)
pprint(r, indent=4)
## 输出
[ ( Document(id='a7060a7b-001f-472c-8672-07a523e81075', metadata={}, page_content='hello'),
1.0000000000000002),
( Document(id='62a1aa51-77a9-4e41-8180-d2bf29d28b14', metadata={}, page_content='hello world'),
0.888996099744812),
( Document(id='8987e305-c768-404e-a22b-c13ffadb1529', metadata={}, page_content='你好世界'),
0.7463448647547312),
( Document(id='640b4476-2403-442e-93e1-aebb7db812eb', metadata={}, page_content='你好思寒'),
0.6466733291467462),
( Document(id='59dc9c5d-3f0a-49fe-a3b5-657b513cd668', metadata={}, page_content='无关内容'),
0.3365601380500021)]
多智能体
graph LR
A[User] --> B[Controller Agent]
B --> C[Tool Agent 1]
B --> D[Tool Agent 2]
C --> B
D --> B
B --> E[User Response]
{.bg-white}
\
graph LR
A[User] --> B[Agent A]
B --> C[Agent B]
C --> A
{.bg-white}
from langchain.tools import tool
from langchain.agents import create_agent
subagent1 = create_agent(..)
@tool(
name="subagent1_name",
description="subagent1_description"
)
def call_subagent1(query: str):
result = subagent1.invoke({
"messages": [{"role": "user", "content": query}]
})
return result["messages"].text
agent = create_agent(..., tools=[call_subagent1])
{.!grow-1}
软件测试智能体
Agent 智能体核心元素
- LLM chatgpt qwen deepseek
- Planning:规划 路由 ReAct
- Parser:结构化输出解析 json
- Tools:工具集合与调用能力 tool function mcp
- Memory 短期/长期 知识图谱

利用 Agent 根据任务进行探索测试
- Web 自动化测试智能体
- App 自动化测试智能体
- 接口自动化测试智能体
- 通用自动化智能体(MCP)

Web 自动化 Agent
App 自动化 Agent

{.!grow-3}
{.!grow-4}
智能化测试平台演示
AI 爬虫实现自动探索并创建知识图谱
官方文档
- 课程中会用到不同版本,整体差异并不大
- 录播视频优先使用稳定版本
- 直播授课优先使用最新版本
- 1.0 版本,更加规范,丢失了一些老版本的细节文档
- 0.3 版本,更加规范,丢失了一些老版本的细节文档
- 0.1 版本,内容很详细,有很多底层知识
{.!text-sm}
