RAG(检索增强生成)型智能问答机器人,已成为测试与知识管理领域的热门工具。LangChain 和 LangGraph 提供了灵活的开发能力,帮助你轻松构建多轮对话、知识检索和业务自动化应用。本篇专为测试工程师,系统讲解实际代码中涉及的 LangChain 和 LangGraph 主要方法和应用场景,并对文档拆解与向量化做适当扩展。
一、文档加载与拆分
1. WebBaseLoader
作用:从网页地址加载网页正文内容,自动过滤无关元素。
常见用法:
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader(web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",))
docs = loader.load() # 返回 Document 列表
场景举例:
- 测试工具知识收集:自动抓取 Selenium、Postman 等工具的官方文档,构建本地知识库。
- 缺陷模式分析:周期性抓取 JIRA 中的缺陷描述,辅助测试团队发现高频问题。
通俗例子:
假设你负责测试一个电商平台,需要快速了解 Selenium 的最新 API 用法。通过 WebBaseLoader
加载 Selenium 官方文档链接,即可将关键章节内容导入到你的 RAG 系统中,后续通过提问“如何用 Selenium 实现多浏览器兼容测试?”直接获取答案。
2. RecursiveCharacterTextSplitter
作用:将长文档智能拆分为适合大模型检索的小块(chunk),保证语义连续性和检索效果。
常见用法:
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
参数解释:
chunk_size
:每块最大字符数,太大检索慢,太小丢上下文,一般500~1500合适。chunk_overlap
:块之间重叠部分,避免重要信息被切断。
扩展技巧:
- 自定义拆分规则:对 Markdown 技术文档,按标题、代码块、段落拆分,提升检索精度。
- 测试用例优化:针对跨块的测试用例描述(如前置条件+操作步骤+预期结果),设置
chunk_overlap=200
保留上下文。
通俗例子:
假设你有一份 5000 字的 API 测试用例文档,使用 chunk_size=800
和 chunk_overlap=100
拆分后,会生成 7 个块,每个块包含部分测试步骤。当用户问“如何测试登录接口的异常码?”时,系统能精准定位到包含“401 Unauthorized”描述的块。
二、文本向量化与向量库管理
3. OpenAIEmbeddings
作用:将文本转为向量,支持后续相似度搜索。
常见用法:
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
应用场景:
- 测试用例检索:将历史测试用例向量化,支持语义搜索(如“如何测试支付接口的超时重试?”)。
- 缺陷模式匹配:将缺陷描述向量化,自动关联历史相似缺陷的解决方案。
通俗例子:
当测试人员输入“用户无法完成支付”,系统通过向量化匹配历史缺陷库中的“支付失败,提示网络异常”,推荐修复方案:“检查网络超时配置”。
4. InMemoryVectorStore
作用:简易内存型向量数据库,适合小型演示和本地实验。
常见用法:
from langchain_core.vectorstores import InMemoryVectorStore
vector_store = InMemoryVectorStore(embeddings)
vector_store.add_documents(documents=splits)
生产级替代方案:
- FAISS:适合中等规模数据(万级文档)。
- Milvus:支持 PB 级数据,适合企业级测试知识库。
通俗例子:
在 CI/CD 流程中,用 InMemoryVectorStore
快速搭建测试用例检索系统,开发人员提交代码时自动查询“该功能已有的测试用例”,避免重复编写。
5. similarity_search
作用:根据向量相似度检索与查询最接近的文档块
常见用法:
results = vector_store.similarity_search("How does task decomposition work?", k=2)
参数说明:
k
:最多返回前k个最相似的文档
应用场景:
- 缺陷根因分析:当测试人员遇到“数据库连接超时”问题时,系统检索历史类似问题的解决方法。
- 测试用例复用:根据需求描述,推荐已有的测试用例。
通俗例子:
测试人员提问“如何验证注册接口的手机号格式?”,系统返回包含“正则表达式校验手机号”和“边界值测试”的文档块,节省编写新用例的时间。
三、LangGraph对话流程管理
6. MessagesState
作用:统一管理多轮对话历史,包括用户消息、AI回复、工具调用、检索结果等。
常见用法:
from langgraph.graph import MessagesState
# 内部维护一个消息列表,自动追加,每步可读取历史
应用场景:
- 多轮测试咨询:用户问“如何测试支付功能?”,AI 逐步引导用户明确需求、环境、用例设计。
- 缺陷复盘:自动关联当前缺陷与历史类似问题的解决过程。
通俗例子:
用户问“我的登录测试失败了”,AI 通过 MessagesState
记录上下文,后续提问“是否检查过数据库凭证?”或“是否模拟过弱网环境?”。
7. StateGraph
作用:定义对话流程图(节点+边),像搭积木一样管理多步业务逻辑。
常见用法:
from langgraph.graph import StateGraph
graph_builder = StateGraph(MessagesState)
graph_builder.add_node(query_or_respond)
graph_builder.add_node(tools)
graph_builder.add_node(generate)
# ...配置边和流程
graph = graph_builder.compile()
通俗例子:
构建一个测试流程助手:
- 用户提问:“如何测试搜索功能?”
- 工具调用:检索测试用例库中的“搜索功能测试用例”。
- 生成答案:结合检索结果,输出测试步骤和注意事项。
- 多轮交互:用户确认后,生成测试脚本模板。
8. ToolNode 与 @tool 装饰器
作用:将Python工具函数(如知识检索、API调用等)包装成对话节点,供LLM主动调用。
常见用法:
from langchain_core.tools import tool
from langgraph.prebuilt import ToolNode
@tool(response_format="content_and_artifact")
def retrieve(query: str):
# ...检索逻辑
return result
tools = ToolNode([retrieve])
应用场景:
- 测试用例检索:自动查找已有的测试用例。
- CI/CD 集成:调用 Jenkins 接口触发测试任务。
通俗例子:
用户提问“运行冒烟测试”,系统调用 ToolNode
中的 Jenkins API 节点,触发 CI 流水线,并返回构建状态。
9. SystemMessage
作用:赋予AI角色、规则或行为指令,影响每步生成风格和业务规范。
常见用法:
from langchain_core.messages import SystemMessage
system_msg = SystemMessage("You are an assistant for question-answering tasks. Use the following context...")
应用场景:
- 统一输出格式:要求 AI 输出测试用例时包含前置条件、操作步骤、预期结果。
- 安全规范:禁止 AI 提供不安全的测试建议(如暴力破解)。
通俗例子:
设置 SystemMessage
指令:“请输出测试用例时,必须包含用例编号、优先级、测试步骤。”,确保 AI 生成的用例符合团队规范。
10. 流式输出与调试
作用:逐步输出每个对话节点结果,实时观察生成和检索过程。
常见用法:
for step in graph.stream(
{"messages": [{"role": "user", "content": input_message}]},
stream_mode="values",
):
step["messages"][-1].pretty_print()
应用场景:
- 调试复杂流程:观察 AI 在检索、生成、工具调用各阶段的表现。
- 质量追溯:记录 AI 推理路径,便于分析错误原因。
通俗例子:
当 AI 生成的测试用例不符合预期时,通过流式输出查看哪些文档块被检索到,判断是否是切分或向量化问题。
四、文档拆解与向量化扩展建议
技术文档拆分策略
- API 文档:按接口路径(如
/login
)拆分,确保每个接口独立。 - 测试用例库:按用例编号(如 TC-001)拆分,避免跨用例信息丢失。
- 缺陷报告:按缺陷 ID 拆分,便于关联历史解决方案。
多源异构数据处理
- Excel/CSV:用 Pandas 读取后转为文本。
- PDF:用 PyPDF2 提取文本,处理表格时保留结构。
- 图片:OCR 转文本后,结合上下文补充说明。
向量化效果优化
- 定期更新:增量同步新文档,避免知识过时。
- 评估指标:用 MRR(Mean Reciprocal Rank)衡量检索精度,优化切分策略。
五、实战Tips与常见误区
1. 块大小与重叠设置
- 错误案例:某团队设置
chunk_size=2000
,导致大模型检索时频繁遗漏关键步骤。 - 解决方案:通过 A/B 测试调整参数,使用
chunk_overlap=200
保留上下文。
2. 向量库选择
- 错误案例:某项目用
InMemoryVectorStore
存储 10 万条测试用例,导致内存溢出。 - 解决方案:切换至 FAISS 或 Milvus,支持持久化存储。
3. SystemMessage 的滥用
- 错误案例:某团队在
SystemMessage
中写入过多规则,导致 AI 生成速度变慢。 - 解决方案:仅保留核心规则(如输出格式),复杂逻辑通过工具调用实现。
4. 工具调用链设计
- 错误案例:某系统将所有工具集中调用,导致 AI 无法判断优先级。
- 解决方案:用
StateGraph
明确流程(如先检索、再调用 API、最后生成答案)。
5. 流式调试的重要性
- 错误案例:某团队忽略流式输出,导致无法定位 AI 生成错误的原因。
- 解决方案:在开发阶段强制使用流式调试,记录每一步的输入输出。
六、结语
掌握 LangChain & LangGraph 这些核心方法,测试工程师不仅能构建强大的智能问答和知识检索助手,还能把 AI 能力嵌入到测试流程的每个环节,让你的团队在自动化、智能化道路上快人一步!
建议:
- 从小规模开始:用 10 个测试用例或 5 个缺陷描述搭建原型,验证效果。
- 持续迭代优化:根据实际需求调整文档切分策略、向量化模型和对话流程。
- 结合团队规范:将
SystemMessage
与团队的测试标准、安全要求深度绑定。
最终目标:
通过 RAG 系统,让测试工程师从重复的文档检索、用例编写中解放出来,专注于复杂问题分析和测试策略设计。