gte-base-zh开源Embedding模型应用指南:知识库检索与RAG预处理实战

张开发
2026/4/13 10:11:59 15 分钟阅读

分享文章

gte-base-zh开源Embedding模型应用指南:知识库检索与RAG预处理实战
gte-base-zh开源Embedding模型应用指南知识库检索与RAG预处理实战1. 环境准备与模型部署1.1 模型简介与特点gte-base-zh是由阿里巴巴达摩院训练的中文文本嵌入模型基于BERT框架构建。这个模型在一个大规模的中文语料库上进行训练涵盖了丰富的领域和场景能够将文本转换为高质量的向量表示。该模型的主要特点包括双语支持专门针对中文文本优化同时支持英文高性能在信息检索、语义相似度计算等任务上表现优异广泛适用适用于多种下游任务包括知识库检索、文本匹配、重排序等开源免费完全开源可用于学术研究和商业项目模型本地存储路径为/usr/local/bin/AI-ModelScope/gte-base-zh1.2 使用Xinference部署模型Xinference是一个高效的模型推理框架我们可以用它来部署gte-base-zh模型服务。首先启动Xinference服务xinference-local --host 0.0.0.0 --port 9997然后使用提供的启动脚本发布模型服务python /usr/local/bin/launch_model_server.py1.3 验证服务状态部署完成后需要确认模型服务是否正常启动。检查服务日志cat /root/workspace/model_server.log如果看到模型加载成功的相关信息说明服务已经正常启动。初次加载可能需要一些时间取决于硬件配置。2. 基础使用与功能体验2.1 Web界面操作指南通过Xinference的Web界面可以方便地体验模型功能打开浏览器访问Xinference的Web UI找到gte-base-zh模型对应的界面点击示例文本或输入自定义文本点击相似度比对按钮进行计算界面会显示文本的向量表示和相似度计算结果让你直观了解模型的处理能力。2.2 基本API调用除了Web界面你也可以通过API直接调用模型服务。以下是一个简单的Python示例import requests import json # 模型服务地址 model_url http://localhost:9997/v1/embeddings # 准备请求数据 payload { model: gte-base-zh, input: [文本嵌入技术简介, 自然语言处理中的向量表示] } # 发送请求 headers {Content-Type: application/json} response requests.post(model_url, jsonpayload, headersheaders) # 处理响应 if response.status_code 200: embeddings response.json() print(嵌入向量获取成功) print(f向量维度: {len(embeddings[data][0][embedding])}) else: print(f请求失败: {response.status_code})这段代码展示了如何通过HTTP API获取文本的嵌入向量。3. 知识库检索实战3.1 构建文本知识库在实际应用中我们首先需要构建一个文本知识库。以下是一个简单的实现示例import numpy as np from sklearn.metrics.pairwise import cosine_similarity class KnowledgeBase: def __init__(self): self.documents [] self.embeddings [] def add_document(self, text, embedding): 向知识库添加文档 self.documents.append(text) self.embeddings.append(embedding) def build_from_texts(self, texts, embed_function): 从文本列表构建知识库 print(开始构建知识库...) for i, text in enumerate(texts): if i % 10 0: print(f处理进度: {i}/{len(texts)}) # 获取文本嵌入 embedding embed_function(text) self.add_document(text, embedding) self.embeddings np.array(self.embeddings) print(知识库构建完成) def search(self, query_embedding, top_k5): 在知识库中搜索相似文档 # 计算余弦相似度 similarities cosine_similarity([query_embedding], self.embeddings)[0] # 获取最相似的文档索引 most_similar_indices similarities.argsort()[-top_k:][::-1] # 返回结果 results [] for idx in most_similar_indices: results.append({ text: self.documents[idx], similarity: similarities[idx] }) return results3.2 实现语义搜索功能基于构建的知识库我们可以实现语义搜索功能def semantic_search(query, knowledge_base, embed_function, top_k5): 执行语义搜索 # 获取查询的嵌入向量 query_embedding embed_function(query) # 在知识库中搜索 results knowledge_base.search(query_embedding, top_k) return results # 示例用法 def embed_function(text): 封装嵌入向量获取函数 # 这里调用之前介绍的API方法 # 实际使用时替换为真实的嵌入获取代码 pass # 假设我们已经有了知识库实例和嵌入函数 # results semantic_search(机器学习算法, knowledge_base, embed_function) # for result in results: # print(f相似度: {result[similarity]:.4f} - 文本: {result[text]})4. RAG预处理实战4.1 文档预处理与分块在RAG系统中文档预处理是关键步骤。以下是一个文档分块的实现import re from typing import List def split_document(text, chunk_size500, overlap50): 将长文档分割成重叠的块 # 简单的按句子分割实际应用中可能需要更复杂的分割逻辑 sentences re.split(r(?[。.!?]), text) chunks [] current_chunk [] current_length 0 for sentence in sentences: sentence sentence.strip() if not sentence: continue sentence_length len(sentence) # 如果当前块加上新句子会超过大小且当前块不为空 if current_length sentence_length chunk_size and current_chunk: # 保存当前块 chunks.append(.join(current_chunk)) # 保留重叠部分 if overlap 0: # 计算要保留的重叠内容 overlap_text .join(current_chunk[-overlap:]) current_chunk [overlap_text] current_length len(overlap_text) else: current_chunk [] current_length 0 # 添加句子到当前块 current_chunk.append(sentence) current_length sentence_length # 添加最后一个块 if current_chunk: chunks.append(.join(current_chunk)) return chunks def preprocess_documents(documents: List[str]): 预处理文档集合 processed_chunks [] for doc in documents: # 清理文本根据实际需求调整 cleaned_doc re.sub(r\s, , doc).strip() # 分割文档 chunks split_document(cleaned_doc) processed_chunks.extend(chunks) return processed_chunks4.2 构建向量索引为了高效检索我们需要构建向量索引import faiss import numpy as np class VectorIndex: def __init__(self, dimension768): self.dimension dimension self.index faiss.IndexFlatIP(dimension) # 使用内积相似度 self.texts [] def add_embeddings(self, embeddings, texts): 向索引中添加嵌入向量和对应文本 if len(embeddings) ! len(texts): raise ValueError(嵌入向量和文本数量不匹配) # 归一化向量因为使用内积相似度 embeddings_norm embeddings / np.linalg.norm(embeddings, axis1, keepdimsTrue) # 添加到索引 self.index.add(embeddings_norm.astype(np.float32)) self.texts.extend(texts) def search(self, query_embedding, top_k5): 搜索相似向量 # 归一化查询向量 query_embedding_norm query_embedding / np.linalg.norm(query_embedding) query_embedding_norm query_embedding_norm.astype(np.float32).reshape(1, -1) # 搜索 distances, indices self.index.search(query_embedding_norm, top_k) # 组织结果 results [] for i, (distance, idx) in enumerate(zip(distances[0], indices[0])): if idx len(self.texts): # 确保索引有效 results.append({ text: self.texts[idx], score: float(distance), rank: i 1 }) return results # 使用示例 def build_vector_index(texts, embed_function): 构建向量索引 print(开始构建向量索引...) # 获取所有文本的嵌入向量 embeddings [] for i, text in enumerate(texts): if i % 10 0: print(f处理进度: {i}/{len(texts)}) embedding embed_function(text) embeddings.append(embedding) embeddings np.array(embeddings) # 创建索引 index VectorIndex(dimensionlen(embeddings[0])) index.add_embeddings(embeddings, texts) print(向量索引构建完成) return index5. 完整RAG系统实现5.1 端到端RAG流水线下面是一个完整的RAG系统实现示例class RAGSystem: def __init__(self, embed_function): self.embed_function embed_function self.vector_index None self.documents [] def ingest_documents(self, documents): 摄入文档并构建索引 print(开始处理文档...) # 预处理文档 processed_chunks preprocess_documents(documents) print(f文档分割完成共{len(processed_chunks)}个块) # 构建向量索引 self.vector_index build_vector_index(processed_chunks, self.embed_function) self.documents processed_chunks print(文档摄入完成) def retrieve(self, query, top_k5): 检索相关文档 if self.vector_index is None: raise ValueError(请先调用 ingest_documents 方法摄入文档) # 获取查询的嵌入向量 query_embedding self.embed_function(query) # 检索相似文档 results self.vector_index.search(query_embedding, top_k) return results def generate_context(self, query, top_k5): 生成检索增强的上下文 retrieved_docs self.retrieve(query, top_k) # 构建上下文 context \n\n.join([f[相关文档 {i1}] {doc[text]} for i, doc in enumerate(retrieved_docs)]) return context, retrieved_docs # 使用示例 def demo_rag_system(): # 示例文档 documents [ 机器学习是人工智能的一个分支专注于开发能够从数据中学习的算法。, 深度学习是机器学习的一个子领域使用多层神经网络处理复杂模式。, 自然语言处理使计算机能够理解、解释和生成人类语言。, 计算机视觉让机器能够从图像和视频中提取信息并做出决策。, # 可以添加更多文档... ] # 创建RAG系统实例 rag_system RAGSystem(embed_function) # 摄入文档 rag_system.ingest_documents(documents) # 执行查询 query 什么是深度学习 context, retrieved_docs rag_system.generate_context(query) print(查询:, query) print(\n检索到的相关文档:) for doc in retrieved_docs: print(f- 相似度: {doc[score]:.4f}: {doc[text]}) print(\n生成的上下文:) print(context)5.2 性能优化建议在实际应用中你可能需要考虑以下优化策略批量处理批量获取嵌入向量以提高效率缓存机制缓存频繁查询的结果索引优化使用更高效的索引结构如HNSW异步处理使用异步IO提高并发性能以下是批量处理的优化示例def batch_embed(texts, batch_size32): 批量获取嵌入向量 embeddings [] for i in range(0, len(texts), batch_size): batch texts[i:ibatch_size] # 批量调用嵌入API batch_embeddings embed_batch(batch) embeddings.extend(batch_embeddings) print(f处理进度: {min(ibatch_size, len(texts))}/{len(texts)}) return np.array(embeddings) def embed_batch(texts): 批量嵌入函数需要根据实际API实现 # 这里调用支持批量处理的API # 返回嵌入向量列表 pass6. 实际应用案例6.1 智能客服系统gte-base-zh可以用于构建智能客服系统快速检索相关知识库内容class CustomerServiceBot: def __init__(self, knowledge_base): self.knowledge_base knowledge_base self.faq_answers { 退货政策: 我们提供7天无理由退货服务商品需保持完好。, 配送时间: 普通配送需要3-5个工作日加急配送需要1-2个工作日。, 支付方式: 我们支持支付宝、微信支付、银行卡等多种支付方式。, # 更多常见问题... } def answer_question(self, question): 回答用户问题 # 检索相关知识 results self.knowledge_base.search(question, top_k3) # 简单策略使用最相关的结果 if results and results[0][similarity] 0.7: best_match results[0][text] # 这里可以添加更复杂的答案生成逻辑 return f根据相关信息{best_match} else: # 尝试匹配FAQ for faq_question in self.faq_answers.keys(): if faq_question in question: return self.faq_answers[faq_question] return 抱歉我没有找到相关问题的答案。请尝试换种方式提问或联系人工客服。6.2 文档检索与推荐系统基于gte-base-zh构建文档检索系统class DocumentRetrievalSystem: def __init__(self, embed_function): self.embed_function embed_function self.document_index {} self.vector_index VectorIndex() def add_document(self, doc_id, text, metadataNone): 添加文档到系统 embedding self.embed_function(text) self.document_index[doc_id] { text: text, metadata: metadata or {}, embedding: embedding } # 添加到向量索引 self.vector_index.add_embeddings([embedding], [doc_id]) def search_documents(self, query, top_k10, filter_funcNone): 搜索文档 query_embedding self.embed_function(query) results self.vector_index.search(query_embedding, top_k * 2) # 多取一些结果用于过滤 # 应用过滤条件 filtered_results [] for result in results: doc_id result[text] # 这里存储的是doc_id doc_info self.document_index[doc_id] if filter_func is None or filter_func(doc_info[metadata]): filtered_results.append({ doc_id: doc_id, text: doc_info[text], metadata: doc_info[metadata], score: result[score] }) if len(filtered_results) top_k: break return filtered_results def find_similar_documents(self, doc_id, top_k5): 查找相似文档 if doc_id not in self.document_index: return [] doc_embedding self.document_index[doc_id][embedding] results self.vector_index.search(doc_embedding, top_k 1) # 1 因为会包含自己 # 过滤掉自己 similar_docs [] for result in results: similar_doc_id result[text] if similar_doc_id ! doc_id: # 排除自己 doc_info self.document_index[similar_doc_id] similar_docs.append({ doc_id: similar_doc_id, text: doc_info[text], metadata: doc_info[metadata], score: result[score] }) if len(similar_docs) top_k: break return similar_docs7. 总结与最佳实践通过本指南你应该已经了解了如何使用gte-base-zh模型构建知识库检索和RAG系统。以下是一些关键要点和最佳实践核心要点回顾gte-base-zh是一个高质量的中文文本嵌入模型适合多种NLP任务使用Xinference可以方便地部署和管理模型服务知识库检索的核心是将文本转换为向量并计算相似度RAG系统通过检索增强生成提高大语言模型的准确性和相关性实践建议数据质量至关重要确保知识库文档的质量和相关性合适的块大小根据内容类型调整文档分块的大小和重叠度多维度评估不仅关注相似度分数还要人工评估结果质量持续优化根据实际使用反馈不断调整和优化系统扩展思路结合其他NLP技术如实体识别、关键词提取提升检索效果实现混合检索语义检索关键词检索添加用户反馈机制持续优化检索质量探索多模态检索文本图像等gte-base-zh为中文文本处理提供了强大的嵌入能力结合合适的架构设计你可以构建出高效、准确的检索和RAG系统。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章