tao-8k实战教程:Python调用Xinference API获取文本嵌入向量

张开发
2026/4/19 13:15:47 15 分钟阅读

分享文章

tao-8k实战教程:Python调用Xinference API获取文本嵌入向量
tao-8k实战教程Python调用Xinference API获取文本嵌入向量1. 引言为什么你需要关注tao-8k如果你正在处理文本数据无论是构建智能搜索、文档分类还是开发推荐系统一个核心需求就是如何让计算机“理解”文字的含义传统的关键词匹配已经不够用了我们需要的是语义理解。这就是文本嵌入向量的价值所在。它能把一段文字转换成一串数字向量语义相似的文本它们的向量在数学空间里也会很接近。你可以把它想象成给每段文字一个“数字指纹”通过比较指纹的相似度就能找到意思相近的内容。今天要介绍的tao-8k就是一个专门干这事的强力工具。它最大的亮点是支持长达8192个token的上下文约等于6000多个汉字。这意味着它不仅能处理一句话、一段话甚至能处理一整篇长文章并把它浓缩成一个有意义的向量。这在处理技术文档、长篇小说、法律合同等场景时优势非常明显。本教程将手把手教你如何在已经部署好tao-8k模型的环境中使用Python代码轻松调用它的API快速获取文本的嵌入向量。整个过程非常简单即使你之前没怎么接触过API调用也能跟着一步步做出来。2. 环境确认你的tao-8k准备好了吗在开始写代码之前我们需要确保两件事模型服务已经成功启动并且我们知道怎么连接到它。2.1 确认模型服务状态根据你提供的部署信息tao-8k模型已经通过Xinference部署好了。首先我们检查一下服务是否在正常运行。打开终端运行以下命令查看日志cat /root/workspace/xinference.log如果看到日志中包含了模型加载成功的信息类似于你截图中显示的模型注册和启动成功的记录就说明服务已经就绪。初次加载模型可能需要一些时间这是正常的。2.2 获取API连接信息Xinference启动后会提供一个Web界面和一个API服务端点。我们需要找到API的地址和端口。通常Xinference的Web UI地址是http://服务器IP:端口。你可以通过浏览器访问这个地址进入管理界面。在界面上你可以看到所有已启动的模型包括tao-8k。对于我们后续的Python调用最关键的信息是API基础地址例如http://127.0.0.1:9997具体IP和端口请以你的实际部署为准。模型UID这是Xinference为每个运行的模型实例分配的唯一标识符。你可以在Web UI的模型列表中找到它通常格式类似embedding-xxxxxx。记下这两条信息我们马上就会用到。3. 核心实战用Python获取嵌入向量现在进入最核心的部分写Python代码。我们将使用最常见的requests库来调用API。3.1 安装必要的库首先确保你的Python环境里安装了requests库。如果没有在终端里用pip安装一下pip install requests3.2 编写第一个调用脚本我们来写一个最简单的脚本向tao-8k模型发送一段文本并获取它的向量。创建一个名为get_embedding.py的文件。import requests import json # 1. 配置你的Xinference服务器地址和模型UID # 注意将下面的地址和UID替换成你自己的 XINFERENCE_BASE_URL http://127.0.0.1:9997 # 你的Xinference API地址 MODEL_UID embedding-xxxxxx # 你的tao-8k模型UID # 2. 构建完整的API端点 # Xinference的嵌入模型调用端点通常是 /v1/embeddings api_endpoint f{XINFERENCE_BASE_URL}/v1/embeddings # 3. 准备请求头和数据 headers { Content-Type: application/json } # 你想转换成向量的文本 input_text 深度学习是人工智能的一个重要分支它通过模拟人脑的神经网络结构来处理数据。 data { model: MODEL_UID, # 指定使用哪个模型 input: input_text # 传入文本 } # 4. 发送POST请求 try: response requests.post(api_endpoint, headersheaders, datajson.dumps(data)) response.raise_for_status() # 如果请求失败4xx或5xx抛出异常 # 5. 解析返回的JSON数据 result response.json() # 打印整个返回结果用于调试了解数据结构 print(完整的API响应) print(json.dumps(result, indent2, ensure_asciiFalse)) # 6. 提取嵌入向量 # 响应结构通常包含一个 data 列表里面是嵌入对象 if data in result and len(result[data]) 0: embedding_vector result[data][0][embedding] print(f\n文本的嵌入向量前10维{embedding_vector[:10]}...) print(f向量总维度{len(embedding_vector)}) else: print(未在响应中找到嵌入向量数据。) except requests.exceptions.RequestException as e: print(f请求出错{e}) except json.JSONDecodeError as e: print(f解析JSON响应出错{e})运行这个脚本python get_embedding.py如果一切配置正确你会看到控制台打印出API返回的完整JSON数据以及你输入的文本所对应的向量通常是一个很长的浮点数列表我们只打印了前10个值看看样子。3.3 处理更复杂的输入文本列表很多时候我们需要一次性处理多个文本而不是一个一个来。tao-8k的API同样支持。修改一下data部分即可# 准备一个文本列表 text_list [ 今天天气真好适合去公园散步。, 人工智能技术正在改变我们的生活。, 这家餐厅的意大利面非常美味。 ] data { model: MODEL_UID, input: text_list # 直接传入列表 } # ... 后续请求和解析代码不变 ...运行后你会在响应的data字段里得到一个列表其中按顺序包含了每个输入文本的嵌入向量。3.4 计算文本相似度进阶获取向量不是最终目的利用向量做事情才是。最常见的应用之一就是计算两段文本的语义相似度。原理很简单分别获取两段文本的向量然后计算它们之间的余弦相似度。我们来写一个函数实现这个功能import numpy as np from numpy.linalg import norm def get_embedding_for_text(text, api_endpoint, model_uid): 获取单个文本的嵌入向量 headers {Content-Type: application/json} data {model: model_uid, input: text} response requests.post(api_endpoint, headersheaders, datajson.dumps(data)) response.raise_for_status() result response.json() if data in result and len(result[data]) 0: return np.array(result[data][0][embedding]) else: raise ValueError(未能获取到嵌入向量) def calculate_cosine_similarity(vec_a, vec_b): 计算两个向量的余弦相似度 # 余弦相似度 (A·B) / (||A|| * ||B||) dot_product np.dot(vec_a, vec_b) norm_a norm(vec_a) norm_b norm(vec_b) if norm_a 0 or norm_b 0: return 0.0 return dot_product / (norm_a * norm_b) # 使用示例 text1 我喜欢吃苹果和香蕉。 text2 水果中苹果和香蕉是我的最爱。 text3 编程需要学习Python和Java。 try: vec1 get_embedding_for_text(text1, api_endpoint, MODEL_UID) vec2 get_embedding_for_text(text2, api_endpoint, MODEL_UID) vec3 get_embedding_for_text(text3, api_endpoint, MODEL_UID) sim_1_2 calculate_cosine_similarity(vec1, vec2) sim_1_3 calculate_cosine_similarity(vec1, vec3) print(f文本1与文本2的相似度{sim_1_2:.4f}) print(f文本1与文本3的相似度{sim_1_3:.4f}) # 解释结果相似度越接近1语义越相似越接近0越不相关。 if sim_1_2 0.8: print(结论文本1和文本2在语义上非常相似。) elif sim_1_3 0.3: print(结论文本1和文本3在语义上基本不相关。) except Exception as e: print(f计算过程中出错{e})运行这段代码你会直观地看到谈论相似话题的文本关于水果其向量相似度很高而话题迥异的文本相似度则很低。这就是语义搜索和文本分类的基础。4. 实际应用场景与代码片段知道了怎么调用我们来看看它能用在哪些地方。这里提供几个可直接使用的代码思路。4.1 场景一构建简易语义搜索引擎假设你有一个文档库想根据用户输入的问题找到最相关的文档。class SimpleSemanticSearch: def __init__(self, api_endpoint, model_uid): self.api_endpoint api_endpoint self.model_uid model_uid self.documents [] # 存储原始文本 self.embeddings [] # 存储对应的向量 def add_document(self, text): 向搜索引擎添加一个文档 self.documents.append(text) vec get_embedding_for_text(text, self.api_endpoint, self.model_uid) self.embeddings.append(vec) print(f已添加文档当前总数{len(self.documents)}) def search(self, query, top_k3): 搜索与查询最相关的top_k个文档 query_vec get_embedding_for_text(query, self.api_endpoint, self.model_uid) # 计算查询向量与所有文档向量的相似度 similarities [] for doc_vec in self.embeddings: sim calculate_cosine_similarity(query_vec, doc_vec) similarities.append(sim) # 获取相似度最高的前top_k个索引 top_indices np.argsort(similarities)[-top_k:][::-1] # 返回结果 results [] for idx in top_indices: results.append({ document: self.documents[idx], similarity: similarities[idx] }) return results # 使用示例 search_engine SimpleSemanticSearch(api_endpoint, MODEL_UID) search_engine.add_document(Python是一种高级编程语言以简洁易读著称。) search_engine.add_document(深度学习模型需要大量的数据和计算资源进行训练。) search_engine.add_document(巴黎是法国的首都以其艺术文化和美食闻名。) query 如何学习编程语言 results search_engine.search(query) print(f查询{query}) for i, res in enumerate(results): print(f{i1}. 相似度 {res[similarity]:.3f}: {res[document][:50]}...)4.2 场景二文本自动分类给你一堆新闻标题自动把它们分到“科技”、“体育”、“娱乐”等类别。def train_classifier(category_examples): 训练一个简单的分类器。 category_examples: 字典键为类别名值为该类别的示例文本列表。 返回每个类别的“平均向量”作为类别中心。 category_centers {} for category, texts in category_examples.items(): print(f正在处理类别: {category}) vectors [] for text in texts: vec get_embedding_for_text(text, api_endpoint, MODEL_UID) vectors.append(vec) # 计算该类别的平均向量 category_center np.mean(vectors, axis0) category_centers[category] category_center return category_centers def predict_category(text, category_centers): 预测文本最可能属于哪个类别 text_vec get_embedding_for_text(text, api_endpoint, MODEL_UID) best_category None best_similarity -1 for category, center_vec in category_centers.items(): sim calculate_cosine_similarity(text_vec, center_vec) if sim best_similarity: best_similarity sim best_category category return best_category, best_similarity # 示例定义几个类别和示例 training_data { 科技: [苹果发布新款iPhone, 人工智能取得新突破, SpaceX成功发射卫星], 体育: [湖人队赢得NBA总冠军, 世界杯决赛精彩纷呈, 运动员打破世界纪录], 财经: [股市今日大幅上涨, 央行宣布新的利率政策, 公司发布年度财报] } # 训练分类器计算每个类别的中心向量 centers train_classifier(training_data) # 对新文本进行分类 new_headlines [ 特斯拉推出全新电动汽车模型, 欧冠联赛半决赛即将打响, 美联储会议决定维持利率不变 ] for headline in new_headlines: category, score predict_category(headline, centers) print(f标题{headline} - 预测类别{category} (置信度{score:.3f}))5. 常见问题与排错指南第一次尝试难免会遇到一些问题。这里汇总了几个常见的坑和解决办法。Q1: 请求时报错ConnectionError或ConnectTimeout。检查XINFERENCE_BASE_URL的IP和端口是否正确。如果Xinference运行在远程服务器请确保地址可从你的Python环境访问。解决尝试在浏览器中访问http://你的IP:端口看是否能打开Xinference的Web UI。如果不能可能是服务未启动或网络不通。Q2: 请求返回404 Not Found错误。检查API端点路径是否正确。Xinference的v1嵌入接口通常是/v1/embeddings。另外确认MODEL_UID是否与Web UI中显示的完全一致。解决登录Xinference Web UI在模型详情页查看正确的API调用地址和模型UID。Q3: 请求返回422 Unprocessable Entity或400 Bad Request。检查请求的JSON格式是否正确特别是input字段。它可以是字符串也可以是字符串列表。解决确保你的data字典是用json.dumps()正确序列化的。可以先用print(json.dumps(data))看看生成的JSON字符串。Q4: 处理长文本时感觉速度慢。原因tao-8k支持8K长度处理长文本本身计算量就大且网络传输的数据量也大。优化对于批量处理尽量将文本列表一次性传入而不是循环调用。如果对实时性要求不高可以考虑异步调用。Q5: 向量相似度计算的结果不理想。理解嵌入模型的效果受训练数据影响。tao-8k在通用文本上表现不错但在非常专业或特殊领域的文本上可能需要领域内数据进一步微调。尝试对于特定任务可以先用一些已知相似/不相似的文本对测试一下模型在你领域的效果。6. 总结通过这篇教程我们完整地走通了使用Python调用tao-8k嵌入模型API的流程。从环境确认、基础调用到实际应用和问题排查你应该已经掌握了这项实用的技能。回顾一下关键步骤确认服务确保Xinference和tao-8k模型正常运行。获取信息找到API地址XINFERENCE_BASE_URL和模型标识MODEL_UID。编写调用使用requests库向/v1/embeddings端点发送POST请求。处理结果从返回的JSON中提取embedding字段得到文本的向量表示。投入应用利用向量进行相似度计算、语义搜索、文本分类等。tao-8k的8K长文本支持能力让它特别适合处理文档、报告、论文等需要理解整体上下文的任务。你可以尝试将本教程中的代码应用到你的具体项目中比如构建知识库问答系统、实现智能文档归类或者开发个性化的内容推荐引擎。动手试一试感受一下语义向量带来的变化吧。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章