前言

思源3.7后,官网已经接入Agent和语义搜索功能,语义搜索需要agent embedding,实现方式有两种:

  1. 调用商用的agent api,比如qwen-embedding3等模型
  2. 自己搭建。
    我这里选择的方式是第二种,通过ollama部署qwen3-embedding
    环境:Win10,ollama0.31.2,python,fastAPI。

补充

ollama是兼容OPENAI的API的,应该是我URL有误,AI搜索出来的居然是有误的。可以直接使用本地的URL:http://127.0.0.1:11434/v1/
不需要脚本了。

安装ollam

官网链接:ollama,下载完后在cmd输入ollama server启动服务。
在这里插入图片描述
再另外打开一个cmd,输入下面的命令下载所需要的版本。
看自己的显卡显存来

# 下载最新版8B
ollama pull qwen3-embedding
# 系在4B,也可以是0.6B
ollama pull qwen3-embedding:4b

下载qwen3-embedding
在这里插入图片描述
下载完成后,确保ollama已经启动。

python脚本

由于我的ollama版本是0.31.2,已经不支持open api格式,需要使用python脚本进行一层转换。创建ollama_openai_proxy.py脚本

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import httpx
import asyncio

app = FastAPI()

class EmbeddingRequest(BaseModel):
    input: list[str] | str
    model: str
    dimensions: int = 0

@app.post("/v1/embeddings")
async def embeddings(req: EmbeddingRequest):
    """Convert OpenAI embedding API to Ollama API"""
    
    # 标准化输入
    if isinstance(req.input, str):
        texts = [req.input]
    else:
        texts = req.input
    
    # 调用 Ollama API
    async with httpx.AsyncClient() as client:
        try:
            response = await client.post(
                "http://localhost:11434/api/embed",
                json={
                    "model": req.model,
                    "input": texts
                },
                timeout=30.0
            )
            response.raise_for_status()
            ollama_resp = response.json()
        except Exception as e:
            raise HTTPException(status_code=500, detail=str(e))
    
    # 转换为 OpenAI 格式
    embeddings = ollama_resp.get("embeddings", [])
    
    return {
        "object": "list",
        "model": req.model,
        "data": [
            {
                "object": "embedding",
                "index": i,
                "embedding": emb
            }
            for i, emb in enumerate(embeddings)
        ]
    }

@app.get("/v1/models")
async def list_models():
    """Proxy models endpoint"""
    async with httpx.AsyncClient() as client:
        response = await client.get("http://localhost:11434/api/tags")
        response.raise_for_status()
        ollama_resp = response.json()
    
    models = []
    for model in ollama_resp.get("models", []):
        models.append({
            "id": model["name"],
            "object": "model",
            "created": 0,
            "owned_by": "ollama"
        })
    
    return {"object": "list", "data": models}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

在脚本的当前路径打开cmd,安装fastAPI:pip install fastapi uvicon httpx
执行该脚本:python ollama_openai_proxy.py。

思源配置

API基础地址:http://127.0.0.1:8000/v1
模型名称,看自己部署的模型:qwen3-embedding
维度:8B最大维度是4096,4B是2560,0.6b是1024。我这里是2560。
api key:ollama能随便输入,但不能为空,因为siyuan需要。

维度为0也可能导致下方的嵌入索引进度无反应,最好手动输入。
在这里插入图片描述

向量化所耗费的时间很长,尤其是笔记和维度越大,其时间长。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