LangChain 是一个强大的框架,可以与向量数据库(如 Milvus)无缝集成,用于构建基于检索的增强生成(RAG)系统。在测试工程师的场景中,可以将测试资产(如需求文档、测试用例、缺陷报告等)存储在 Milvus 中,然后通过 LangChain 提供的检索功能快速查询和生成相关内容。
功能目标
- 存储测试资产:将需求文档、测试用例和缺陷记录等内容转换为向量表示并存储到 Milvus。
- 检索测试资产:根据用户输入的查询,快速检索相关内容。
- 集成生成模型:结合检索结果,生成测试用例或分析缺陷原因。
架构流程
-
文档预处理:
- 清理和分割文档。
- 将段落或内容片段转化为易于向量化的文本。
-
向量化:
- 使用嵌入模型(如 OpenAI 的
text-embedding-ada-002
或 Hugging Face 模型)将文本转化为向量。
- 使用嵌入模型(如 OpenAI 的
-
存储:
- 将向量及其元数据存储到 Milvus 向量数据库。
-
检索与生成:
- 根据用户查询,通过向量相似性搜索检索相关内容。
- 将检索结果与生成模型结合,生成响应。
示例代码:
1. 安装必要的依赖
首先确保安装了以下依赖库:
pip install langchain pymilvus openai sentence-transformers
2. 启动 Milvus
可以通过 Docker 快速启动 Milvus:
docker run -d --name milvus -p 19530:19530 -p 9091:9091 milvusdb/milvus:v2.2.9
2.1 Docker容器化部署(推荐)
-
环境准备
- 启用Windows子系统Linux(WSL)和虚拟机平台:
bash
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重启后安装Docker Desktop并启用WSL 2后端。 - 验证Docker安装:
bash
docker --version
docker-compose --version
- 启用Windows子系统Linux(WSL)和虚拟机平台:
-
获取并运行Milvus容器
- 拉取官方镜像:
bash
docker pull milvusdb/milvus:latest - 启动容器(映射端口19530和19121):
bash
docker run -d --name milvus -p 19530:19530 -p 19121:19121 milvusdb/milvus:latest
服务启动后,通过浏览器访问http://localhost:19121
验证。
- 拉取官方镜像:
-
持久化存储(可选)
- 挂载本地目录或使用Docker卷保存数据,避免容器删除后数据丢失。
2.2 预编译包部署(适合开发者)
-
下载二进制包
- 从GitHub仓库
matrixji/milvus
的windows-test-
版本中选择对应版本(如windows-test-v8
)。 - 或直接下载预编译的zip包(含
milvus.exe
、minio.exe
、etcd.exe
)。
- 从GitHub仓库
-
启动服务
- 解压zip包后依次运行:
bash
run_minio.bat 启动MinIO存储服务
run_etcd.bat 启动etcd元数据服务
run_milvus.bat 启动Milvus核心服务
- 解压zip包后依次运行:
-
测试连接
- 使用Python客户端验证:
python
from pymilvus import connections
connections.connect(host=‘localhost’, port=‘19530’)
- 使用Python客户端验证:
2.3 图形化界面(Attu)
-
安装Attu
- 下载Attu客户端(如
attu-2.4.6-windows-x86_64.zip
)并解压。 - 启动Attu:
bash
.\attu.exe
- 下载Attu客户端(如
-
连接Milvus
- 在Attu界面输入Milvus服务地址
http://localhost:19530
完成连接。
- 在Attu界面输入Milvus服务地址
注意事项
- 资源分配:Docker Desktop中可调整CPU/内存限制以满足性能需求。
- 防火墙设置:确保端口19530(API)和19121(Web)未被拦截。
- 版本兼容性:若使用旧版Milvus,需注意依赖库(如
pymilvus
)的兼容性。
3. 示例代码实现
(1) 初始化 Milvus
python">from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection# 连接到 Milvus
connections.connect("default", host="localhost", port="19530")# 定义 Milvus 的 schema
fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536), # 维度与嵌入模型匹配FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=1000)
]
schema = CollectionSchema(fields, "测试知识库存储需求")# 创建 Collection
collection_name = "test_knowledge_base"
collection = Collection(name=collection_name, schema=schema)
(2) 嵌入模型初始化
使用 Hugging Face 的嵌入模型将文本转化为向量。
python">from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter# 初始化 Hugging Face 嵌入模型
embedding_model = HuggingFaceEmbeddings(model_name="bert-base-chinese")# 文本分割器,确保文本块适合向量化
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
(3) 插入数据到 Milvus
将测试资产(文档、用例、缺陷记录)清洗后分割为小块,并存储到 Milvus 中。
python">def insert_data_to_milvus(collection, texts):"""将文本转换为向量并存储到 Milvus:param collection: Milvus Collection:param texts: 文本列表"""# 分割文本为小块chunks = text_splitter.split_text(texts)# 生成嵌入向量embeddings = embedding_model.embed_documents(chunks)# 插入到 Milvuscollection.insert([embeddings, chunks])# 示例:插入需求文档
test_document = """
用户可以通过系统完成账户注册。
注册时需要填写用户名、密码和邮箱,并完成邮箱验证。
如果邮箱已被注册,系统会提示“邮箱已被使用”。
注册完成后,用户可以登录账户。
"""
insert_data_to_milvus(collection, test_document)
(4) 检索数据
根据用户的查询,通过向量相似性搜索检索相关内容。
python">from langchain.vectorstores import Milvus
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA# 初始化 Milvus 向量存储
vector_store = Milvus(collection_name=collection_name,connection_args={"host": "localhost", "port": "19530"},embedding_function=embedding_model.embed_query
)# 检索相关内容
def retrieve_test_knowledge(query):"""检索相关的测试资产:param query: 用户查询:return: 检索结果"""# 检索相关内容results = vector_store.similarity_search(query, k=3)for i, result in enumerate(results, 1):print(f"结果 {i}: {result.page_content}")# 示例:检索与“邮箱验证”的相关内容
retrieve_test_knowledge("邮箱验证")
(5) 集成生成模型
结合生成模型(如 OpenAI GPT)与检索结果,生成测试工程师需要的内容。
python">from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI# 初始化生成模型
llm = ChatOpenAI(openai_api_key="your-openai-api-key", temperature=0)# 构建 RetrievalQA
qa_chain = RetrievalQA.from_chain_type(llm=llm,retriever=vector_store.as_retriever(),return_source_documents=True
)# 用户查询
query = "如何设计邮箱验证的测试用例?"
response = qa_chain.run(query)
print("生成的测试用例建议:")
print(response)
4. 参考链接
以下是一些可以参考的资源和文档:
- LangChain 官方文档:
- LangChain Documentation
- Milvus 官方文档:
- Milvus Documentation
- OpenAI 嵌入模型:
- OpenAI Embedding Models
- 向量数据库概览:
- 向量数据库介绍
提高落地实践的建议
-
数据清洗:
- 在插入数据到 Milvus 前,对测试文档和用例进行清洗和分块,确保内容质量。
- 使用正则表达式过滤掉无关信息(如模板注释、页眉页脚等)。
-
优化嵌入模型:
- 根据具体测试领域,选择更适合的嵌入模型(如 Hugging Face 的领域特定模型)。
- 对嵌入模型进行微调,增强对测试资产的理解。
-
检索增强:
- 设置检索的
k
值(返回的结果数量),根据实际需求调整。 - 使用 RAG(Retrieval-Augmented Generation)技术,将用户查询的上下文与检索结果结合,提高生成模型的准确性。
- 设置检索的
-
多格式支持:
- 扩展对
docx
、pdf
等格式的解析,结合PyPDF2
和python-docx
等库处理文档数据。
- 扩展对
总结
通过 LangChain 和 Milvus,测试工程师可以快速构建一个高效的测试知识库,支持测试资产的存储、检索和生成。本文提供了从环境搭建到代码实现的完整流程,以及提高系统落地实践效果的建议。结合 LangChain 的检索能力和 Milvus 的向量存储性能,这套方案将显著提升测试工作的效率与准确性。