gte-base-zh开发者实操手册:Python调用Xinference Embedding API代码实例

1. 快速了解gte-base-zh嵌入模型

gte-base-zh是由阿里巴巴达摩院训练的中文文本嵌入模型,基于BERT框架构建。这个模型在一个包含大量相关文本对的大规模语料库上进行训练,涵盖了广泛的领域和场景。

模型的核心能力

  • 将中文文本转换为高维向量表示
  • 计算文本之间的语义相似度
  • 支持信息检索、语义匹配、文本重排序等应用
  • 专门针对中文语言特点优化

模型本地地址为:/usr/local/bin/AI-ModelScope/gte-base-zh

2. 环境准备与模型部署

2.1 启动Xinference服务

首先需要启动Xinference服务,使用以下命令:

xinference-local --host 0.0.0.0 --port 9997

这个命令会在本地启动一个推理服务,监听9997端口。

2.2 启动gte-base-zh模型服务

使用专门的启动脚本发布模型服务:

python /usr/local/bin/launch_model_server.py

2.3 验证服务状态

检查模型服务是否启动成功:

cat /root/workspace/model_server.log

如果看到类似下面的输出,说明服务启动成功:

模型加载完成,服务已启动
等待接收请求...

3. Python调用Embedding API实战

3.1 安装必要的Python库

首先确保安装了所需的Python依赖:

pip install requests numpy

3.2 基础文本嵌入代码示例

下面是一个简单的Python示例,展示如何调用gte-base-zh的嵌入API:

import requests
import json
import numpy as np

class GTEEmbeddingClient:
    def __init__(self, base_url="http://localhost:9997"):
        self.base_url = base_url
        self.embedding_url = f"{base_url}/v1/embeddings"
    
    def get_embedding(self, text, model="gte-base-zh"):
        """获取单个文本的嵌入向量"""
        payload = {
            "model": model,
            "input": text
        }
        
        try:
            response = requests.post(self.embedding_url, json=payload)
            response.raise_for_status()
            result = response.json()
            return result['data'][0]['embedding']
        except Exception as e:
            print(f"获取嵌入向量失败: {e}")
            return None
    
    def get_embeddings_batch(self, texts, model="gte-base-zh"):
        """批量获取多个文本的嵌入向量"""
        payload = {
            "model": model,
            "input": texts
        }
        
        try:
            response = requests.post(self.embedding_url, json=payload)
            response.raise_for_status()
            result = response.json()
            return [item['embedding'] for item in result['data']]
        except Exception as e:
            print(f"批量获取嵌入向量失败: {e}")
            return None

# 使用示例
if __name__ == "__main__":
    client = GTEEmbeddingClient()
    
    # 单个文本嵌入
    text = "自然语言处理是人工智能的重要领域"
    embedding = client.get_embedding(text)
    print(f"文本嵌入向量维度: {len(embedding)}")
    print(f"前10个维度值: {embedding[:10]}")
    
    # 批量文本嵌入
    texts = [
        "机器学习算法",
        "深度学习模型",
        "计算机视觉应用"
    ]
    embeddings = client.get_embeddings_batch(texts)
    print(f"批量处理了 {len(embeddings)} 个文本")

3.3 语义相似度计算示例

基于嵌入向量计算文本相似度:

def cosine_similarity(vec1, vec2):
    """计算两个向量的余弦相似度"""
    vec1 = np.array(vec1)
    vec2 = np.array(vec2)
    return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))

def calculate_similarities(client, query_text, candidate_texts):
    """计算查询文本与候选文本的相似度"""
    # 获取所有文本的嵌入
    all_texts = [query_text] + candidate_texts
    embeddings = client.get_embeddings_batch(all_texts)
    
    if embeddings:
        query_embedding = embeddings[0]
        candidate_embeddings = embeddings[1:]
        
        similarities = []
        for i, candidate_embedding in enumerate(candidate_embeddings):
            similarity = cosine_similarity(query_embedding, candidate_embedding)
            similarities.append((candidate_texts[i], similarity))
        
        # 按相似度排序
        similarities.sort(key=lambda x: x[1], reverse=True)
        return similarities
    
    return None

# 使用示例
client = GTEEmbeddingClient()

query = "人工智能技术"
candidates = [
    "机器学习算法",
    "深度学习框架",
    "自然语言处理",
    "计算机视觉",
    "数据分析方法"
]

results = calculate_similarities(client, query, candidates)
print("相似度排序结果:")
for text, score in results:
    print(f"{text}: {score:.4f}")

4. 高级应用场景示例

4.1 文档检索系统

构建一个简单的文档检索系统:

class DocumentRetrievalSystem:
    def __init__(self, client):
        self.client = client
        self.documents = []
        self.embeddings = []
    
    def add_documents(self, documents):
        """添加文档到检索系统"""
        self.documents.extend(documents)
        new_embeddings = self.client.get_embeddings_batch(documents)
        if new_embeddings:
            self.embeddings.extend(new_embeddings)
    
    def search(self, query, top_k=5):
        """搜索相关文档"""
        query_embedding = self.client.get_embedding(query)
        if not query_embedding:
            return []
        
        similarities = []
        for i, doc_embedding in enumerate(self.embeddings):
            similarity = cosine_similarity(query_embedding, doc_embedding)
            similarities.append((i, similarity))
        
        # 按相似度排序并返回top_k结果
        similarities.sort(key=lambda x: x[1], reverse=True)
        results = []
        for idx, score in similarities[:top_k]:
            results.append({
                "document": self.documents[idx],
                "score": score,
                "index": idx
            })
        
        return results

# 使用示例
retrieval_system = DocumentRetrievalSystem(client)

