gte-base-zh实战手册:结合Elasticsearch vector search插件构建混合检索系统
1. 环境准备与快速部署
在开始构建混合检索系统之前,我们需要先完成基础环境的搭建。本节将指导您快速部署gte-base-zh embedding模型和Elasticsearch向量搜索环境。
1.1 安装Xinference服务
Xinference是一个高效的模型推理框架,我们可以用它来部署gte-base-zh模型。首先确保您的系统已经安装了Python 3.8或更高版本。
# 安装xinference pip install xinference # 启动xinference服务 xinference-local --host 0.0.0.0 --port 9997服务启动后,您可以通过浏览器访问http://服务器IP:9997来查看Xinference的Web界面。
1.2 部署gte-base-zh模型
gte-base-zh模型已经预置在系统中,位于指定目录。我们需要通过脚本启动模型服务:
# 运行模型启动脚本 python /usr/local/bin/launch_model_server.py模型加载需要一些时间,您可以通过以下命令查看启动状态:
# 查看模型服务日志 cat /root/workspace/model_server.log当看到日志显示服务启动成功的消息时,说明模型已经准备就绪。
1.3 验证模型服务
打开Xinference的Web界面,您会看到一个直观的操作面板。在这里可以:
- 点击示例文本或输入自定义文本
- 点击"相似度比对"按钮
- 查看模型返回的相似度计算结果
如果能够正常显示相似度比对结果,说明gte-base-zh模型已经成功部署并可以正常使用。
2. Elasticsearch向量搜索环境搭建
现在我们来设置Elasticsearch环境,并安装必要的向量搜索插件。
2.1 安装Elasticsearch
首先下载并安装Elasticsearch,这里以8.x版本为例:
# 下载Elasticsearch wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.11.1-linux-x86_64.tar.gz # 解压安装包 tar -xzf elasticsearch-8.11.1-linux-x86_64.tar.gz # 进入安装目录 cd elasticsearch-8.11.1/2.2 安装向量搜索插件
Elasticsearch提供了官方的向量搜索功能,我们需要确保相关插件正确安装:
# 检查并安装必要的插件 ./bin/elasticsearch-plugin install analysis-icu2.3 配置Elasticsearch
编辑Elasticsearch配置文件,启用向量搜索功能:
# config/elasticsearch.yml cluster.name: my-vector-search-cluster node.name: node-1 network.host: 0.0.0.0 http.port: 9200 cluster.initial_master_nodes: ["node-1"] # 向量搜索相关配置 xpack.ml.enabled: true2.4 启动Elasticsearch
# 启动Elasticsearch服务 ./bin/elasticsearch启动成功后,您可以通过访问http://localhost:9200来验证Elasticsearch是否正常运行。
3. 构建混合检索系统
现在我们将gte-base-zh模型与Elasticsearch结合,构建一个完整的混合检索系统。
3.1 创建向量索引
首先在Elasticsearch中创建一个支持向量搜索的索引:
from elasticsearch import Elasticsearch import json # 连接Elasticsearch es = Elasticsearch(["http://localhost:9200"]) # 定义索引映射 index_mapping = { "mappings": { "properties": { "content": { "type": "text", "analyzer": "ik_max_word" }, "content_vector": { "type": "dense_vector", "dims": 768, # gte-base-zh模型的向量维度 "index": True, "similarity": "cosine" }, "metadata": { "type": "object" } } } } # 创建索引 es.indices.create(index="hybrid-search-index", body=index_mapping)3.2 文本向量化处理
使用gte-base-zh模型将文本转换为向量:
import requests import numpy as np def get_text_embedding(text): """ 使用gte-base-zh模型获取文本向量 """ # Xinference服务地址 xinference_url = "http://localhost:9997/v1/embeddings" # 请求参数 payload = { "model": "gte-base-zh", "input": text } # 发送请求 response = requests.post(xinference_url, json=payload) if response.status_code == 200: result = response.json() return result['data'][0]['embedding'] else: raise Exception(f"获取向量失败: {response.text}") # 示例:获取文本向量 text = "这是一个测试文本" embedding = get_text_embedding(text) print(f"文本向量维度: {len(embedding)}")3.3 数据索引化
将文档数据索引到Elasticsearch中,同时存储原文和向量:
def index_documents(documents): """ 将文档索引到Elasticsearch中 """ for i, doc in enumerate(documents): # 获取文本向量 embedding = get_text_embedding(doc['content']) # 构建文档数据 document = { "content": doc['content'], "content_vector": embedding, "metadata": doc.get('metadata', {}) } # 索引文档 es.index(index="hybrid-search-index", id=i, document=document) # 刷新索引 es.indices.refresh(index="hybrid-search-index") # 示例文档数据 sample_documents = [ { "content": "机器学习是人工智能的重要分支", "metadata": {"category": "AI", "source": "wiki"} }, { "content": "深度学习基于神经网络架构", "metadata": {"category": "AI", "source": "book"} }, { "content": "自然语言处理让计算机理解人类语言", "metadata": {"category": "NLP", "source": "blog"} } ] # 索引文档 index_documents(sample_documents)4. 实现混合搜索功能
混合搜索结合了关键词搜索和向量搜索的优势,提供更精准的搜索结果。
4.1 关键词搜索实现
def keyword_search(query, size=10): """ 传统关键词搜索 """ search_body = { "query": { "match": { "content": query } }, "size": size } response = es.search(index="hybrid-search-index", body=search_body) return [hit['_source'] for hit in response['hits']['hits']]4.2 向量搜索实现
def vector_search(query, size=10): """ 向量相似度搜索 """ # 获取查询文本的向量 query_embedding = get_text_embedding(query) search_body = { "query": { "script_score": { "query": {"match_all": {}}, "script": { "source": "cosineSimilarity(params.query_vector, 'content_vector') + 1.0", "params": {"query_vector": query_embedding} } } }, "size": size } response = es.search(index="hybrid-search-index", body=search_body) return [hit['_source'] for hit in response['hits']['hits']]4.3 混合搜索策略
结合关键词搜索和向量搜索的结果,实现混合检索:
def hybrid_search(query, keyword_weight=0.5, vector_weight=0.5, size=10): """ 混合搜索:结合关键词搜索和向量搜索 """ # 获取两种搜索方式的结果 keyword_results = keyword_search(query, size=size) vector_results = vector_search(query, size=size) # 结果融合策略 combined_results = [] # 为关键词搜索结果添加权重 for i, result in enumerate(keyword_results): score = (size - i) / size * keyword_weight combined_results.append({ "content": result['content'], "metadata": result['metadata'], "score": score, "type": "keyword" }) # 为向量搜索结果添加权重 for i, result in enumerate(vector_results): score = (size - i) / size * vector_weight combined_results.append({ "content": result['content'], "metadata": result['metadata'], "score": score, "type": "vector" }) # 按分数排序并去重 seen_contents = set() final_results = [] for result in sorted(combined_results, key=lambda x: x['score'], reverse=True): if result['content'] not in seen_contents: seen_contents.add(result['content']) final_results.append(result) return final_results[:size] # 示例搜索 query = "人工智能技术" results = hybrid_search(query, size=5) print("混合搜索结果:") for i, result in enumerate(results): print(f"{i+1}. {result['content']} (分数: {result['score']:.3f}, 类型: {result['type']})")5. 系统优化与性能调优
为了提升混合检索系统的性能和效果,我们可以进行以下优化。
5.1 批量处理优化
当需要处理大量文本时,使用批量处理可以显著提升效率:
def batch_get_embeddings(texts, batch_size=32): """ 批量获取文本向量 """ xinference_url = "http://localhost:9997/v1/embeddings" results = [] for i in range(0, len(texts), batch_size): batch = texts[i:i+batch_size] payload = { "model": "gte-base-zh", "input": batch } response = requests.post(xinference_url, json=payload) if response.status_code == 200: batch_result = response.json() results.extend([item['embedding'] for item in batch_result['data']]) else: raise Exception(f"批量获取向量失败: {response.text}") return results5.2 缓存机制实现
为了避免重复计算相同文本的向量,实现简单的缓存机制:
from functools import lru_cache @lru_cache(maxsize=1000) def get_cached_embedding(text): """ 带缓存的向量获取函数 """ return get_text_embedding(text)5.3 索引优化策略
优化Elasticsearch索引配置,提升搜索性能:
def optimize_index_settings(): """ 优化索引设置 """ settings = { "index": { "number_of_shards": 1, "number_of_replicas": 0, "refresh_interval": "30s", "max_result_window": 100000 } } es.indices.put_settings(index="hybrid-search-index", body=settings)6. 实际应用案例
让我们通过几个实际场景来展示混合检索系统的强大功能。
6.1 技术文档搜索
假设我们有一个技术文档库,包含各种编程语言和框架的文档:
# 技术文档示例 tech_documents = [ {"content": "Python是一种解释型、面向对象的高级编程语言", "metadata": {"lang": "Python", "type": "概念"}}, {"content": "JavaScript用于网页开发,支持函数式编程", "metadata": {"lang": "JavaScript", "type": "概念"}}, {"content": "Django是Python的高级Web框架", "metadata": {"lang": "Python", "type": "框架"}}, {"content": "React是JavaScript的用户界面库", "metadata": {"lang": "JavaScript", "type": "库"}} ] # 索引技术文档 index_documents(tech_documents) # 搜索示例 results = hybrid_search("Web开发框架", size=3) for result in results: print(f"- {result['content']}")6.2 新闻内容检索
对于新闻内容检索,混合搜索能够更好地理解语义:
# 新闻文档示例 news_documents = [ {"content": "人工智能技术在医疗诊断领域取得突破", "metadata": {"category": "科技", "date": "2024-01-15"}}, {"content": "新能源汽车市场占有率持续提升", "metadata": {"category": "汽车", "date": "2024-01-16"}}, {"content": "深度学习算法在图像识别中的应用", "metadata": {"category": "科技", "date": "2024-01-17"}} ] # 索引新闻文档 index_documents(news_documents) # 搜索示例 results = hybrid_search("AI医疗进展", size=2) for result in results: print(f"- {result['content']} (分类: {result['metadata']['category']})")6.3 学术论文搜索
在学术搜索场景中,混合检索能够提供更相关的结果:
# 学术论文示例 paper_documents = [ {"content": "基于Transformer的预训练语言模型研究", "metadata": {"field": "NLP", "year": 2023}}, {"content": "计算机视觉中的目标检测算法综述", "metadata": {"field": "CV", "year": 2022}}, {"content": "图神经网络在推荐系统中的应用", "metadata": {"field": "ML", "year": 2023}} ] # 索引论文文档 index_documents(paper_documents) # 搜索示例 results = hybrid_search("深度学习模型", size=3) for result in results: print(f"- {result['content']} (领域: {result['metadata']['field']})")7. 总结
通过本实战手册,我们成功构建了一个基于gte-base-zh和Elasticsearch的混合检索系统。这个系统结合了传统关键词搜索和现代向量搜索的优势,能够提供更精准、更相关的搜索结果。
7.1 核心价值总结
- 语义理解能力强:gte-base-zh模型提供了高质量的中文文本向量表示
- 搜索效果提升:混合搜索策略结合了关键词匹配和语义相似度
- 灵活可扩展:系统架构支持轻松扩展和定制
- 性能优化:通过批量处理、缓存等机制确保系统高效运行
7.2 实践建议
在实际部署和使用时,建议:
- 根据具体场景调整关键词搜索和向量搜索的权重比例
- 针对不同的文档类型优化索引设置和搜索参数
- 定期监控系统性能,根据需求进行扩容和优化
- 考虑实现更复杂的结果融合和重排序策略
7.3 进一步探索
如果您希望进一步扩展这个系统,可以考虑:
- 集成更多的预训练模型,支持多语言检索
- 实现实时索引和搜索,支持流式数据处理
- 添加用户反馈机制,实现搜索结果的持续优化
- 结合知识图谱,提供更丰富的语义检索能力
这个混合检索系统为各种搜索场景提供了强大的基础能力,您可以根据具体需求进行定制和扩展,构建更适合自己业务需求的智能搜索解决方案。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。