当前位置: 首页 > news >正文

打破AI黑盒,拥抱开源力量:基于openGauss+DeepSeek的本地知识库,打造你的专属AI助手!

引言:什么是RAG和LLM?

LLM (Large Language Model,大语言模型): 就像 ChatGPT 这样的 AI 模型,拥有强大的语言理解和生成能力,但它们的知识局限于训练数据,且可能产生“幻觉”(即生成不准确的信息)。

RAG (Retrieval-Augmented Generation,检索增强生成): 一种将信息检索与 LLM 结合的框架,可以实时从外部知识库中检索相关信息,并利用 LLM 生成更准确、可靠的回答。

当前,以 ChatGPT 为代表的外部 AI 助手暴露出诸多问题,回答内容的准确性存疑,数据安全存在隐患,访问过程中也时常出现不稳定的状况。

这篇教程,将手把手教你基于openGauss开源数据库和DeepSeek,在本地部署一个专属的AI知识库,拥有一个更懂你、更安全、更可控的AI助手!

为什么选择openGauss + DeepSeek?

  • 开源开放,透明可信:告别AI“黑盒”,代码完全开放,数据随心掌控,安全可靠。
  • 性能强劲,稳定高效:openGauss作为国产数据库佼佼者,性能优异且更加安全稳定,DeepSeek的RAG模型更是能精准理解你的需求。
  • 灵活定制,无限可能:本地部署意味着你可以根据自身需求,自由定制知识库内容和功能,打造更懂你的AI助手。

为什么要本地部署?

  • 数据安全,隐私保障:敏感数据不出本地,杜绝信息泄露风险,安心使用无顾虑。
  • 离线可用,稳定可靠:无需依赖网络,随时随地访问你的知识库,稳定流畅不卡顿。
  • 成本可控,长期受益:一次部署,长期使用,无需持续支付高昂的云服务费用。

实践准备:搭建基础环境

操作系统与 Python 环境配置

本文实践所采用的操作系统为 openEuler 22.03 LTS(x86_64)。为了确保各个组件之间能够实现无缝兼容并顺利运行,我们选择使用 python3.11。

DeepSeek推理模型部署:解锁强大文本生成能力

安装Ollama服务

首先,我们需要下载 ollama 的 pypi 包,以便后续访问 ollama 服务:

[test@localhost ~]$ pip3 install ollama

然后,我们可以使用官网提供的一键式部署脚本来部署 ollama 服务:

curl -fsSL https://ollama.com/install.sh | sh

如果遇到网络问题无法直接安装,我们可以考虑采用手动方案:

[test@localhost ~]$ wget https://ollama.com/download/ollama-linux-amd64.tgz
[test@localhost ~]$ tar -zxvf ollama-linux-amd64.tgz -C /usr/
[test@localhost ~]$ which ollama
/usr/bin/ollama

注:arm 架构的下载地址为 https://ollama.com/download/ollama-linux-arm64.tgz

安装成功后,我们可以启动 ollama 服务:

[test@localhost ~]$ ollama serve &

选择关键模型:DeepSeek与nomic-embed-text的协同

在RAG应用中,文本嵌入模型和文本生成模型是至关重要的组成部分。在本次实践中,我们着重引入了DeepSeek家族中的deepseek-r1模型来承担文本生成这一核心任务。

deepseek-r1 模型是基于先进的深度学习技术开发的,它具有独特的架构和训练方式,能够更好地捕捉文本中的语义信息,从而为文本生成带来更出色的效果。同时,我们选用nomic-embed-text模型用于嵌入任务,该模型能够将文本转换为高维向量表示,为后续的检索和匹配提供了强有力的支持。二者协同工作,共同助力我们基于DeepSeek与openGauss打造的本地AI知识库,使其能够更高效、更精准地为用户提供服务。

[test@localhost ~]$ ollama --version
ollama version is 0.5.6

[test@localhost ~]$ ollama pull deepseek-r1
[test@localhost ~]$ ollama pull nomic-embed-text

openGauss安装部署:构建可靠数据存储基石