# 添加示例文档
documents = [
    "机器学习是人工智能的一个分支,专注于开发能够从数据中学习的算法",
    "深度学习使用多层神经网络来处理复杂的数据模式",
    "自然语言处理使计算机能够理解、解释和生成人类语言",
    "计算机视觉让机器能够识别和理解图像和视频内容",
    "强化学习通过试错来学习最优决策策略"
]

retrieval_system.add_documents(documents)

# 执行搜索
results = retrieval_system.search("如何让计算机理解人类语言", top_k=3)
print("搜索结果:")
for result in results:
    print(f"相似度: {result['score']:.4f}")
    print(f"文档: {result['document']}")
    print("---")

4.2 文本聚类应用

def text_clustering(texts, n_clusters=3):
    """对文本进行聚类分析"""
    from sklearn.cluster import KMeans
    
    # 获取所有文本的嵌入
    embeddings = client.get_embeddings_batch(texts)
    if not embeddings:
        return None
    
    # 使用KMeans进行聚类
    kmeans = KMeans(n_clusters=n_clusters, random_state=42)
    clusters = kmeans.fit_predict(embeddings)
    
    # 组织聚类结果
    results = {}
    for i, cluster_id in enumerate(clusters):
        if cluster_id not in results:
            results[cluster_id] = []
        results[cluster_id].append(texts[i])
    
    return results

# 使用示例
tech_texts = [
    "神经网络和深度学习",
    "卷积神经网络在图像识别中的应用",
    "循环神经网络处理序列数据",
    "支持向量机分类算法",
    "随机森林集成学习方法",
    "梯度下降优化算法"
]

clusters = text_clustering(tech_texts, n_clusters=2)
for cluster_id, texts in clusters.items():
    print(f"聚类 {cluster_id + 1}:")
    for text in texts:
        print(f"  - {text}")
    print()

5. 性能优化与最佳实践

5.1 批量处理优化

当需要处理大量文本时,使用批量接口可以显著提高效率:

def process_large_dataset(texts, batch_size=32):
    """处理大规模文本数据集"""
    all_embeddings = []
    
    for i in range(0, len(texts), batch_size):
        batch_texts = texts[i:i + batch_size]
        batch_embeddings = client.get_embeddings_batch(batch_texts)
        
        if batch_embeddings:
            all_embeddings.extend(batch_embeddings)
        
        print(f"已处理 {min(i + batch_size, len(texts))}/{len(texts)} 个文本")
    
    return all_embeddings

5.2 错误处理与重试机制

增强代码的健壮性:

import time
from requests.exceptions import RequestException

class RobustEmbeddingClient(GTEEmbeddingClient):
    def __init__(self, base_url="http://localhost:9997", max_retries=3):
        super().__init__(base_url)
        self.max_retries = max_retries
    
    def get_embedding_with_retry(self, text, model="gte-base-zh"):
        """带重试机制的嵌入获取"""
        for attempt in range(self.max_retries):
            try:
                return self.get_embedding(text, model)
            except RequestException as e:
                if attempt == self.max_retries - 1:
                    raise e
                print(f"请求失败,第 {attempt + 1} 次重试...")
                time.sleep(2 ** attempt)  # 指数退避
        return None

5.3 嵌入向量缓存

减少重复计算,提高性能:

from functools import lru_cache

class CachedEmbeddingClient(GTEEmbeddingClient):
    @lru_cache(maxsize=1000)
    def get_embedding_cached(self, text, model="gte-base-zh"):
        """带缓存的嵌入获取"""
        return self.get_embedding(text, model)

6. 常见问题与解决方案

6.1 服务连接问题

如果遇到连接问题,可以检查以下方面:

def check_service_status(base_url="http://localhost:9997"):
    """检查服务状态"""
    try:
        response = requests.get(f"{base_url}/v1/models")
        if response.status_code == 200:
            print("服务正常运行")
            models = response.json()
            print(f"可用模型: {models}")
            return True
        else:
            print(f"服务异常,状态码: {response.status_code}")
            return False
    except Exception as e:
        print(f"服务连接失败: {e}")
        return False

# 检查服务状态
check_service_status()

6.2 内存使用优化

处理大量嵌入向量时,注意内存使用:

def process_with_memory_optimization(texts, output_file="embeddings.npy"):
    """内存优化的批量处理"""
    with open(output_file, 'wb') as f:
        for i in range(0, len(texts), 100):  # 分批处理
            batch_texts = texts[i:i + 100]
            embeddings = client.get_embeddings_batch(batch_texts)
            
            if embeddings:
                # 将嵌入向量保存到文件,避免内存积累
                for embedding in embeddings:
                    np.save(f, np.array(embedding))
            
            print(f"处理进度: {min(i + 100, len(texts))}/{len(texts)}")

7. 总结

通过本教程,我们学习了如何使用Python调用Xinference部署的gte-base-zh嵌入模型API。主要内容包括:

核心知识点

  • gte-base-zh模型的基本特性和应用场景
  • Xinference服务的部署和启动方法
  • 使用Python requests库调用嵌入API的基本操作
  • 文本嵌入向量的获取和处理技巧

实用技能

  • 单个文本和批量文本的嵌入处理
  • 基于嵌入向量的语义相似度计算
  • 文档检索系统的构建方法
  • 文本聚类应用的实际实现

性能优化

  • 批量处理提高效率的方法
  • 错误处理和重试机制
  • 内存使用优化策略
  • 嵌入向量缓存技术

gte-base-zh作为一个专门针对中文优化的文本嵌入模型,在语义理解、文本匹配、信息检索等场景中表现出色。通过Xinference提供的标准化API,开发者可以轻松地将这个强大的模型集成到自己的应用中。

在实际使用中,建议根据具体需求调整批量处理大小,合理使用缓存机制,并注意错误处理和服务的监控,以确保应用的稳定性和性能。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