OceanBase + DeepSeek:5分钟免费搭建企业知识库

news2025/2/26 7:32:58

过去一个月,DeepSeek 在全球范围内引发了热烈讨论。其突破性的 AI 能力使其日流量显著超越 Claude 和 Perplexity,吸引了众多企业和技术专家的高度关注。随着 AI 技术的不断进步,企业正面临一场深刻的智能化变革——如何通过 AI 重构业务,提升效率、创新力和竞争力,已成为企业必须应对的战略课题。

然而,随着 AI 解决方案的广泛应用,企业在部署过程中面临的挑战也日益复杂,尤其是在数据隐私和合规性方面。为了确保数据安全、满足法规要求,并对关键业务数据进行全面掌控,越来越多的企业选择将 AI 应用和知识库系统部署在私有化环境中。私有化部署不仅能有效降低数据泄露风险,还能显著提升系统响应速度和稳定性,保障业务的连续性和高效运营。

本文将深入探讨如何通过结合 OceanBase和 DeepSeek 的优势,构建私有化知识库的方案。借助 DeepSeek 的低成本推理、OceanBase 的低成本存储及一体化数据库能力,帮助企业打造安全、实时、低成本的知识库系统,在保障数据安全与合规性的同时,提升业务的智能化与敏捷性。

1、OceanBase向量能力带来哪些变化

OceanBase 在 4.3.3 版本首次引入了向量检索能力,在关系型数据库的基础上新增向量检索能力,支持向量数据类型、向量索引以及基于向量索引的搜索能力。用户可以通过 SQL 及 Python SDK 两种方式灵活使用 OceanBase 的向量检索能力。同时结合 OceanBase 对海量数据的分布式存储能力以及对多模数据类型及多类型索引的支持,提供更加丰富的融合查询能力,极大简化 AI 应用的技术栈,加速 RAG、智能推荐、多模态搜索等业务场景的落地。

在 OceanBase 4.3.5 版本中,作为面向 AP 场景的第一个长期支持(LTS)版本,向量检索能力得到了进一步完善。除了增强向量索引的稳定性外,OceanBase 将向量索引支持的最大维度从 2000 维提升至 4096 维,并新增了对 cosine 距离算法的支持。用户在创建索引时,可以选择合适的距离算法(如 cosine 距离算法),并在执行查询时灵活地通过指定 cosine_distance 过滤条件,提升检索精度和查询效率。这些持续迭代和优化,使 OceanBase 在大规模 AI 场景中具备更强的适应性,能够为企业提供一个可扩展、低延迟、高性能的 AI 数据底座,满足未来复杂多变的 AI 应用需求。

2、基于OceanBase和DeepSeek私有化部署知识库

在这篇文章中,我们将介绍如何基于 OceanBase 和 DeepSeek 构建一个 RAG(Retrieval-Augmented Generation)聊天机器人,该 RAG 以 OceanBase 文档为例,用于回答 OceanBase 用户的相关问题。

我们将使用 OceanBase 文档作为多模数据源,将文档内容转化为向量和结构化数据,存储到 OceanBase 数据库中。通过该方法,用户提出的问题会被转化为向量,随后在数据库中进行向量检索,结合相关文档内容,借助 DeepSeek 的大语言模型为用户提供更准确的答案。我们使用的 BGE-M3 文本嵌入模型和 DeepSeek 大语言模型均通过 SiliconFlow 提供的 API 服务。

(一)项目组成

该 RAG 机器人将由以下几个组件组成:

🚩 文本嵌入服务:将文档转换为向量的文本嵌入服务,在这里我们使用 BGE-M3 模型。

🚩 数据库:提供存储和查询文档向量和其它结构化数据能力的数据库(推荐使用 4.3.5 LTS版本)。

🚩 大语言模型(LLM):若干分析用户问题、基于检索到的文档和用户问题生成回答的 LLM 智能体,利用 DeepSeek 大语言模型能力进行构建。

🚩 聊天界面:机器人与用户交互的聊天界面,采用 Streamlit 搭建。

(二)交互流程

图片

1️⃣ 用户在 Web 界面中输入想要咨询的问题并发送给机器人;

2️⃣ 机器人将用户提出的问题使用文本嵌入模型转换为向量;

3️⃣ 将用户提问转换而来的向量作为输入在 OceanBase 中检索最相似的向量;

4️⃣ OceanBase 返回最相似的一些向量和对应的文档内容;

5️⃣ 机器人将用户的问题和查询到的文档一起发送给大语言模型并请它生成问题的回答;

6️⃣ 大语言模型分片地、流式地将答案返回给机器人;