通过openGauss向量数据库存储本地私域知识,在快速检索的同时提供更加稳定、更加安全的数据防护。

下载依赖

首先,我们需要下载 psycopg2 依赖:

[test@localhost ~]$ pip3 install psycopg2

获取镜像

通过如下命令获取 openGauss 镜像:

[root@localhost ~]$ wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/x86_openEuler/openGauss-Docker-7.0.0-RC1.tar
[root@localhost ~]$ docker load -i openGauss-Docker-7.0.0-RC1.tar

注:arm 架构的获取方式为 https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/arm/openGauss-Docker-7.0.0-RC1.tar

启动服务

镜像拉取完成后,我们可以启动openGauss服务:

[root@localhost ~]$ docker run --name opengauss --privileged=true -d -e GS_PASSWORD=Test@123 -p 8888:5432 -v /home/test/opengauss:/var/lib/opengauss opengauss:7.0.0-RC1

至此,openGauss已经成功安装部署,我们可以通过psycopg2连接openGauss查看版本信息:

import psycopg2conn = psycopg2.connect(database="postgres",user="gaussdb",password="Test@123",host="127.0.0.1",port="8888"
)
cur = conn.cursor()
cur.execute("select version();")
rows = cur.fetchall()
print(rows)
[('(openGauss 7.0.0-RC1 build 3fb58c89) compiled at 2025-01-20 00:24:26 commit 0 last mr   on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 10.3.0, 64-bit',)]

构建RAG实例:实现知识的高效检索与生成

我们以openGauss基础语料知识为例,通过deepseek-r1,做一个基础版的数据库智能问答小助手。

准备数据

以 openGauss 部分语料数据作为私域知识,下载文件:

[test@localhost ~]$ wget https://gitee.com/opengauss/website/raw/v2/app/zh/faq/index.md

对语料进行预处理:

file_path = '/home/test/index.md'with open(file_path, 'r', encoding='utf-8') as file:    content = file.read()paragraphs = content.split('##')for i, paragraph in enumerate(paragraphs):print(f'段落 {i + 1}:\n{paragraph}\n')print('-' * 20)

语料嵌入

在前述章节里,我们已经准备好了nomic-embed-text嵌入模型。这里进行简单测试如下:

import ollamadef embedding(text):vector = ollama.embeddings(model="nomic-embed-text", prompt=text)return vector["embedding"]text = "openGauss 是一款开源数据库"
emb = embedding(text)
dimensions = len(emb)
print("text : {}, embedding dim : {}, enbedding : {} ...".format(text, dimensions, emb[:10]))

text : openGauss 是一款开源数据库, embedding dim : 768, enbedding : [-0.5359194278717041, 1.3424185514450073, -3.524909734725952, -1.0017194747924805, -0.1950572431087494, 0.28160029649734497, -0.473337858915329, 0.08056074380874634, -0.22012852132320404, -0.9982725977897644] ...

数据导入

根据事先启动的openGauss docker服务连接信息建立连接:

import psycopg2table_name = "opengauss_data"conn = psycopg2.connect(database="postgres",user="gaussdb",password="Test@123",host="127.0.0.1",port="8888"
)

创建包含文本数据和向量数据的table:

# 建表
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS {};".format(table_name))
cur.execute("CREATE TABLE {} (id INT PRIMARY KEY, content TEXT, emb vector({}));".format(table_name, dimensions))
conn.commit()

将处理好的语料数据向量化后导入到openGauss数据库中,并创建索引:

# 插入数据
for i, paragraph in enumerate(paragraphs): emb = embedding(paragraph)insert_data_sql = f'''INSERT INTO {table_name} (id, content, emb) VALUES (%s, %s, %s);'''cur.execute(insert_data_sql, (i, paragraph, emb))conn.commit()# 创建索引
cur.execute("CREATE INDEX ON {} USING hnsw (emb vector_l2_ops);".format(table_name))
conn.commit()

查询检索

我们尝试询问如下问题:

question = "openGauss 发布了哪些版本?"

在openGauss中检索该问题以获取之前导入数据库中的相关文档:

