过去一个月,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_KEY
API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
LLM_MODEL="deepseek-ai/DeepSeek-V3"
LLM_BASE_URL="https://api.siliconflow.cn/v1"
HF_ENDPOINT=https://hf-mirror.com
BGE_MODEL_PATH=BAAI/bge-m3
OLLAMA_URL=
OLLAMA_TOKEN=
# OPENAI_EMBEDDING_API_KEY 一项请填写和 API_KEY 一样的值
OPENAI_EMBEDDING_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
OPENAI_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