7️⃣ 机器人将接收到的答案也分片地、流式地显示在 Web 界面中,完成问答。

(三)准备工作

1️⃣ 安装 Python 3.9+(参考资料 1) 和 pip(参考资料 2)。如果您的机器上 Python 版本较低,可以使用 Miniconda 来创建新的 Python 3.9 及以上的环境,具体可参考 Miniconda 安装指南(参考资料 3)。

2️⃣ 安装 Poetry(参考资料 4),可参考命令 python3 -m pip install poetry。

3️⃣ 安装 Docker(参考资料 5)(可选,如果您计划使用 Docker 在本地部署 OceanBase 数据库则必须安装)。

4️⃣ 安装 MySQL 客户端,可参考 yum install -y mysql 或者 apt-get install -y mysql-client(可选,如果您需要使用 MySQL 客户端检验数据库连接则必须安装)。

5️⃣ 确保您机器上该项目的代码是最新的状态,建议进入项目目录执行 git pull。

6️⃣ 注册硅基流动(SiliconFlow)(参考资料 6)账号并获取 API Key。

图片

图片

(四)构建聊天机器人

1、获取 OceanBase 数据库

我们首先要获取 OceanBase 4.3.3 版本及以上的数据库来存储我们的向量数据。您可以通过以下两种方式快速获取 OceanBase 数据库:

🚩 使用 OB Cloud 云数据库免费试用版,平台注册和实例开通请参考 OB Cloud Free Trial 免费试用(参考资料 7);

🚩 使用 Docker 启动 OceanBase 单机版(推荐使用 4.3.5 LTS 版本)。

📕 注册 OB Cloud 并开通实例

进入 OB Cloud 免费试用(参考资料 7)页面,点击“立即试用”按钮,注册并登录账号,填写相关信息,开通MySQL模式的事务型实例,等待创建完成。

📕 获取 OB Cloud 数据库实例连接串

进入实例详情页的“实例工作台”,点击“连接”-“获取连接串”按钮来获取数据库连接串,将其中的连接信息填入后续步骤中创建的 .env 文件内。
 

图片

📕 修改实例参数启用向量模块

进入实例详情页的“参数管理”,将 ob_vector_memory_limit_percentage 参数修改为 30 以启动向量模块。

图片

2、安装依赖

接下来,您需要切换到动手实战营的项目目录:

cd ~/ai-workshop-2024

我们使用 Poetry 来管理聊天机器人项目的依赖项。您可以使用以下命令安装依赖项:

poetry install

如果您正在使用动手实战营提供的机器,您会看到以下消息,因为依赖都已经预先安装在了机器上:​​​​​​​

Installing dependencies from lock file
No dependencies to install or update

3、设置环境变量

我们准备了一个 .env.example 文件,其中包含了聊天机器人所需的环境变量。您可以将 .env.example 文件复制到 .env 并更新 .env 文件中的值。​​​​​​​

cp .env.example .env# 更新 .env 文件中的值,特别是 API_KEY 和数据库连接信息vi .env

.env.example 文件的内容如下,如果您正在按照动手实战营的步骤进行操作(使用 DeepSeek 作为大语言模型),您需要把 API_KEY 和 OPENAI_EMBEDDING_API_KEY 更新为您从硅基流动平台上获取到的 API KEY 值,如果您使用 OB Cloud 的数据库实例,请将 DB_ 开头的变量更新为您的数据库连接信息,然后保存文件。​​​​​​​​​​​​​

# 请填写获取到的 API_KEYAPI_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxLLM_MODEL="deepseek-ai/DeepSeek-V3"LLM_BASE_URL="https://api.siliconflow.cn/v1"
HF_ENDPOINT=https://hf-mirror.comBGE_MODEL_PATH=BAAI/bge-m3
OLLAMA_URL=OLLAMA_TOKEN=
# OPENAI_EMBEDDING_API_KEY 一项请填写和 API_KEY 一样的值OPENAI_EMBEDDING_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxOPENAI_EMBEDDING_BASE_URL="https://api.siliconflow.cn/v1/embeddings"OPENAI_EMBEDDING_MODEL=BAAI/bge-m3
UI_LANG="zh"
# 请根据 OBCloud 实例的连接信息更新下面的变量DB_HOST="127.0.0.1"DB_PORT="2881"DB_USER="root@test"DB_NAME="test"DB_PASSWORD=""

4、连接数据库

您可使用我们准备好的脚本来尝试连接数据库,以确保数据库相关的环境变量设置成功:

bash utils/connect_db.sh# 如果顺利进入 MySQL 连接当中,则验证了环境变量设置成功

