博查 X Ollama github链接:https://github.com/BochaAI/open-webui-Bocha
博查开放平台(https://open.bochaai.com/)
博查介绍
博查是一个给AI用的世界知识搜索引擎,它可以让你的AI应用连接世界知识,获得干净、准确、高质量的搜索结果。
博查AI开放平台提供Web Search API、Semantic Reranker API等搜索服务,让你的AI应用可以通过API接口直接连接互联网,从近百亿网页和生态内容源中搜索高质量世界知识,包括新闻、图片、视频、百科、机酒、学术等。
博查底层基于多模态混合搜索与语义排序技术的新一代搜索引擎,适用于 AI Agents、AI Chatbots、AI Search 以及各类 RAG 应用的线上应用或数据冷启动。博查在数据安全、成本控制及内容合规性方面表现卓越,确保数据不出海并符合国内安全规范。
Ollama本地部署
Ollama介绍
Ollama是一款专门设计用于在本地环境中部署和定制大型语言模型的工具。它通过提供一个简洁且高效的接口,简化了创建、运行及管理这些模型的过程。此外,Ollama还拥有一个内容丰富的预构建模型库,便于用户将其轻松集成至不同的应用中。其核心目标在于让不论是开发者还是终端用户,在与大型语言模型进行交互或部署这些模型时,都能体验到前所未有的简便性。
下载地址
macOS: https://ollama.com/download/Ollama-darwin.zip
Windows: https://ollama.com/download/OllamaSetup.exe
Linux:
curl -fsSL https://ollama.com/install.sh | sh
以windows为例,打开OllamaSetup.exe,完成ollama的安装过程
打开终端,输入以下命令 来检验Ollama是否已正确安装,若正确安装则会出现下列输出:
ollama
模型选择与下载
Ollama 支持在 ollama.com/library 上提供的模型列表。
以deepseek-r1为例,Ollama支持多种大小的模型选择,在下图1处选取模型大小后,只需要复制2处的指令,在命令行输入即可下载并运行该模型
Ollama的各种指令
-
ollama serve
用于在不运行桌面应用程序的情况下启动 Ollama。 -
下载大模型或者更新本地大模型:如ollama pull deepseek-r1:1.5b可下载deepseek-r1的1.5B大小的模型
ollama pull [本地/远程仓库模型名称]
-
下载且运行本地大模型(若已下载,则直接运行):
ollama run [本地/远程仓库模型名称]
展示本地大模型列表:
ollama list
![]()
删除单个本地大模型:如ollama rm deepseek-r1:1.5b
ollama rm [本地模型名称]
查看本地运行中模型列表:
ollama ps
复制本地大模型:
ollama cp [本地存在的模型名] [新复制模型名]
使用命令行的Ollama指令来使用Deepseek
-
以deepseek-r1的1.5B大小的模型为例,
ollama run deepseek-r1:1.5b
运行程序
ollama run deepseek-r1:1.5b
直接在命令行中输入你好
多行输入:对于多行输入,你可以用 """
包裹文本,逐行输入:
"""Hello,
... world!
... """
若退出程序,可以使用ctrl+d或者输入/bye
来退出程序
更多详细Ollama使用指南如自定义模型等请参考官方文档 更加直观和友好的交互设计,使用户操作更为便捷和高效,我们将部署一个Web可视化聊天界面。
Open-WebUI本地部署
Open WebUI是一个完全离线操作的、可扩展的、功能丰富的用户友好型自托管AI平台。它支持多种LLM运行器,如Ollama和与OpenAI兼容的API,并内置了针对RAG的推理引擎,使其成为一个强大的AI部署解决方案。
Bocha AI插件为Ollama WebUI提供的增强功能:通过实时网络搜索提升您的大型语言模型(LLM)
Bocha的主要特点⭐
🚀 多模态混合搜索:结合关键词匹配、语义理解和多模态分析,以在各种内容格式中提供精确的搜索结果。
⚙️ 语义重排序:通过使用上下文感知AI对搜索结果进行重新排序,从而提升相关性,确保您的大型语言模型(LLM)获得最具权威性和时效性的信息。
🤝 海量知识库:访问一个经过精心编排的近100亿网页和生态系统来源的索引,专为AI驱动的用例优化。
Bocha AI插件将Bocha AI开放平台无缝集成到Ollama的WebUI中,赋予您的大型语言模型(LLMs)实时互联网连接能力和先进的搜索功能。通过利用Bocha AI的搜索API,您的AI应用程序现在可以访问来自数十亿网页和可信内容源的高质量、最新的知识——包括新闻、图片、视频、百科全书、旅游数据、学术论文等。
我们修改了Open WebUI的代码以支持Bocha搜索API,您可以使用此版本让LLMs连接到网络,github链接为https://github.com/BochaAI/open-webui-Bocha
更多关于原始Open WebuUI的细节请参照https://github.com/open-webui/open-webui
安装过程
在安装之前,请确保您使用的是 Python 3.11 以避免兼容性问题。
-
将代码下载到本地
git clone https://github.com/BochaAI/open-webui-Bocha.git cd open-webui-Bocha/
-
将.env.example复制一次副本并改名为.env
-
进入open-webui-Bocha/backend文件夹来构建所需的后端环境
创建一个新环境
conda create --name webui python=3.11
激活新环境
conda activate webui
进入backend文件夹,并安装环境依赖
cd ./backend pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt -U
-
构建所需要的前端环境
返回./open-webui-Bocha文件夹
更换Node.js 工具包镜像源以下载提速
npm config set registry=https://registry.npmmirror.com
可以执行npm config
get
registry
来查看是否设置成功
若出现npm 不是内部或外部命令,也不是可运行的程序或批处理文件
的报错信息,说明本机未安装Nodejs,请参照Nodejs安装指引进行安装
安装前端所需的相应依赖和模块
npm i
构建前端环境
npm run build
若出现Failed to resolve entry for package “xxx“. The package may have incorrect main/module/expo
等的报错信息,则说明可能是package.json 文件中的 main、module 或 exports 字段配置不正确导致的。
通过npm install xxx
进行独立安装
Open-WebUI启动过程
-
进入open-webui-Bocha/backend文件夹下
cd ./backend
对于Linux用户,执行下列命令以启动 Open WebUI 服务器
bash start.sh
对于Windows用户,则执行下列命令
start_windows.bat
-
若出现报错信息
[Errno 10048] error while attempting to bind on address ('0.0.0.0', 8080): 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
,则说明当前端口可能被占用 -
-
a. 输入以下指令来查看占用端口的进程
-
netstat -aon | findstr 8080
-
b. 关闭该进程
taskkill /F /PID 11288
c. 如此即可解决端口占用问题
-
当出现下列界面时则说明已正常运行,此时您可以在 http://localhost:8080 访问该服务器,可单点该链接
-
首次使用时,您需要将账号和密码设置为管理员信息。然后您就可以开始使用该服务了。
-
在 http://localhost:8080 访问该服务器时,出现下列界面则说明Open-WebUI已搭建成功
Open-WebUI的使用过程
-
切换目前所使用的模型
-
将语言更改为中文:admin->Settings->general->Language->简体中文
-
进入博查开放平台(https://open.bochaai.com/),登录之后获取自己的API key 信息
-
设置联网搜索:管理员面板->设置->联网搜索->点开启用联网搜索->选择bocha->输入bochaAPI->保存
-
若想在对话中启用联网搜索,按照如下方式进行点开启用按钮,即可在当前对话中启用联网搜索,正确启用后会有下图提示
-
如下即可正常使用
现有Open-WebUI源码修改以支持Bocha搜索
若您在此之前已通过上述源码的方式将Open-WebUI进行部署,同时希望在已部署的WebUI上进行修改以实现支持Bocha搜索,以下为相关修改教程。
在./config.py上的第1639行回车添加一新行后,添加
BOCHA_SEARCH_API_KEY = PersistentConfig(
"BOCHA_SEARCH_API_KEY",
"rag.web.search.bocha_search_api_key",
os.getenv("BOCHA_SEARCH_API_KEY", ""),
)
在./backend/open_webui/main.py的第182行回车添加一新行后,添加
BOCHA_SEARCH_API_KEY,
第516行回车添加一新行后,添加
app.state.config.BOCHA_SEARCH_API_KEY = BOCHA_SEARCH_API_KEY
在./backend/open_webui/retrieval/web中新建一个bocha.py
的文件,具体内容如下
import logging
from typing import Optional
import requests
import json
from open_webui.retrieval.web.main import SearchResult, get_filtered_results
from open_webui.env import SRC_LOG_LEVELS
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["RAG"])
def _parse_response(response):
result = {}
if "data" in response:
data = response["data"]
if "webPages" in data:
webPages = data["webPages"]
if "value" in webPages:
result["webpage"] = [
{
"id": item.get("id", ""),
"name": item.get("name", ""),
"url": item.get("url", ""),
"snippet": item.get("snippet", ""),
"summary": item.get("summary", ""),
"siteName": item.get("siteName", ""),
"siteIcon": item.get("siteIcon", ""),
"datePublished": item.get("datePublished", "") or item.get("dateLastCrawled", ""),
}
for item in webPages["value"]
]
return result
def search_bocha(
api_key: str, query: str, count: int, filter_list: Optional[list[str]] = None
) -> list[SearchResult]:
"""Search using Bocha's Search API and return the results as a list of SearchResult objects.
Args:
api_key (str): A Bocha Search API key
query (str): The query to search for
"""
url = "https://api.bochaai.com/v1/web-search?utm_source=ollama"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = json.dumps({
"query": query,
"summary": True,
"freshness": "noLimit",
"count": count
})
response = requests.post(url, headers=headers, data=payload, timeout=5)
response.raise_for_status()
results = _parse_response(response.json())
print(results)
if filter_list:
results = get_filtered_results(results, filter_list)
return [
SearchResult(
link=result["url"],
title=result.get("name"),
snippet=result.get("summary")
)
for result in results.get("webpage", [])[:count]
]
在./backend/open_webui/routers/retrieval.py中的第47行回车添加一新行后,添加
from open_webui.retrieval.web.bocha import search_bocha
第381行回车添加一新行后,添加
"bocha_search_api_key": request.app.state.config.BOCHA_SEARCH_API_KEY,
第430添加一新行后添加
bocha_search_api_key: Optional[str] = None
第526行添加一新行后添加
request.app.state.config.BOCHA_SEARCH_API_KEY = (
form_data.web.search.bocha_search_api_key
)
第590行添加一新行后添加
"bocha_search_api_key": request.app.state.config.BOCHA_SEARCH_API_KEY,
第1171行添加一新行后添加
elif engine == "bocha":
if request.app.state.config.BOCHA_SEARCH_API_KEY:
return search_bocha(
request.app.state.config.BOCHA_SEARCH_API_KEY,
query,
request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST,
)
else:
raise Exception("No BOCHA_SEARCH_API_KEY found in environment variables")
在./src/lib/components/admin/Settings/WebSearch.svelte中的第20行添加一新行后添加
'bocha',
第181行添加一新行后添加
{:else if webConfig.search.engine === 'bocha'}
<div>
<div class=" self-center text-xs font-medium mb-1">
{$i18n.t('Bocha Search API Key')}
</div>
<SensitiveInput
placeholder={$i18n.t('Enter Bocha Search API Key')}
bind:value={webConfig.search.bocha_search_api_key}
/>
</div>
在将上述代码进行修改以后,进行前端系统的搭建
进入主目录后执行下列命令来前端系统的重建
npm run build
之后就可以执行start_window.bat
来使用服务。