本地嵌入模型调用成功

在这里插入图片描述

一、本地 Embedding 服务搭建(FastAPI + BGE-M3)

直接使用 SentenceTransformer + FastAPI 搭建本地向量模型服务,完全兼容 Dify OpenAI 格式

1. 安装依赖

pip install torch fastapi uvicorn sentence-transformers transformers huggingface-hub pyyaml

2. 完整运行代码(注意 OpenAI 返回格式)

重点:必须严格返回 OpenAI 格式,否则 Dify 会报 list index out of range

import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"

from fastapi import FastAPI
from sentence_transformers import SentenceTransformer
import uvicorn

app = FastAPI()

# 加载模型
model = SentenceTransformer(
    "BAAI/bge-m3",# 下载的模型名称
    cache_folder="./model"# 下载至工作目录
)

# 定义接口地址
@app.post("/v1/embeddings")
def create_embedding(data: dict):
    input_data = data.get("input", [])
    
    # 转列表
    if isinstance(input_data, str):
        texts = [input_data]
    else:
        texts = input_data

    # 生成向量
    embeddings = model.encode(texts, normalize_embeddings=True).tolist()

    # 严格 OpenAI 格式(必须这样写,否则报错)
    return {
        "object": "list",
        "data": [
            {
                "object": "embedding",
                "embedding": emb,
                "index": i
            } for i, emb in enumerate(embeddings)
        ],
        "model": "BAAI/bge-m3", # 下载的模型名称
        "usage": {
            "prompt_tokens": len(texts),
            "completion_tokens": 0,
            "total_tokens": len(texts)
        }
    }
    
# 启动服务
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=6008)

3. 启动服务

第一次运行会下载向量模型,耐心等待

python embedding_server.py

服务地址:

http://localhost:6008/v1/embeddings

二、Dify 添加本地嵌入模型(关键步骤)

1. 模型供应商 → 选择 OpenAI API 兼容

2. 模型设置

Base URL:http://host.docker.internal:6008/v1
API Key:随便填(如 123456)
模型名称:BAAI/bge-m3" # 或者你下载的模型名称
其他可根据模型与本机配置自行设置

在这里插入图片描述

3. 为什么必须用 host.docker.internal

  • 因为 Dify 运行在 Docker 容器内,容器网络是隔离的
  • 127.0.0.1 → 指向容器自己,不是你的电脑
  • localhost → 同样指向容器内部
  • host.docker.internal → Docker 提供的专用地址,指向真实宿主机

所以**本地启的服务,Dify 容器内必须用 host.docker.internal 才能访问,否则会报错

Connection refused
111: Connection refused
Max retries exceeded

三、为什么会报:list index out of range

99% 的原因:返回格式不是标准 OpenAI 格式,Dify 解析 Embedding 响应时,严格要求:

  • 顶层 object: list
  • data 数组里每个对象必须带:
    • object: embedding
    • embedding: 向量数组
    • index: 序号
  • 必须带 usage 字段

缺少任何一个,都会直接下标越界报错!


四、Dify 版本重要 Bug 说明

我在实际部署中测试了 1.10.0 / 1.12.1 / 1.13.3 三个版本:

1. 问题现象

在使用 Agent / 工作流时,1.12.1、1.13.3 在使用LLM调用Stability Tool的时候,前端直接崩溃

2. 推测原因

可能是 前端 mimetype / 格式解析 出现问题,我没有深入定位源码,但表现非常统一:

  • 发请求 → 后端正常返回
  • 前端直接崩掉

3. 解决方案

回退到 1.10.0 版本,问题完全消失!

git checkout 1.10.0
docker compose down && docker compose up -d --build

根据实测:

  • 1.10.0 暂时还没发现问题(无前端崩溃、无索引异常、无模式 bug)
  • 1.12.1、1.13.3 均存在前端渲染异常
  • 如无新功能需求,建议使用 1.10.0 生产环境
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