5、准备文档数据

在该步骤中,我们将克隆 OceanBase 相关组件的开源文档仓库并处理它们,生成文档的向量数据和其他结构化数据后将数据插入到我们在步骤 1 中部署好的 OceanBase 数据库。

1️⃣ 克隆文档仓库

首先我们将使用 git 克隆 OceanBase 的文档到本地。​​​​​​​

git clone --single-branch --branch V4.3.4 https://github.com/oceanbase/oceanbase-doc.git doc_repos/oceanbase-doc# 如果您访问 Github 仓库速度较慢,可以使用以下命令克隆 Gitee 的镜像版本git clone --single-branch --branch V4.3.4 https://gitee.com/oceanbase-devhub/oceanbase-doc.git doc_repos/oceanbase-doc

2️⃣ 文档格式标准化

因为 OceanBase 的开源文档中有些文件使用 ==== 和 ---- 来表示一级标题和二级标题,我们在这一步将其转化为标准的 # 和 ## 表示。​​​​​​

# 把文档的标题转换为标准的 markdown 格式poetry run python convert_headings.py doc_repos/oceanbase-doc/zh-CN

3️⃣ 将文档转换为向量并插入 OceanBase 数据库

我们提供了 embed_docs.py 脚本,通过指定文档目录和对应的组件后,该脚本就会遍历目录中的所有 markdown 格式的文档,将长文档进行切片后使用嵌入模型转换为向量,并最终将文档切片的内容、嵌入的向量和切片的元信息(JSON 格式,包含文档标题、相对路径、组件名称、切片标题、级联标题)一同插入到 OceanBase 的同一张表中,作为预备数据待查。

为了节省时间,我们只处理 OceanBase 众多文档中与向量检索有关的几篇文档,在第 6 步打开聊天界面之后,您针对 OceanBase 的向量检索功能进行的提问将得到较为准确的回答。​​​​​​​

# 生成文档向量和元数据poetry run python embed_docs.py --doc_base doc_repos/oceanbase-doc/zh-CN/640.ob-vector-search

在等待文本处理的过程中我们可以浏览 embed_docs.py 的内容,观察它是如何工作的。

首先在该文件中实例化了两个对象,一个是负责将文本内容转化为向量数据的嵌入服务 embeddings;另一个是 OceanBase 对接的 LangChain Vector Store 服务,封装了 pyobvector 这个 OceanBase 的向量检索 SDK,为用户提供简单易用的接口方法。同时我们针对 OceanBase 组件建立了分区键,在需要定向查询某个组件的文档时能极大提升效率。​​​​​​​

