WIN10 本地部署 BGE Embedding 向量化模型
WIN10 本地部署 BGE Embedding 向量化模型
- 1.下载 BGE 模型
- 2.安装
- 1.创建虚拟环境
- 2.安装依赖
- 3.本地测试
- 3.将服务封装为HTTP可调用形式
- 1.生成向量值
- 2.相似度测试
1.下载 BGE 模型
Hugging Face 官网
最好是科学上网,或者从其他渠道下载
2.安装
本文通过 Anconda 创建虚拟环境演示,可以直接用本地环境或其他虚拟形式,Anconda 的替代包可以用 Miniforge(命令是与 Anconda 兼容的)
1.创建虚拟环境
## 查看版本
conda -V
## 查看已有环境列表
conda env list
## 创建环境
conda create -n env-bge python=3.10
2.安装依赖
## 激活虚拟环境
conda activate env-bge
## 依赖包
pip install -U FlagEmbedding
3.本地测试
在模型文件所在的目录,打开控制台文件夹,并切换到虚拟环境 env-bge
测试命令
## 激活虚拟环境
conda activate env-bge
## BGE 命令
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel('bge-m3', use_fp16=True)
sentences_1 = ["你多大了"]
sentences_2 = ["你几岁了"]
embeddings_1 = model.encode(sentences_1, batch_size=12, max_length=8192)['dense_vecs']
embeddings_2 = model.encode(sentences_2)['dense_vecs']
similarity = embeddings_1 @ embeddings_2.T
3.将服务封装为HTTP可调用形式
1.生成向量值
# encoding=utf-8
import http.server
import socketserver
import urllib.parse
from FlagEmbedding import FlagModel
# 设置HTTP服务的端口号
HOST = '0.0.0.0'
PORT = 8800
# 读取模型
model_zh = FlagModel('ZH\\bge-large-zh', use_fp16=True)
model_en = FlagModel('EN\\bge-large-en', use_fp16=True)
model_m3 = FlagModel('M3\\bge-m3', use_fp16=True)
# 创建一个请求处理类,继承自BaseHTTPRequestHandler
class SimpleHTTPRequestHandler(http.server.BaseHTTPRequestHandler):
# 处理GET请求的方法
def do_GET(self):
try:
query_string = self.path.split('?')[-1]
params = urllib.parse.parse_qs(query_string)
# 解析GET参数
md_type = params.get('type', [''])[0]
content = params.get('content', [''])[0]
# print(f"params content_1:{content_1} \n content_2:{content_2}")
if md_type == 'zh':
embeddings = model_zh.encode(content)
elif md_type == 'en':
embeddings = model_en.encode(content)
elif md_type == 'm3':
embeddings = model_m3.encode(content)
else:
embeddings = 'md type is error'
# print(result)
# print(type(embeddings))
# 返回
self.send_response(200) # 设置响应状态码为200
self.send_header('Content-type', 'text/plain') # 设置响应头
self.end_headers() # 结束响应头的发送
if type(embeddings) == str :
self.wfile.write(embeddings.encode()) # 向客户端发送响应内容
else:
self.wfile.write(str(embeddings.tolist()).encode()) # 向客户端发送响应内容
except Exception as e:
print(e)
# 创建并启动服务
httpd = socketserver.TCPServer((HOST, PORT), SimpleHTTPRequestHandler)
print(f'Serving at http://{HOST}:{PORT}')
httpd.serve_forever()
启动方式,激活虚拟环境,直接运行脚本
测试1错误的类型
http://127.0.0.1:8800?type=md&content=你好
测试2生成你好的向量值,结果长度 1024
http://127.0.0.1:8800?type=zh&content=你好
测试3生成Hello的向量值,结果长度 1024
2.相似度测试
# encoding=utf-8
import http.server
import socketserver
import urllib.parse
from FlagEmbedding import FlagModel
# 设置HTTP服务的端口号
HOST = '0.0.0.0'
PORT = 8800
# 读取模型
model_zh = FlagModel('ZH\\bge-large-zh', use_fp16=True)
model_en = FlagModel('EN\\bge-large-en', use_fp16=True)
model_m3 = FlagModel('M3\\bge-m3', use_fp16=True)
# 创建一个请求处理类,继承自BaseHTTPRequestHandler
class SimpleHTTPRequestHandler(http.server.BaseHTTPRequestHandler):
# 处理GET请求的方法
def do_GET(self):
try:
query_string = self.path.split('?')[-1]
params = urllib.parse.parse_qs(query_string)
# 解析GET参数
md_type = params.get('type', [''])[0]
# 解析GET参数
content_1 = params.get('content_1', [''])[0]
content_2 = params.get('content_2', [''])[0]
# print(f"params content_1:{content_1} \n content_2:{content_2}")
type=1
embeddings_1=[]
embeddings_2=[]
if md_type == 'zh':
embeddings_1 = model_zh.encode(content_1)
embeddings_2 = model_zh.encode(content_2)
elif md_type == 'en':
embeddings_1 = model_zh.encode(content_1)
embeddings_2 = model_zh.encode(content_2)
elif md_type == 'm3':
embeddings_1 = model_zh.encode(content_1)
embeddings_2 = model_zh.encode(content_2)
else:
type = 2
# print(result)
# print(type(embeddings))
# 返回
self.send_response(200) # 设置响应状态码为200
self.send_header('Content-type', 'text/plain') # 设置响应头
self.end_headers() # 结束响应头的发送
if type == 2 :
self.wfile.write('md type is error'.encode()) # 向客户端发送响应内容
else:
result = embeddings_1 @ embeddings_2.T
self.wfile.write(str(result.tolist()).encode()) # 向客户端发送响应内容
except Exception as e:
print(e)
# 创建并启动服务
httpd = socketserver.TCPServer((HOST, PORT), SimpleHTTPRequestHandler)
print(f'Serving at http://{HOST}:{PORT}')
httpd.serve_forever()
启动方式,激活虚拟环境,直接运行脚本
调用
http://127.0.0.1:8800?type=zh&content_1=小明把小红的自行车骑坏了&content_2=被小明骑坏的自行车是小红的
换成相反说法,相似度仍然很高,看来是有点小问题的
http://127.0.0.1:8800?type=zh&content_1=小明把小红的自行车骑坏了&content_2=被小红骑坏的自行车是小明的