使用open-webui+deepseek构建本地AI知识库

本文主要研究一下如何使用OpenWebUI+deepseek构建本地AI知识库

步骤

拉取open-webui镜像

docker pull ghcr.io/open-webui/open-webui:main

docker启动

docker run -d -p 3000:8080 \
-e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
ghcr.io/open-webui/open-webui:main

执行完之后等一会(大概要三四分钟)启动起来了访问http://localhost:3000/,注册管理员账号,注册完要等一会(估计要七八分钟)页面才出来
可以-v ./open-webui-data:/app/backend/data来挂载数据

看日志是有报错

ERROR [open_webui.routers.openai] Connection error: Cannot connect to host api.openai.com:443 ssl:default [Connect call failed ('108.160.165.173', 443)]
ERROR [open_webui.routers.openai] Connection error: Cannot connect to host api.openai.com:443 ssl:default [Connect call failed ('108.160.165.173', 443)]
ERROR [open_webui.routers.openai] Connection error: Cannot connect to host api.openai.com:443 ssl:default [Connect call failed ('108.160.165.173', 443)]
ERROR [open_webui.routers.openai] Connection error: Cannot connect to host api.openai.com:443 ssl:default [Connect call failed ('108.160.165.173', 443)]
INFO  [open_webui.routers.ollama] get_all_models()
INFO  [open_webui.routers.ollama] get_all_models()
INFO  [open_webui.routers.ollama] get_all_models()
INFO  [open_webui.routers.ollama] get_all_models()

登录之后,设置 --> 管理员设置 --> 外部链接,禁用掉OpenAI API,记得保存

开启联网搜索

在设置 --> 管理员设置 --> 联网搜索 --> 启用,然后下拉选择,这里选择tavily,可以去https://app.tavily.com/注册然后获取api key,最后点击保存就可以了

在这里插入图片描述

示例:今天日期是多少,看open-webui输出

INFO  [open_webui.routers.retrieval] save_docs_to_vector_db: document 在线时钟:当前时间, 世界时钟 :: 美国 (United States) - 当前时间, 今天日期, 今天的日期 🇨🇳, 现在北京时间 在线标准北京时间校对 web-search-d8b3e7117d85062f511572e3004ad60997448e8ed9e9b7e3bac5
INFO  [open_webui.routers.retrieval] adding to collection web-search-d8b3e7117d85062f511572e3004ad60997448e8ed9e9b7e3bac5
/pytorch/third_party/ideep/mkl-dnn/src/cpu/aarch64/xbyak_aarch64/src/util_impl_linux.h, 451: Can't read MIDR_EL1 sysfs entry
INFO  [open_webui.retrieval.utils] query_doc:result [['7ee3e76c-7804-4eb7-8dbb-7ca27b0a54ca', 'ef5b7e5c-8a7e-4220-800e-9390e9808034', '97e23c2b-43f7-457a-a086-8b264acb90e8']] [[{'description': '世界时间 - 美国 (United States) - 现在世界各地是什么时间?', 'embedding_config': '{"engine": "", "model": "sentence-transformers/all-MiniLM-L6-v2"}', 'language': 'zh', 'source': 'https://24timezones.com/美国/时间', 'start_index': 3508, 'title': '世界时钟 :: 美国 (United States) - 当前时间'}, {'description': '根據您所在的位置找出今天是什麼日期。了解格式為 mm-dd-yyyy 的確切數字日期。', 'embedding_config': '{"engine": "", "model": "sentence-transformers/all-MiniLM-L6-v2"}', 'language': 'zh', 'source': 'https://thetimecalculator.org/zh/today-date', 'start_index': 1773, 'title': '今天日期'}, {'description': '世界时间 - 美国 (United States) - 现在世界各地是什么时间?', 'embedding_config': '{"engine": "", "model": "sentence-transformers/all-MiniLM-L6-v2"}', 'language': 'zh', 'source': 'https://24timezones.com/美国/时间', 'start_index': 2775, 'title': '世界时钟 :: 美国 (United States) - 当前时间'}]]

结果如下:
根据上下文中的信息,今天的日期是 星期一, 二月 17, 2025 [source_id=1]。
在这里插入图片描述

知识库管理

  • 设置 --> 管理员设置 --> 文档 --> 语义向量模型引擎 改为ollama, 语义向量模型改为bge-m3:latest
  • 工作空间 --> 知识库,点击+号上传文档
  • 使用时需要在聊天框通过#来指定知识库
  • 设置 --> 管理员设置 --> 数据库 --> 下载数据库,可以导出sqlite数据

小结

整体体验是docker部署起来,页面展示有点慢,联网搜索一开始选择serply不生效,换成tavily可以生效,但是国内的搜索引擎还不支持。对于知识库方面,可以上传文档和目录,聊天窗口可以指定使用哪个知识库,也可以同时开启联网搜索,整体效果还可以,可以同时引用知识库和搜索引擎的检索结果,看日志还会保存到向量数据库(save_docs_to_vector_db)。