emb_data = embedding(question)
dimensions = len(emb_data)cur = conn.cursor()
cur.execute("select content from {} order by emb <-> '{}' limit 1;".format(table_name, emb_data))conn.commit()
rows = cur.fetchall()
print(rows)cur.close()
conn.close()

查询结果如下:

[(' 3. openGauss 有哪些版本?\n\nopenGauss 社区每两年发布一个 LTS 版本,LTS 版本作为长期支持版本,可规模上线使用。半年发布一个创新版本,创新版本供用户联创测试使用;涉及重大问题修复时,会按需发布补丁版本。同时按照不同场景分为以下版本:\n\n1. openGauss 企业版:具备更齐全的集群管理功能,适合企业用户;\n2. openGauss 极简版:安装配置简单,解压可用,适合个人开发者;\n3. openGauss 轻量版:精简功能,缩减安装包大小,内存占用更少;\n4. openGauss 分布式镜像:基于 ShardingSphere 和 k8s 的分布式容器化镜像。\n\n详情参考 openGauss 官网[“学习”->“文档”](https://docs-opengauss.osinfra.cn)区域。\n\n',)]

结合LLM实现RAG

首先,为对比RAG前后效果,我们直接询问大模型得到如下答案,结果并不理想:

嗯,我现在想了解一下 openGauss 有哪些发布版本。我之前对这个软件不太熟悉,但听说它是一个用于关系型数据库的高可用性云原生解决方案,可能和 PostgreSQL 类似。首先,我应该确认一下什么是 openGauss,它的主要用途是什么,以及它在市场上的地位。

借助openGauss检索结果作为上下文,将文档进行格式化处理,并为大模型制定PROMPT:

context = "\n".join(row[0] for row in rows)SYSTEM_PROMPT = "你作为一个对话 AI 助手,结合上下文信息简练高效的回答用户提出的问题
"USER_PROMPT = f"请结合{context}信息来回答{question}的问题,不需要额外的无用回答"

基于ollama平台,我们采用deepseek-r1大模型进行知识问答:

response: ChatResponse = chat(model="deepseek-r1",messages=[        
{"role": "user", "content": SYSTEM_PROMPT},        
{"role": "user", "content": USER_PROMPT}    ],
)print(response["message"]["content"])

<think>好的,我现在要解决用户关于openGauss发布版本的问题。根据提供的上下文信息,openGauss每两年发布一个LTS版本,并且半年发布创新版本,当有重大问题修复时会发布补丁版本。
首先,我需要整理已知的版本类型:
1. **企业版**:面向企业用户,功能齐全。2. **极简版**:适合个人开发者,安装配置简单,解压即可使用。3. **轻量版**:精简功能,安装包小,占用内存少。4. **分布式镜像**:基于ShardingSphere和k8s的分布式容器化镜像。
接下来,LTS版本是长期支持版本,创新版本供联创测试。此外,还有补丁版本用于修复问题。
用户的问题是询问openGauss发布了哪些版本?因此,我需要总结这些信息,列出所有已知版本类型,并说明每个版本的目标用户和功能特点。
最后,确保回答简练、高效,避免任何无用内容。</think>openGauss 社区发布的主要版本类型包括:
1. **企业版**:适合企业用户,提供全面的集群管理功能。2. **极简版**:适用于个人开发者,安装配置简单且解压即可使用。3. **轻量版**:精简功能,适合需要小而精的应用场景。4. **分布式镜像**:基于 ShardingSphere 和 k8s 的分布式容器化镜像。
这些版本根据不同的应用场景提供定制化的解决方案。LTS 版本作为长期支持版本,创新版本则供用户进行联创测试使用。当出现重大问题时,会发布补丁版本进行修复。更多信息可参考 openGauss 官网。

可见,使用 deepseek 结合 openGauss 搭建的 RAG 应用,不仅能借助 deepseek 强大的文本生成能力和精准的文本嵌入功能,还能依托 openGauss 出色的向量数据库高效存储和快速检索向量数据,从而显著提升答案的准确性、可靠性,有效避免大语言模型的幻觉问题,为企业提供更优质的本地化知识服务。

结语

