自己做的网站 360不兼容单页网站设计制作
自己做的网站 360不兼容,单页网站设计制作,蚌埠app制作公司,企业网站策划书BGE-Large-Zh实战教程#xff1a;将BGE-Large-Zh嵌入Flask/FastAPI构建微服务API
1. 项目概述
BGE-Large-Zh是基于FlagEmbedding库和BAAI/bge-large-zh-v1.5模型开发的语义向量化工具#xff0c;专门针对中文语境优化。这个工具能够将中文文本转换为高维语义向量#xff0…BGE-Large-Zh实战教程将BGE-Large-Zh嵌入Flask/FastAPI构建微服务API1. 项目概述BGE-Large-Zh是基于FlagEmbedding库和BAAI/bge-large-zh-v1.5模型开发的语义向量化工具专门针对中文语境优化。这个工具能够将中文文本转换为高维语义向量并通过向量计算实现文本相似度分析。核心功能包括文本转向量转换、多查询多文档相似度矩阵计算并提供交互式热力图和最佳匹配结果可视化。工具会自动检测运行环境在GPU环境下启用FP16精度加速无GPU时降级到CPU运行完全本地推理无需网络依赖。2. 环境准备与安装2.1 系统要求Python 3.8pip 包管理工具可选NVIDIA GPUCUDA 11.7用于加速2.2 安装依赖# 创建虚拟环境 python -m venv bge-env source bge-env/bin/activate # Linux/Mac # 或 bge-env\Scripts\activate # Windows # 安装核心依赖 pip install FlagEmbedding flask fastapi uvicorn numpy pandas matplotlib seaborn2.3 模型下载工具会自动下载BAAI/bge-large-zh-v1.5模型如果需要手动下载或离线使用# 手动下载模型 from transformers import AutoModel, AutoTokenizer model AutoModel.from_pretrained(BAAI/bge-large-zh-v1.5) tokenizer AutoTokenizer.from_pretrained(BAAI/bge-large-zh-v1.5)3. 核心功能实现3.1 文本向量化模块from FlagEmbedding import FlagModel import torch class BGEEncoder: def __init__(self): self.device cuda if torch.cuda.is_available() else cpu self.model FlagModel( BAAI/bge-large-zh-v1.5, query_instruction_for_retrieval为这个句子生成表示以用于检索相关文章, use_fp16(self.device cuda) ) def encode_queries(self, queries): 编码查询文本添加增强指令前缀 return self.model.encode_queries(queries) def encode_documents(self, documents): 编码文档文本 return self.model.encode(documents)3.2 相似度计算模块import numpy as np from sklearn.metrics.pairwise import cosine_similarity class SimilarityCalculator: staticmethod def calculate_similarity(query_vectors, doc_vectors): 计算查询向量和文档向量的相似度矩阵 similarity_matrix cosine_similarity(query_vectors, doc_vectors) return similarity_matrix staticmethod def find_best_matches(similarity_matrix, queries, documents): 为每个查询找到最佳匹配文档 best_matches [] for i, query in enumerate(queries): best_idx np.argmax(similarity_matrix[i]) best_score similarity_matrix[i][best_idx] best_matches.append({ query: query, best_document: documents[best_idx], score: float(best_score), document_index: int(best_idx) }) return best_matches4. Flask微服务实现4.1 Flask应用结构from flask import Flask, request, jsonify, render_template import numpy as np import json app Flask(__name__) bge_encoder BGEEncoder() similarity_calculator SimilarityCalculator() app.route(/) def index(): 主页面 return render_template(index.html) app.route(/api/encode, methods[POST]) def encode_text(): 文本编码API data request.json text_type data.get(type, document) texts data.get(texts, []) if text_type query: vectors bge_encoder.encode_queries(texts) else: vectors bge_encoder.encode_documents(texts) return jsonify({ vectors: vectors.tolist(), dimension: vectors.shape[1] }) app.route(/api/similarity, methods[POST]) def calculate_similarity(): 相似度计算API data request.json queries data.get(queries, []) documents data.get(documents, []) # 编码文本 query_vectors bge_encoder.encode_queries(queries) doc_vectors bge_encoder.encode_documents(documents) # 计算相似度 similarity_matrix similarity_calculator.calculate_similarity( query_vectors, doc_vectors ) # 找到最佳匹配 best_matches similarity_calculator.find_best_matches( similarity_matrix, queries, documents ) return jsonify({ similarity_matrix: similarity_matrix.tolist(), best_matches: best_matches, query_vectors: query_vectors.tolist(), doc_vectors: doc_vectors.tolist() }) if __name__ __main__: app.run(host0.0.0.0, port5000, debugTrue)4.2 前端界面模板创建templates/index.html!DOCTYPE html html head titleBGE-Large-Zh 语义向量化工具/title style .container { max-width: 1200px; margin: 0 auto; padding: 20px; } .input-section { display: flex; gap: 20px; margin-bottom: 20px; } .input-box { flex: 1; } textarea { width: 100%; height: 200px; padding: 10px; } .btn { background: #6a0dad; color: white; padding: 10px 20px; border: none; cursor: pointer; } .result-section { margin-top: 30px; } .match-card { background: #f0e6ff; padding: 15px; margin: 10px 0; border-left: 4px solid #6a0dad; } /style /head body div classcontainer h1BGE-Large-Zh 语义向量化工具/h1 div classinput-section div classinput-box h3查询语句/h3 textarea idqueries谁是李白 感冒了怎么办 苹果公司的股价/textarea /div div classinput-box h3候选文档/h3 textarea iddocuments李白是唐代著名的浪漫主义诗人被后人誉为诗仙。 感冒是一种常见的呼吸道疾病建议多休息、多喝水。 苹果公司是一家美国跨国科技公司总部位于加利福尼亚。 苹果是一种水果富含维生素和矿物质。 今天天气晴朗适合外出活动。/textarea /div /div button classbtn onclickcalculateSimilarity()计算语义相似度/button div classresult-section div idresults/div /div /div script async function calculateSimilarity() { const queries document.getElementById(queries).value.split(\n).filter(q q.trim()); const documents document.getElementById(documents).value.split(\n).filter(d d.trim()); const response await fetch(/api/similarity, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ queries, documents }) }); const data await response.json(); displayResults(data); } function displayResults(data) { // 结果显示逻辑 document.getElementById(results).innerHTML h3最佳匹配结果/h3 ${data.best_matches.map(match div classmatch-card strong查询/strong${match.query}br strong最佳匹配/strong${match.best_document}br strong相似度/strong${match.score.toFixed(4)} /div ).join()} ; } /script /body /html5. FastAPI微服务实现5.1 FastAPI应用结构from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from typing import List import uvicorn app FastAPI(titleBGE-Large-Zh API, version1.0.0) # CORS配置 app.add_middleware( CORSMiddleware, allow_origins[*], allow_methods[*], allow_headers[*], ) # 数据模型 class EncodeRequest(BaseModel): texts: List[str] text_type: str document class SimilarityRequest(BaseModel): queries: List[str] documents: List[str] # 初始化编码器 bge_encoder BGEEncoder() app.get(/) async def root(): return {message: BGE-Large-Zh API Service} app.post(/encode) async def encode_text(request: EncodeRequest): try: if request.text_type query: vectors bge_encoder.encode_queries(request.texts) else: vectors bge_encoder.encode_documents(request.texts) return { vectors: vectors.tolist(), dimension: vectors.shape[1], count: len(request.texts) } except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.post(/similarity) async def calculate_similarity(request: SimilarityRequest): try: query_vectors bge_encoder.encode_queries(request.queries) doc_vectors bge_encoder.encode_documents(request.documents) similarity_matrix SimilarityCalculator.calculate_similarity( query_vectors, doc_vectors ) best_matches SimilarityCalculator.find_best_matches( similarity_matrix, request.queries, request.documents ) return { similarity_matrix: similarity_matrix.tolist(), best_matches: best_matches, query_count: len(request.queries), document_count: len(request.documents) } except Exception as e: raise HTTPException(status_code500, detailstr(e)) if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)5.2 异步处理优化对于高并发场景可以使用异步处理from fastapi import BackgroundTasks import asyncio app.post(/async/encode) async def async_encode_text(request: EncodeRequest, background_tasks: BackgroundTasks): # 异步处理编码任务 async def encode_async(): return await asyncio.to_thread( bge_encoder.encode_queries if request.text_type query else bge_encoder.encode_documents, request.texts ) vectors await encode_async() return {vectors: vectors.tolist()}6. 部署与性能优化6.1 Docker容器化部署创建DockerfileFROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8000]创建docker-compose.ymlversion: 3.8 services: bge-api: build: . ports: - 8000:8000 environment: - PYTHONPATH/app volumes: - ./models:/app/models deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu]6.2 性能优化建议# 批量处理优化 class OptimizedBGEEncoder: def __init__(self, batch_size32): self.batch_size batch_size self.model FlagModel(BAAI/bge-large-zh-v1.5, use_fp16True) def encode_batch(self, texts, is_queryFalse): 批量编码优化 results [] for i in range(0, len(texts), self.batch_size): batch texts[i:i self.batch_size] if is_query: encoded self.model.encode_queries(batch) else: encoded self.model.encode(batch) results.append(encoded) return np.vstack(results)7. 实际应用案例7.1 智能客服系统集成class CustomerServiceIntegration: def __init__(self, api_urlhttp://localhost:8000): self.api_url api_url async def find_best_answer(self, user_query, knowledge_base): 为用户查询找到最佳答案 async with httpx.AsyncClient() as client: response await client.post( f{self.api_url}/similarity, json{ queries: [user_query], documents: knowledge_base } ) if response.status_code 200: result response.json() best_match result[best_matches][0] return best_match[best_document], best_match[score] else: return 抱歉暂时无法回答您的问题, 0.07.2 文档检索系统class DocumentRetrievalSystem: def __init__(self): self.encoder BGEEncoder() self.document_vectors None self.documents [] def index_documents(self, documents): 建立文档索引 self.documents documents self.document_vectors self.encoder.encode_documents(documents) def search(self, query, top_k5): 搜索相关文档 query_vector self.encoder.encode_queries([query]) similarities cosine_similarity(query_vector, self.document_vectors)[0] # 获取top-k结果 top_indices np.argsort(similarities)[::-1][:top_k] results [] for idx in top_indices: results.append({ document: self.documents[idx], score: float(similarities[idx]), rank: len(results) 1 }) return results8. 总结通过本教程我们学习了如何将BGE-Large-Zh模型集成到Flask和FastAPI中构建功能完整的语义向量化微服务。这个方案提供了核心优势本地化部署保障数据安全自动硬件适配最大化性能简单易用的API接口丰富的结果可视化灵活的可扩展架构适用场景企业知识库检索智能客服系统内容推荐引擎文档相似度分析学术研究工具下一步建议尝试集成到现有的业务系统中探索更多的应用场景和优化方案考虑模型微调以适应特定领域实现更复杂的功能如聚类分析、主题建模等这个工具为中文文本处理提供了强大的语义理解能力无论是研究还是商业应用都具有很高的价值。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。