embeddings = get_embedding(    ollama_url=os.getenv("OLLAMA_URL") or None,    ollama_token=os.getenv("OLLAMA_TOKEN") or None,    base_url=os.getenv("OPENAI_EMBEDDING_BASE_URL") or None,    api_key=os.getenv("OPENAI_EMBEDDING_API_KEY") or None,    model=os.getenv("OPENAI_EMBEDDING_MODEL") or None,)
vs = OceanBase(    embedding_function=embeddings, # 传入嵌入服务,将在插入文档时即时调用    table_name=args.table_name,    connection_args=connection_args,    metadata_field="metadata",    extra_columns=[Column("component_code", Integer, primary_key=True)],    partitions=ObListPartition(        is_list_columns=False,        list_part_infos=[RangeListPartInfo(k, v) for k, v in cm.items()]        + [RangeListPartInfo("p10", "DEFAULT")],        list_expr="component_code",    ),    echo=args.echo,)

接下来,该脚本判断所连接的 OceanBase 集群是否已开启了向量功能模块,如果没有开启则使用 SQL 命令进行启动。​​​​​​​

# 通过查询 ob_vector_memory_limit_percentage 参数判断是否已开启向量功能模块params = vs.obvector.perform_raw_text_sql(    "SHOW PARAMETERS LIKE '%ob_vector_memory_limit_percentage%'")# ...
# 通过将 ob_vector_memory_limit_percentage 参数设置为 30 来开启向量功能模块vs.obvector.perform_raw_text_sql(  "ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30")

最后,我们遍历文档目录,将文档内容读取并切片之后提交给 OceanBase Vector Store 进行嵌入和存储。​​​​​​​

if args.doc_base is not None:    loader = MarkdownDocumentsLoader(        doc_base=args.doc_base,        skip_patterns=args.skip_patterns,    )    batch = []    for doc in loader.load(limit=args.limit):        if len(batch) == args.batch_size:            insert_batch(batch, comp=args.component)            batch = []        batch.append(doc)
    if len(batch) > 0:        insert_batch(batch, comp=args.component)

6、启动聊天界面

执行以下命令启动聊天界面:

poetry run streamlit run --server.runOnSave false chat_ui.py

访问终端中显示的 URL 来打开聊天机器人应用界面。​​​​​​​

You can now view your Streamlit app in your browser.
  Local URL: http://localhost:8501  Network URL: http://172.xxx.xxx.xxx:8501  External URL: http://xxx.xxx.xxx.xxx:8501 # 这是您可以从浏览器访问的 URL

图片

3、写在最后

本文通过 OceanBase 与 DeepSeek 的实践演示,展示了如何将一体化数据库与大语言模型深度融合,构建安全、高效、可扩展的私有化知识库系统。值得一提的是,OceanBase 的一体化能力不仅适用于 DeepSeek,还能与其他主流大模型无缝对接,灵活适配多样化的 AI 应用场景,满足企业不同的智能化需求。

OceanBase 的一体化架构有效解决了传统方案多系统堆砌(如数据库、向量库、AI 模型)带来的运维复杂性和高成本问题。同时,借助强大的实时数据处理能力可避免因数据更新延迟导致的 AI 回答“过时”问题,尤其适用于对时效性要求极高的业务场景。

此外,OceanBase 的 SQL+AI 能力支持高效的向量检索,并能够处理向量数据与其他数据类型(如 GIS、关系型数据、文档等)的混合查询,显著简化技术栈,为复杂的 AI 应用提供强有力的底层支持。

未来,OceanBase 一体化能力将持续迭代升级,面向 AI 场景进一步增强向量检索和多模数据混合查询的处理性能,助力企业构建面向未来的 AI 数据底座,为复杂多变的智能化应用场景提供坚实的技术支撑。

参考资料

参考资料 1:安装 Python 3.9+

https://www.python.org/downloads/

参考资料 2:安装 pip

https://pip.pypa.io/en/stable/installation/

参考资料 3:Miniconda 安装指南

https://docs.anaconda.com/miniconda/install/

参考资料 4:安装 Poetry

https://python-poetry.org/docs/

参考资料 5:安装 Docker

https://docs.docker.com/engine/install/

参考资料 6:注册硅基流动(SiliconFlow)

https://cloud.siliconflow.cn/​​​​​​​

参考资料 7:开通 OB Cloud 免费试用

https://www.oceanbase.com/free-trial

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

水利工程安全包括哪几个方面

水利工程安全培训的内容主要包括以下几个方面: 基础知识和技能培训 : 法律法规 :学习水利工程相关的安全生产法律法规,了解安全生产标准及规范。 事故案例 :通过分析事故案例,了解事故原因和教训&#x…

基于 sklearn 的均值偏移聚类算法的应用

基于 sklearn 的均值偏移聚类算法的应用 在机器学习和数据挖掘中,聚类算法是一类非常重要的无监督学习方法。它的目的是将数据集中的数据点划分为若干个类,使得同一类的样本点彼此相似,而不同类的样本点相互之间差异较大。均值偏移聚类&…

国产OS上完整编译Qt5.15、搭建基本开发环境需要的库

近期有师弟问我国产OS安装Qt5.15编译老是不完整,不是没声音,就是没视频,或者没有xcb。通过QEMU模拟Arm64,闲来20几天摸索,完整编译了Qt5.15,并编译成功了我的SDR玩具taskBus。 1.主要结论: 该O…

MyBatis简明教程

MyBatis 是一个用于简化数据库操作的持久层框架,它的核心思想是 将 SQL 与 Java 代码解耦,让开发者专注于 SQL 的编写,同时自动处理重复的数据库操作步骤。 一、核心思想:SQL 与 Java 解耦 传统 JDBC 需要开发者手动管理数据库连…

有什么区别?Elastic 和 Splunk 数据层

作者:来自 Elastic Ugo Sangiorgi, Matt Wehle 了解 Elastic 和 Splunk 数据管理方法之间的主要区别,以便做出明智的决策,实现高效的数据处理 在数据管理领域,在讨论如何根据不同的性能要求提供和/或保留数据时,经常会…

BGP状态和机制

BGP邻居优化 为了增加稳定性,通常建议实验回环口来建立邻居。更新源:建立邻居和邻居所学习到的路由的下一跳。多跳:EBGP邻居建立默认选哟直连,因为TTL=1,如果非直连,必须修改TTL。命令备注peer 2.2.2.2 connect-interface lo1配置更新源peer 2.2.2.2 ebgp-max-hop 2配置T…

【电机控制器】PY32F00BF15U6TR-从KEIL5中计算资源消耗资源

【电机控制器】PY32F00BF15U6TR-从KEIL5中计算资源消耗资源 文章目录 [TOC](文章目录) 前言一、MCU芯片手册二、实验三、实验结论四、参考资料总结 前言 使用工具: 1.KEIL5编译器 提示:以下是本篇文章正文内容,下面案例可供参考 一、MCU芯片…

python实战项目58:采集蜻蜓FM热门音频top排行榜

python实战项目58:采集蜻蜓FM热门音频top排行榜 一、采集流程介绍二、数据接口采集三、使用xpath提取页面数据1、抓包,找到数据接口2、发送请求,获取数据3、提取数据4、保存数据一、采集流程介绍 蜻蜓FM热门音频top排行榜的链接为: https://m.qingting.fm/rank/,首页如下图…

STM32【3】芯片的底层组成概论

关于单片机的组成 单片机的意思是,小小计算电脑,麻雀虽小,五脏俱全,里面包含了CPU,ROM,RAM,各种外设。 CPU地位最高,可以访问ROM和RAM,Flash,GPIO等外设&…

基于django图书信息管理系统的搭建(增删改查)

✍django项目搭建教程 ☞ ----------------- 教程 本文主要讲解django如何连接数据库MySQL并且可视化展示,实现增删改查功能 目录 一. 创建django应用 二. 数据库配置 三. 查看数据库 四. 编写代码 4.1视图函数 4.2 配置URL 4.3创建模板文件 4.…

Kotlin 知识点二 延迟初始化和密封类

对变量延迟初始化 Kotlin 语言的许多特性,包括变量不可变,变量不可为空,等等。这些特性 都是为了尽可能地保证程序安全而设计的,但是有些时候这些特性也会在编码时给我们带来不 少的麻烦。 比如,如果你的类中存在很多…

基于SpringBoot的“古城景区管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“古城景区管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 系统注册界面 景…

力扣hot100 —— 电话号码字母组合; 子集 (非回溯做法)简单易懂

由于博主对回溯也不是很熟悉,这里提出一种简单易懂的解法(有点暴力) 解题思路: 每个数字对应有自己的字母串; 首先遍历将每个字母存入也就是 res{{a},{b},{c}} 然后遍历后续数子对应的字母,让每个字母与…

【Redis】在Java中以及Spring环境下操作Redis

Java环境下&#xff1a; 1.创建maven 项目 2.导入依赖 <!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version></dependency> 此处使用的是Jedis&…

Directx上传堆和默认堆注意事项

前景 之前我用directx写上传堆上传给默认堆Index&#xff0c;但是我发现数据无法被GPU读取 void HelloTriangle::createDefaultBuffer(const void* data, const UINT byteSize, ComPtr<ID3D12Resource>& defaultBuffer) {ThrowIfFiled(m_Device->CreateCommitte…

Java封装弱密码校验工具类

弱密码校验工具类 通过检查密码是否符合某些安全策略来判断其强度 ● 密码长度 ● 字符类型 ● 常见密码组合 import java.util.Arrays; import java.util.HashSet; import java.util.Set;public class WeakPasswordCheckUtil {// 常见弱密码列表&#xff08;可根据需求扩展&…

Figure自研模型Helix发布,人形机器人迈向新纪元?

Figure 公司自 2022 年成立以来&#xff0c;便在人形机器人领域崭露头角&#xff0c;成为行业内备受瞩目的新星。公司由连续创业者 Brett Adcock 创立&#xff0c;总部位于美国加利福尼亚州桑尼维尔&#xff0c;汇聚了来自波士顿动力公司、特斯拉、谷歌 DeepMind 等知名企业的顶…

vue3.0将后端返回的word文件流转换为pdf并导出+html2pdf.js将页面导出为pdf

实现思路 1.将Word文档转换为HTML&#xff1a;mammoth.js&#xff0c;它可以将.docx文件转换为HTML 2.将HTML转换为PDF&#xff1a;使用html2pdf.js将HTML转换为PDF 如果想要相同的效果&#xff0c;也可以把前端页面直接导出转换为pdf: 运用的插件&#xff1a;html2pdf.js 后端…

(Arrow)试时间处理变得更简单

前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…

锂电池使用和存储电压

表格补充说明&#xff1a; 每列数据中&#xff0c;2S和3S电池的数值都是单电芯数值的2倍和3倍&#xff1b;对于其他电压的电池&#xff0c;将单电芯数值乘以相应S数即可&#xff1b;理论上单个电芯过放电压为3.0V&#xff0c;实际中为了保险&#xff0c;电压降到3.6V即需充电。…