最后,我们基于ollama,成功利用openGauss和DeepSeek从零搭建起了简易的 RAG 应用,如愿获取到了所需的知识数据。在这个过程中,我们对 RAG 技术有了更深入的理解,也切实体会到了它在解决 LLM 实际应用问题上的作用。这个简易应用只是一个开端,你可以依据自身需求对相关环节进行灵活调整和优化,以更好地满足不同场景的需要。希望本文能帮助你加深对 RAG 技术应用实践的认识。

相关文章:

打破AI黑盒,拥抱开源力量:基于openGauss+DeepSeek的本地知识库,打造你的专属AI助手!

引言&#xff1a;什么是RAG和LLM&#xff1f; LLM (Large Language Model&#xff0c;大语言模型): 就像 ChatGPT 这样的 AI 模型&#xff0c;拥有强大的语言理解和生成能力&#xff0c;但它们的知识局限于训练数据&#xff0c;且可能产生“幻觉”&#xff08;即生成不准确的信…...

java配置api,vue网页调用api从oracle数据库读取数据

一、主入口文件 1&#xff1a;java后端端口号 2&#xff1a;数据库类型 和 数据库所在服务器ip地址 3&#xff1a;服务器用户名和密码 二、映射数据库表中的数据 resources/mapper/.xml文件 1&#xff1a;column后变量名是数据库中存储的变量名 property的值是column值的…...

visual studio导入cmake项目后打开无法删除和回车

通过Cmakelists.txt导入的项目做删除和回车无法响应&#xff0c;需要点击项目&#xff0c;然后选择配置项目就可以了...

linux运行kettle 遇到问题汇总

1、把本地的repositories.xml 放在跟目录 2、配置机台名解析 vi /etc/hosts bogon是服务器名字&#xff0c;根据实际情况修改 3、指定内存和字符集 vi spoon.sh -Xms1024m -Xmx2048m -Dfile.encodingUTF-8 4、执行kettle job ./kitchen.sh /rep pg_kettle /user admin /pa…...

初识camel智能体(一)

同目录下配置环境变量.env&#xff0c;内容如下&#xff0c; apikey从魔搭社区获取 QWEN_API_KEY4ff3ac8f-aebc******** 先上干货代码&#xff0c;主代码如下&#xff1a; from colorama import Forefrom camel.societies import RolePlaying from camel.utils import prin…...

如何在Excel和WPS中进行翻译

文档翻译我们可以用在线翻译工具&#xff0c;Excel工作表的翻译使用在线翻译工具就不是特别方便&#xff0c;那么如何快速进行翻译呢&#xff0c;我们今天介绍在不同的场景下如何利用翻译函数和Python程序来实现单元格的快速翻译。 一、在wps中进行翻译 WPS是我们常用的办公软…...

TCP的拥塞控制

什么是TCP的拥塞控制&#xff1f;它的工作原理是什么&#xff1f;为什么需要拥塞控制&#xff1f; TCP拥塞控制简介 想象一下&#xff0c;你和一群朋友在一条狭窄的小路上跑步。如果每个人都拼命跑&#xff0c;小路很快就会变得拥挤不堪&#xff0c;大家互相碰撞&#xff0c;…...

【前端】几种常见的跨域解决方案代理的概念

几种常见的跨域解决方案&代理的概念 一、常见的跨域解决方案1. 服务端配置CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff1a;2. Nginx代理3. Vue CLI配置代理&#xff1a;4 .uni-app在manifest.json中配置代理来解决&#xff1a;5. 使用WebSocket通讯…...

C++之2048小游戏 第二期

不是&#xff0c;一天点赞就到15了&#xff1f;&#xff01;好吧&#xff0c;那我更新一下 1. 逻辑 &#xff08;真的有人会看吗&#xff1f;&#xff09; 注&#xff1a;本文1.1章为AI生成&#xff0c;如有错误欢迎在评论其指出&#xff01; 1.1 普通/最初逻辑 这里我们首…...

Redis7——基础篇(一)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09; 一、Redis定义 官网地址&#xff1a;Redis - The Real-time Data Platform R…...

