148 lines
5.3 KiB
Python
148 lines
5.3 KiB
Python
import sys
|
||
import time
|
||
import uuid
|
||
|
||
def main():
|
||
report = {
|
||
"status": "running",
|
||
"steps": [],
|
||
"env_info": {},
|
||
"vector_pipeline_test": "pending"
|
||
}
|
||
|
||
try:
|
||
# ==========================================
|
||
# 1. 环境自检
|
||
# ==========================================
|
||
import numpy
|
||
import requests
|
||
import langchain
|
||
import langchain_community
|
||
import pydantic
|
||
|
||
report["env_info"] = {
|
||
"python": sys.version.split()[0],
|
||
"numpy": numpy.__version__,
|
||
"langchain": langchain.__version__,
|
||
"pydantic": pydantic.__version__
|
||
}
|
||
report["steps"].append("✅ 基础环境库加载成功")
|
||
|
||
# ==========================================
|
||
# 2. 定义 Mock 组件 (模拟向量生成)
|
||
# ==========================================
|
||
from langchain_core.embeddings import Embeddings
|
||
from langchain_core.documents import Document
|
||
|
||
class MockEmbeddings(Embeddings):
|
||
"""生成固定维度的随机向量,模拟 OpenAI/HuggingFace"""
|
||
def __init__(self, dim=1536):
|
||
self.dim = dim
|
||
|
||
def embed_documents(self, texts):
|
||
# 返回 N 个随机向量
|
||
return [numpy.random.rand(self.dim).tolist() for _ in texts]
|
||
|
||
def embed_query(self, text):
|
||
# 返回 1 个随机向量
|
||
return numpy.random.rand(self.dim).tolist()
|
||
|
||
embeddings = MockEmbeddings(dim=768)
|
||
report["steps"].append("✅ 向量嵌入模型 (Mock) 初始化成功")
|
||
|
||
# ==========================================
|
||
# 3. 实战测试:使用 Qdrant 内存模式跑全流程
|
||
# ==========================================
|
||
# 这一步能验证 LangChain 和底层库的数据流转是否正常
|
||
try:
|
||
from langchain_community.vectorstores import Qdrant
|
||
|
||
# 准备假数据
|
||
docs = [
|
||
Document(page_content="Hello Dify", metadata={"id": 1}),
|
||
Document(page_content="Vector Database Test", metadata={"id": 2}),
|
||
Document(page_content="Conflict Check", metadata={"id": 3}),
|
||
]
|
||
|
||
# --- 关键步骤:在内存中建库 ---
|
||
# Qdrant 支持 location=":memory:",不需要外部服务器
|
||
db = Qdrant.from_documents(
|
||
docs,
|
||
embeddings,
|
||
location=":memory:",
|
||
collection_name="test_collection"
|
||
)
|
||
|
||
# --- 关键步骤:执行向量检索 ---
|
||
results = db.similarity_search("Hello", k=1)
|
||
|
||
if results and len(results) > 0:
|
||
report["vector_pipeline_test"] = "✅ Success (Qdrant In-Memory)"
|
||
report["steps"].append(f"✅ 向量存取测试通过: 检索到 '{results[0].page_content}'")
|
||
else:
|
||
report["vector_pipeline_test"] = "❌ Failed (No results)"
|
||
|
||
except Exception as e:
|
||
report["vector_pipeline_test"] = f"❌ Failed: {str(e)}"
|
||
# 如果这一步挂了,说明依赖有深层冲突
|
||
|
||
# ==========================================
|
||
# 4. 其他数据库驱动加载测试
|
||
# ==========================================
|
||
# 这一步测试是否能正确 import,确保驱动都在
|
||
drivers = {}
|
||
|
||
# [PostgreSQL / PGVector]
|
||
try:
|
||
import psycopg2
|
||
from langchain_community.vectorstores import PGVector
|
||
drivers["postgres"] = "✅ Loaded"
|
||
except Exception as e:
|
||
drivers["postgres"] = f"❌ Error: {str(e)}"
|
||
|
||
# [Milvus]
|
||
try:
|
||
import pymilvus
|
||
from langchain_community.vectorstores import Milvus
|
||
drivers["milvus"] = "✅ Loaded"
|
||
except Exception as e:
|
||
drivers["milvus"] = f"❌ Error: {str(e)}"
|
||
|
||
# [Redis]
|
||
try:
|
||
import redis
|
||
from langchain_community.vectorstores import Redis
|
||
drivers["redis"] = "✅ Loaded"
|
||
except Exception as e:
|
||
drivers["redis"] = f"❌ Error: {str(e)}"
|
||
|
||
# [Pinecone]
|
||
try:
|
||
import pinecone # 新版包名
|
||
from langchain_community.vectorstores import Pinecone
|
||
drivers["pinecone"] = "✅ Loaded"
|
||
except Exception as e:
|
||
drivers["pinecone"] = f"❌ Error: {str(e)}"
|
||
|
||
report["drivers_status"] = drivers
|
||
|
||
# ==========================================
|
||
# 5. 最终判定
|
||
# ==========================================
|
||
if "❌" not in str(drivers.values()) and "Success" in report["vector_pipeline_test"]:
|
||
report["status"] = "success"
|
||
report["message"] = "🎉 完美验证!所有库已就绪,且向量计算逻辑运行正常。"
|
||
else:
|
||
report["status"] = "warning"
|
||
report["message"] = "存在潜在问题,请检查详细信息。"
|
||
|
||
except Exception as e:
|
||
report["status"] = "error"
|
||
report["message"] = f"全局错误: {str(e)}"
|
||
|
||
return report
|
||
|
||
if __name__ == "__main__":
|
||
report = main()
|
||
print(report)
|