应用场景
向量数据库应用概述
向量数据库作为AI时代的核心基础设施,在众多领域展现出强大的应用潜力。从传统的搜索推荐到新兴的多模态AI应用,向量数据库正在重新定义数据处理和智能应用的边界。
1. 自然语言处理应用
1.1 语义搜索
传统的关键词搜索已无法满足用户对准确性和智能化的需求,语义搜索通过理解查询意图和内容含义,提供更精准的搜索结果。
# 语义搜索实现示例
from sentence_transformers import SentenceTransformer
import numpy as np
class SemanticSearchEngine:
def __init__(self, model_name='all-MiniLM-L6-v2'):
self.model = SentenceTransformer(model_name)
self.document_embeddings = {}
self.documents = {}
def index_documents(self, documents):
"""索引文档"""
for doc_id, content in documents.items():
# 生成向量嵌入
embedding = self.model.encode(content)
self.document_embeddings[doc_id] = embedding
self.documents[doc_id] = content
def search(self, query, top_k=10):
"""语义搜索"""
# 查询向量化
query_embedding = self.model.encode(query)
# 计算相似度
similarities = []
for doc_id, doc_embedding in self.document_embeddings.items():
similarity = np.dot(query_embedding, doc_embedding) / (
np.linalg.norm(query_embedding) * np.linalg.norm(doc_embedding)
)
similarities.append((similarity, doc_id))
# 排序并返回结果
similarities.sort(reverse=True)
results = []
for similarity, doc_id in similarities[:top_k]:
results.append({
'doc_id': doc_id,
'content': self.documents[doc_id],
'similarity': similarity
})
return results
# 使用示例
search_engine = SemanticSearchEngine()
# 索引文档
documents = {
'doc1': '人工智能是计算机科学的一个分支',
'doc2': '机器学习是AI的重要组成部分',
'doc3': '深度学习使用神经网络进行模式识别',
'doc4': '自然语言处理帮助计算机理解人类语言'
}
search_engine.index_documents(documents)
# 搜索
results = search_engine.search("AI技术", top_k=3)
for result in results:
print(f"相似度: {result['similarity']:.4f}, 内容: {result['content']}")
1.2 文档问答系统
基于向量数据库的文档问答系统能够准确理解用户问题,并从大量文档中找到相关答案。
class DocumentQASystem:
def __init__(self, vector_db, llm_model):
self.vector_db = vector_db
self.llm_model = llm_model
self.chunk_size = 512
def load_documents(self, documents):
"""加载和分块文档"""
for doc_id, content in documents.items():
# 文档分块
chunks = self.split_document(content)
for i, chunk in enumerate(chunks):
chunk_id = f"{doc_id}_chunk_{i}"
# 向量化并存储
embedding = self.vectorize_text(chunk)
self.vector_db.insert(chunk_id, embedding, {
'doc_id': doc_id,
'chunk_index': i,
'content': chunk
})
def answer_question(self, question, top_k=5):
"""回答问题"""
# 1. 问题向量化
question_embedding = self.vectorize_text(question)
# 2. 检索相关文档块
relevant_chunks = self.vector_db.search(question_embedding, top_k=top_k)
# 3. 构建上下文
context = "\n".join([chunk['metadata']['content'] for chunk in relevant_chunks])
# 4. 生成答案
prompt = f"""
基于以下上下文回答问题:
上下文:
{context}
问题:{question}
答案:
"""
answer = self.llm_model.generate(prompt)
return {
'answer': answer,
'sources': [chunk['metadata']['doc_id'] for chunk in relevant_chunks],
'confidence': self.calculate_confidence(question, relevant_chunks)
}
def split_document(self, document):
"""分割文档"""
# 简单的分块策略
words = document.split()
chunks = []
for i in range(0, len(words), self.chunk_size):
chunk = ' '.join(words[i:i+self.chunk_size])
chunks.append(chunk)
return chunks
def vectorize_text(self, text):
"""文本向量化"""
return self.model.encode(text)
1.3 智能客服系统
向量数据库支持的智能客服系统能够快速匹配用户问题与知识库,提供准确的答案。
class IntelligentCustomerService:
def __init__(self, vector_db):
self.vector_db = vector_db
self.knowledge_base = {}
self.conversation_history = {}
def build_knowledge_base(self, qa_pairs):
"""构建知识库"""
for qa_id, qa_data in qa_pairs.items():
question = qa_data['question']
answer = qa_data['answer']
category = qa_data.get('category', 'general')
# 向量化问题
question_embedding = self.vectorize_text(question)
# 存储到向量数据库
self.vector_db.insert(qa_id, question_embedding, {
'question': question,
'answer': answer,
'category': category,
'usage_count': 0
})
self.knowledge_base[qa_id] = qa_data
def handle_customer_query(self, user_id, query):
"""处理用户查询"""
# 1. 查询向量化
query_embedding = self.vectorize_text(query)
# 2. 检索相似问题
similar_questions = self.vector_db.search(query_embedding, top_k=5)
# 3. 筛选最佳答案
best_match = self.select_best_answer(similar_questions, query)
# 4. 更新使用统计
self.update_usage_stats(best_match['id'])
# 5. 记录对话历史
self.record_conversation(user_id, query, best_match)
return {
'answer': best_match['metadata']['answer'],
'confidence': best_match['similarity'],
'category': best_match['metadata']['category'],
'follow_up_questions': self.generate_follow_up_questions(best_match)
}
def select_best_answer(self, candidates, query):
"""选择最佳答案"""
if not candidates:
return self.get_fallback_response()
best_candidate = candidates[0]
# 如果相似度太低,返回默认回复
if best_candidate['similarity'] < 0.7:
return self.get_fallback_response()
return best_candidate
def get_fallback_response(self):
"""获取回退响应"""
return {
'id': 'fallback',
'metadata': {
'answer': '很抱歉,我没有找到相关的答案。请联系人工客服获取帮助。',
'category': 'fallback'
},
'similarity': 0.0
}
2. 推荐系统
2.1 内容推荐
基于内容的推荐系统使用向量数据库存储物品特征向量,通过计算用户偏好与物品特征的相似度进行推荐。
class ContentBasedRecommendationSystem:
def __init__(self, vector_db):
self.vector_db = vector_db
self.user_profiles = {}
self.item_features = {}
def add_item(self, item_id, features):
"""添加物品"""
# 特征向量化
feature_embedding = self.vectorize_features(features)
# 存储到向量数据库
self.vector_db.insert(item_id, feature_embedding, {
'item_id': item_id,
'features': features,
'category': features.get('category', 'unknown')
})
self.item_features[item_id] = features
def update_user_profile(self, user_id, liked_items, disliked_items):
"""更新用户画像"""
# 收集用户喜欢的物品特征
liked_features = []
for item_id in liked_items:
if item_id in self.item_features:
liked_features.append(self.item_features[item_id])
# 生成用户偏好向量
user_preference_vector = self.generate_user_preference_vector(liked_features)
self.user_profiles[user_id] = {
'preference_vector': user_preference_vector,
'liked_items': liked_items,
'disliked_items': disliked_items
}
def recommend_items(self, user_id, top_k=10, exclude_seen=True):
"""推荐物品"""
if user_id not in self.user_profiles:
return self.get_popular_items(top_k)
user_profile = self.user_profiles[user_id]
preference_vector = user_profile['preference_vector']
# 在向量数据库中搜索相似物品
similar_items = self.vector_db.search(preference_vector, top_k=top_k*2)
# 过滤已看过的物品
recommendations = []
seen_items = set(user_profile['liked_items'] + user_profile['disliked_items'])
for item in similar_items:
item_id = item['metadata']['item_id']
if exclude_seen and item_id in seen_items:
continue
recommendations.append({
'item_id': item_id,
'similarity': item['similarity'],
'category': item['metadata']['category']
})
if len(recommendations) >= top_k:
break
return recommendations
def generate_user_preference_vector(self, liked_features):
"""生成用户偏好向量"""
# 简单的特征平均策略
if not liked_features:
return np.zeros(self.feature_dim)
feature_vectors = [self.vectorize_features(features) for features in liked_features]
return np.mean(feature_vectors, axis=0)
2.2 协同过滤推荐
结合用户行为和物品特征的混合推荐系统。
class HybridRecommendationSystem:
def __init__(self, vector_db):
self.vector_db = vector_db
self.user_item_matrix = {}
self.item_vectors = {}
self.user_vectors = {}
def train_user_embeddings(self, user_interactions):
"""训练用户嵌入"""
for user_id, interactions in user_interactions.items():
# 基于用户交互生成用户向量
user_vector = self.generate_user_vector(interactions)
self.user_vectors[user_id] = user_vector
# 存储到向量数据库
self.vector_db.insert(f"user_{user_id}", user_vector, {
'type': 'user',
'user_id': user_id,
'interaction_count': len(interactions)
})
def find_similar_users(self, user_id, top_k=10):
"""找到相似用户"""
if user_id not in self.user_vectors:
return []
user_vector = self.user_vectors[user_id]
# 搜索相似用户
similar_users = self.vector_db.search(
user_vector,
top_k=top_k,
filters={'type': 'user'}
)
return [user['metadata']['user_id'] for user in similar_users
if user['metadata']['user_id'] != user_id]
def collaborative_filtering_recommend(self, user_id, top_k=10):
"""协同过滤推荐"""
# 1. 找到相似用户
similar_users = self.find_similar_users(user_id, top_k=20)
# 2. 收集相似用户喜欢的物品
candidate_items = {}
for similar_user_id in similar_users:
if similar_user_id in self.user_item_matrix:
for item_id, rating in self.user_item_matrix[similar_user_id].items():
if rating > 3: # 假设评分大于3表示喜欢
candidate_items[item_id] = candidate_items.get(item_id, 0) + rating
# 3. 排序并返回推荐
recommendations = sorted(candidate_items.items(), key=lambda x: x[1], reverse=True)
return [item_id for item_id, score in recommendations[:top_k]]
3. 图像和视频应用
3.1 图像相似性搜索
使用向量数据库构建图像搜索引擎,支持以图搜图功能。
import torchvision.transforms as transforms
from PIL import Image
import torch
class ImageSimilaritySearch:
def __init__(self, vector_db, model_name='resnet50'):
self.vector_db = vector_db
self.model = self.load_image_model(model_name)
self.transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
def load_image_model(self, model_name):
"""加载图像模型"""
if model_name == 'resnet50':
model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)
model.eval()
return model
else:
raise ValueError(f"不支持的模型: {model_name}")
def extract_image_features(self, image_path):
"""提取图像特征"""
image = Image.open(image_path).convert('RGB')
image_tensor = self.transform(image).unsqueeze(0)
with torch.no_grad():
features = self.model(image_tensor)
return features.squeeze().numpy()
def index_images(self, image_paths):
"""索引图像"""
for image_id, image_path in image_paths.items():
try:
# 提取特征
features = self.extract_image_features(image_path)
# 存储到向量数据库
self.vector_db.insert(image_id, features, {
'image_id': image_id,
'image_path': image_path,
'indexed_at': time.time()
})
except Exception as e:
print(f"索引图像 {image_id} 失败: {e}")
def search_similar_images(self, query_image_path, top_k=10):
"""搜索相似图像"""
# 提取查询图像特征
query_features = self.extract_image_features(query_image_path)
# 在向量数据库中搜索
similar_images = self.vector_db.search(query_features, top_k=top_k)
results = []
for image in similar_images:
results.append({
'image_id': image['metadata']['image_id'],
'image_path': image['metadata']['image_path'],
'similarity': image['similarity']
})
return results
3.2 视频内容分析
class VideoContentAnalysis:
def __init__(self, vector_db):
self.vector_db = vector_db
self.frame_extractor = FrameExtractor()
self.feature_extractor = FeatureExtractor()
def analyze_video(self, video_path, sampling_rate=1.0):
"""分析视频内容"""
# 提取关键帧
frames = self.frame_extractor.extract_frames(video_path, sampling_rate)
video_features = []
for frame_idx, frame in enumerate(frames):
# 提取帧特征
frame_features = self.feature_extractor.extract_features(frame)
# 存储帧特征
frame_id = f"{video_path}_frame_{frame_idx}"
self.vector_db.insert(frame_id, frame_features, {
'video_path': video_path,
'frame_index': frame_idx,
'timestamp': frame_idx / sampling_rate
})
video_features.append(frame_features)
# 生成视频级别特 征
video_features = np.mean(video_features, axis=0)
# 存储视频特征
self.vector_db.insert(f"video_{video_path}", video_features, {
'video_path': video_path,
'frame_count': len(frames),
'analyzed_at': time.time()
})
return video_features
def search_video_content(self, query_description, top_k=10):
"""搜索视频内容"""
# 将文本描述转换为向量
query_vector = self.text_to_vector(query_description)
# 搜索相关视频帧
results = self.vector_db.search(query_vector, top_k=top_k)
return self.group_results_by_video(results)