day9手机创意软件

趣味类 in:记录趣味生活&#xff08;通用&#xff09; 魔漫相机&#xff1a;真人变漫画&#xff08;通用&#xff09; 活照片&#xff1a;让照片活过来&#xff08;通用&#xff09; 画中画相机&#xff1a;与众不同的艺术 年龄检测仪&#xff1a;比一比谁更年轻&#xf…...

C# Dictionary的实现原理

在 C# 中&#xff0c;Dictionary<TKey, TValue> 是一个基于哈希表&#xff08;Hash Table&#xff09;实现的键值对集合。它提供了高效的插入、删除和查找操作&#xff0c;平均时间复杂度接近 O(1)。下面是 Dictionary 的核心实现原理&#xff1a; 1. Dictionary 的核心数…...

学习笔记-人脸识别相关编程基础

通过编程实现人脸识别功能&#xff0c;需要掌握一定的技术基础&#xff0c;包括编程语言、图像处理、机器学习以及相关的库和框架&#xff1a; 1. 编程语言 Python&#xff1a;Python 是实现人脸识别最常用的语言之一&#xff0c;因为它有大量的库和框架支持&#xff0c;如 Op…...

BUU37 [DASCTF X GFCTF 2024|四月开启第一局]web1234【代码审计/序列化/RCE】

Hint1&#xff1a;本题的 flag 不在环境变量中 Hint2&#xff1a;session_start&#xff08;&#xff09;&#xff0c;注意链子挖掘 题目&#xff1a; 扫描出来www.zip class.php <?phpclass Admin{public $Config;public function __construct($Config){//安全获取基…...

(五)Spring Boot学习——spring security +jwt使用(前后端分离模式)

一定要熟悉spring security原理和jwt无状态原理&#xff0c;理解了才知道代码作用。 在 Spring Security JWT 认证流程中&#xff0c;通常的做法是&#xff1a; 用户提交用户名和密码Spring Security 认证管理器 (AuthenticationManager) 进行认证如果认证成功&#xff0c;生…...

Java中使用EasyExcel

Java中使用EasyExcel 文章目录 Java中使用EasyExcel一&#xff1a;EasyExcel介绍1.1、核心函数导入数据导出数据 1.2、项目实际应用导入数据导出数据 1.3、相关注解ExcelProperty作用示例 二&#xff1a;EasyExcel使用2.1、导入功能2.2、导出功能 三&#xff1a;EasyExcel完整代…...

前沿科技改变生活新趋势

纳米技术在电子设备制造中的应用越来越广泛。这种技术能够帮助制造更小、更快、更耐用的电子产品。 举个例子&#xff0c;手机的处理器是其核心部件。随着纳米技术的进步&#xff0c;现在的处理器比以前小得多&#xff0c;但功能却更强。这样不仅让手机变得更轻薄&#xff0c;…...

不到一个月,SQLite 3.49.0来了

距离 SQLite 3.48.0 发布不到一个月&#xff0c;SQLite 开发团队于 2025 年 2 月 6 日发布了 SQLite 3.49.0 版本。这更新速度的确让人感动&#xff0c;那么这个版本又有哪些更新呢&#xff1f; 查询优化器 新版本改进了自动索引&#xff08;query-time index&#xff09;优化…...

Android车机DIY开发之软件篇(十四)编译i.mx8mplus官方kernel

1.下载 下载地址 2.安装依赖 sudo apt-get update sudo apt-get install build-essential git libncurses5-dev libssl-dev bc sudo apt-get install gcc-aarch64-linux-gnu export CROSS_COMPILEaarch64-linux-gnu- 3.配置 make ARCHarm64 defconfig 4.编译 make ARCHa…...

Mac上搭建宝塔环境并部署PHP项目

安装Docker Desktop》搭建Centos版本的宝塔环境》部署PHP项目 1. 下载Docker for mac 软件&#xff1a;https://www.docker.com/ 或使用终端命令&#xff1a;brew install --cask --appdir/Applications docker 2. 使用命令安装宝塔环境的centos7系统&#xff1a; docker pul…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...