doc

<think>嗯,用户在使用OpenWebUI导入知识库上传文件时遇到了两个错误:'Skipping data after last boundary'和'NoneType' object has no attribute 'encode'。我需要先理解这两个错误的原因,然后找出解决方案。 首先,'Skipping data after last boundary'这个错误通常和HTTP请求中的multipart/form-data格式有关。当上传文件时,如果请求的边界(boundary)设置不正确,或者数据在边界之后还有内容,服务器可能会报这个错。可能是因为前端生成的边界与实际请求中的不一致,或者请求体格式不正确。 然后是第二个错误:'NoneType' object has no attribute 'encode'。这表示在代码中某个地方尝试调用None值的encode方法。通常是因为某个变量没有被正确初始化,比如文件对象或表单字段为空,导致在编码时出现AttributeError。 接下来要考虑可能的解决方法。首先,检查文件上传的格式是否正确,确保前端生成的boundary与请求头中的Content-Type一致。可能需要检查浏览器的开发者工具中的网络请求,查看请求头中的boundary是否与请求体中的匹配。 另外,文件损坏或格式不支持也可能导致这个问题。用户应该确认上传的文件是否完整,并且是OpenWebUI支持的格式,比如PDF、TXT等。尝试重新保存文件或用其他文件测试可能会有帮助。 环境依赖的问题也不能忽视。如果OpenWebUI依赖的库(比如Python的requests库或文件处理库)版本过旧或有兼容性问题,可能会导致上传失败。建议更新所有依赖到最新版本,并检查官方文档是否有特定的版本要求。 权限问题也可能导致文件无法正确读取,进而引发错误。确保OpenWebUI的服务账户有权限读取上传的目录和文件,特别是在Docker环境中,挂载的卷权限设置是否正确。 此外,检查OpenWebUI的日志文件可以获取更详细的错误信息,帮助定位问题所在。日志通常位于安装目录的logs文件夹中,或者通过Docker容器日志查看。 如果以上方法都不奏效,可能需要联系OpenWebUI的开发者社区,查看是否有已知的类似问题或提交新的issue。同时,临时解决方案可以尝试使用其他文件上传方式,比如通过API接口或命令行工具。 最后,确保用户按照步骤逐步排查问题,从最简单的检查开始,逐步深入,避免遗漏可能的因素。同时,提供相关的问题供用户进一步参考,帮助他们自行扩展解决问题的方法。</think>针对OpenWebUI导入知识库时出现的`Skipping data after last boundary`和`NoneType' object has no attribute 'encode'`错误,以下是分步解决方案: --- ### 一、错误原因分析 1. **`Skipping data after last boundary`** 通常由HTTP请求的multipart/form-data格式错误引发,可能原因包括: - 上传请求的boundary标识符与实际数据不匹配 - 文件分块传输时格式异常 - 前端框架与后端解析库冲突[^1] 2. **`NoneType' object has no attribute 'encode'`** 表明代码尝试对空值(`None`)进行编码操作,常见场景: - 文件对象未正确初始化 - 表单字段未获取到有效数据 - 依赖库版本不兼容(如`python-multipart`) --- ### 二、解决方案步骤 #### 步骤1:验证文件格式与大小 1. 检查文件是否为支持的格式(如PDF/TXT/Markdown) 2. 确认文件未损坏(尝试重新生成或下载文件) 3. 测试上传小于100MB的小文件(排除大文件分块问题) #### 步骤2:修复请求格式 ```python # 示例:手动构造multipart请求(通过Python requests库) import requests files = {'file': open('test.pdf', 'rb')} response = requests.post('http://openwebui/api/upload', files=files) ``` #### 步骤3:更新依赖库 ```bash # 更新关键库 pip install --upgrade python-multipart httpx fastapi ``` #### 步骤4:检查权限配置 1. 确保`/app/data`目录(Docker环境)有写入权限: ```bash chmod -R 777 /path/to/openwebui/data ``` 2. 验证存储路径在配置文件中正确定义: ```yaml # config.yml knowledge_base: storage_path: "/valid/path" ``` #### 步骤5:调试模式排查 启动OpenWebUI时添加调试参数: ```bash OPENWEBUI_DEBUG=1 python main.py ``` 观察控制台输出的具体错误位置 --- ### 三、进阶排查方法 | 检查项 | 命令/操作 | 预期结果 | |---------|----------|---------| | 网络请求完整性 | 浏览器开发者工具 > Network标签 > 检查上传请求的`Content-Type` | 应包含类似`boundary=----WebKitFormBoundary...` | | 文件编码检测 | `file -i filename.pdf` | 显示正确的MIME类型如`application/pdf` | | 依赖树验证 | `pipdeptree | grep -E 'multipart|starlette'` | 显示兼容版本(如`python-multipart==0.0.6`) | --- ### 四、临时解决方案 若仍无法解决,可通过API直接上传: ```bash curl -X POST -F "file=@knowledge.pdf" http://localhost:8080/api/upload ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值