跟着 8.6k Star 的开源数据库,搞 RAG!
过去 9 年里,HelloGitHub 月刊累计收录了 3000 多个开源项目。然而,随着项目数量的增加,不少用户反馈:“搜索功能不好用,找不到想要的项目!” 这让我意识到,仅仅收录项目是不够的,还需要通过更智能的方式,帮助用户找到心仪的开源项目。于是,我开始探索如何通过 RAG 技术解决这个问题。
检索增强生成(RAG),是赋予生成式人工智能模型信息检索能力的技术。
RAG 技术我早有耳闻,但却一直不知道该从哪里入手。虽然现在有不少容易上手的 RAG 低代码平台,但我不想只停留在“会用”的层面,更希望了解它的实现细节,否则不敢在生产环境中用。不过,要让我直接用 LangChain 和 Ollama 从零搭建一个 RAG 系统,还真有点心里没底。

还好最近 OceanBase 搞事情,在 4.3.3 版本里支持了向量检索功能,更贴心的是,还专门为像我这样对 RAG 感兴趣的新手,准备了一个用 Python 搭建 RAG 聊天机器人的实战教程。

GitHub 地址:github.com/oceanbase/oceanbase
光看永远只是纸上谈兵,所以我干脆上手把玩了一番。

接下来,我将分享如何基于该项目,打造一款 HelloGitHub 开源社区的聊天机器人,内容包括实现过程、细节优化,以及对 RAG 技术的理解与未来展望。
一、介绍
OceanBase 开源的 RAG 聊天机器人,能够通过自然对话更精准地回答与 OceanBase 文档相关的问题。

该项目是基于 langchain、langchain-oceanbase 和 streamlit 构建,处理流程是先将 OceanBase 数据库的文档,通过 Embedding 模型转化为向量数据,并存储在 OceanBase 数据库中。当用户提问时,系统会用相同的模型将问题转化为向量,然后通过向量检索找到相关的文档内容,再将这些文档作为上下文提交给大语言模型,从而生成更精准的回答。
在线体验:oceanbase.com/obi
体验后,我感觉效果还不错,于是就萌生了一个想法:能不能把 OceanBase 的文档,换成 HelloGitHub 月刊的 Markdown 文件,灌进系统里,这样不就摇身一变,成为 HelloGitHub 专属的聊天机器人了吗?说干就干!
二、安装运行
在开始改造之前,首先需要把项目跑起来。安装运行的步骤在 OceanBase 提供的实战教程中已经很详细了,这里不再过多介绍。运行步骤如下:
执行
embed_docs.py
脚本,将文档内容向量化后存储到 OB启动项目
streamlit run --server.runOnSave false chat_ui.py
启动成功将自动跳转至此界面:

建议:
Python 版本管理:运行需要 Python 3.9+,建议使用
pyenv
管理项目的 Python 版本。查看数据库:不论是通过 Docker 部署 OceanBase 还是使用 OB Cloud,都建议在本地通过 GUI 工具查看数据库,有助于开发和调试。

运行 embed_docs.py
脚本后,查看数据库中的表,你会发现这些字段:
document
:存储原始的文档内容embedding
:存储文档向量化后的数据metadata
:记录文档的名称、路径以及切分后的标题等信息
其中 embedding
列是一个类似数组形式的数据,这个就是通过 Embedding 模型将文档片段转化为向量数据的结果。这些向量数据能够捕捉文本的语义信息,使计算机能够更好地理解文本的含义,从而实现类似语义搜索的功能(计算距离),为后续问题与文档内容的匹配提供基础。

三、动手改造
这个项目除了支持 LLMs API,还可以切换为本地的 Ollama API 使用,只需修改 .env
配置文件即可完成调整:
# 使用支持 embed API 的模型
OLLAMA_URL=localhost:11434/api/embed
OLLAMA_TOKEN=
OLLAMA_MODEL=all-minilm
注意:在调用第三方付费 API 时,一定要注意使用量,建议仅导入部分文档用于测试,或用本地 LLM 调试逻辑,避免不必要的花费。
3.1 导入 HelloGitHub 月刊
通过 embed_docs.py
脚本,将 HelloGitHub 月刊内容向量化并导入到 OceanBase 数据库,命令如下:
python embed_docs.py --doc_base /HelloGitHub/content --table_name hg
参数说明:
doc_base
:HelloGitHub 内容目录table_name
:脚本会自动创建该表,并将数据存储到表中。
但是运行后,我查看数据库时发现 document
字段中包含了许多无意义的内容,例如格式符号或无关信息:

面对这些噪声数据,我编写了一个脚本,清洗 HelloGitHub 月刊文件中无关的格式符号和冗余内容,并重新导入数据库。

3.2 启动服务
在启动服务时,需要通过环境变量 TABLE_NAME
指定要使用的表。命令如下:
TABLE_NAME=hg2 streamlit run --server.runOnSave false chat_ui.py
我试了一下,回答的效果并不理想:

经过测试,我分析问答效果不好的原因,可能包括以下几点:
向量化效果:所选用的模型 all-minilm 仅有 384 维度,可以尝试更大的 Embedding 模型;
数据清理:虽然清理了一部分无用内容,但可能还有一些噪声数据未处理完全;
文档完整性:HelloGitHub 的内容结构是否适合问答模型需要进一步分析;
提示词:需要完善提示词设计,补充更多上下文;
四、优化问答效果
我开始对 RAG 有些感觉了,所以准备切换到付费但效果更好的通义千问 text-embedding-v3
模型(1024 维度),进行调试。
4.1 数据优化
为提升问答效果,我决定进一步优化 document 的构造方式。具体思路是:将 HelloGitHub 网站中的表导入至 OceanBase 数据库,并基于这些表的数据,构建更干净和精准的内容。这样可以最大程度地确保项目数据的全面性,同时减少无关内容的干扰,提升向量检索相关性。
导入表到 OceanBase
OceanBase 和 MySQL 高度兼容,因此,我直接用 Navicat 将 HelloGitHub 的数据表结构和内容,从 MySQL 无缝迁移到了 OceanBase。然后我写了一个 embed_sql.py
脚本,通过直接查询相关表的数据,进而生成更精简的内容(document),同时补充元数据(metadata),并存储到数据库。核心代码如下:
# 构建内容(document)
content = f"""{row.get('name', '未知')}:{row.get('title', '未知标题')}。{row.get('summary', '暂无概要')}"""# 构建元数据(metadata)
metadata = {"repository_name": row.get("name", "N/A"), # 仓库名称"repository_url": row.get("url", "N/A"), # 仓库链接"description": row.get("summary", "N/A"), # 项目描述"category_name": row.get("category_name", "N/A"), # 类别名称"language": row.get("primary_lang", "N/A"), # 主要编程语言"chunk_title": row.get("name", "N/A"), "enhanced_title": f'内容 -> {row.get("category_name", "N/A")} -> {row.get("name", "N/A")}'...
}# 将内容和元数据添加到文档对象
docs.append(Document(page_content=content.strip(), metadata=metadata))
# 存储到数据库
vs.add_documents(docs,ids=[str(uuid.uuid4()) for _ in range(len(docs))],
)
经过多轮调试和对比,我发现 document 数据越精简,向量检索效果越好,随后将完整的数据集存入 OceanBase 数据库的 hg5
表。
python embed_sql.py --table_name hg5 --limit=4000
args Namespace(table_name='hg5', batch_size=4, limit=4000, echo=False)
Using RemoteOpenAI
Processing: 100%|███████████████████████████████████████████████████████████████████████▉| 3356/3357 [09:33<00:00, 5.85row/s]

至此,基于数据库表构造的 document 数据,已经非常干净了。
4.2 提示词优化
在优化完数据后,我开始思考如何优化提示词,并对 LLM 的回答进行引导和强化。以下是针对 LLM 提示词优化的方向:
明确背景和任务:在提示词中设定问答的背景并限制问题的范围,例如,确保问题只涉及开源项目或 HelloGitHub 的内容。
丰富上下文:将 metadata(元数据) 和 document(项目描述)同时提供给大模型,让 LLM 有更多上下文来生成精确回答。
高质量示例:提供高质量的回答示例,统一输出格式。
约束逻辑:明确要求 LLM 不得虚构答案。如无法回答问题,需清楚指出知识盲点,并合理提供方向性建议。
4.3 处理流程优化
在优化向量检索和回答的流程方面,我做了以下改进:
扩大检索范围:向量检索默认只返回前 10 条最高相似度的内容。我将其扩展至 20 条,为 LLM 提供更多上下文选择。
判断相关性:使用提示词指导 LLM 在输出答案前,先判断问题是否与 HelloGitHub 或开源项目相关,避免生成无关回答。
提炼回答:基于用户输入分析意图后,选出最相关的 5 个项目,并结合元数据生成更贴合用户需求的回答。
4.4 效果展示
除了上面的优化,我还进一步简化了页面、删除用不到的代码,最终呈现效果如下:

回答效果对比:

通过切换至通义千问 text-embedding-v3 模型,同时优化数据、提示词策略和问答流程,让这套 RAG 系统的回答质量有了明显提升,但我打算自己盘一盘再上线。所以先放出源码,感兴趣的小伙伴可以作为参考:
GitHub 地址:github.com/521xueweihan/ai-workshop-2024
五、最后
在构建 HelloGitHub 的 RAG 聊天机器人过程中,回答效果一直不好,让我一度产生了放弃的念头。但当我通过查询表里的数据构造 document,并使用维度更大的 Embeding 模型后,回答效果直线提升,才让我重新看到了希望。

这段经历也让我开始认真思考:优化 RAG 的关键是什么?我的答案是 数据+检索。如今,许多企业希望借助 AI 技术赋能已有服务,RAG 则是一种门槛较低的通用解决方案。在这一过程中,数据质量决定了基础,高质量数据往往是从海量数据提纯而来。检索则是确保内容能够被快速且准确提取的关键。否则不管提示词再怎么优化,也无法检索到有价值的内容,就无法实现增强的效果。
另外,我认为在未来的 RAG 应用中,除了向量数据,数据库还需要具备一些关键能力来确保检索和生成的高效性。例如,支持关系型数据和向量数据的混合搜索,不仅能处理结构化和非结构化数据,还能有效减少 RAG 模型中的“幻觉”问题,从而让生成的答案更准确、更有根据。图搜索(知识图谱)同样很重要,它为 RAG 提供复杂推理所需的背景信息,提升生成质量。此外,RAG 应用在许多场景中需要频繁更新和同步数据,因此数据库还需支持实时查询、低延迟响应、事务处理和高可用性,这些是确保 RAG 高效运行的基础。
OceanBase 的分布式架构优势,让它在面对海量数据时依然游刃有余。而新引入的向量存储和检索能力,使得我们能够通过 SQL 轻松获取最“干净”的数据,并在同一个数据库内完成向量化操作。OceanBase 未来可期!
GitHub 地址:github.com/oceanbase/oceanbase
开源不易感谢 Star✨
最后,为坚持读完本文的读者,送上一波特别福利!留言即可参与,我们将在 2025.1.1 随机抽取 5 位留言的读者,每人一套由 OceanBase 提供的限量版「章鱼猫」乐高小玩具(如上图)。快来评论区分享你对 OceanBase 的使用体验或心得吧!
- END -
👆 关注「HelloGitHub」第一时间收到更新👆
相关文章:
跟着 8.6k Star 的开源数据库,搞 RAG!
过去 9 年里,HelloGitHub 月刊累计收录了 3000 多个开源项目。然而,随着项目数量的增加,不少用户反馈:“搜索功能不好用,找不到想要的项目!” 这让我意识到,仅仅收录项目是不够的,还…...
RCE漏洞
一、课程知识点 1、远程代码执行漏洞原理与利用 2、常见的代码执行函数 3、常见的命令执行函数 4、常见的绕过姿势 5、命令执行漏洞防范 二、技术目标 1、掌握命令执行漏洞的原理 2、掌握 PHP 命令执行和代码执行的相关函数 3、掌握常见的绕过姿势 4、掌握代码执行漏洞防御措施…...
数据通信系统的主要性能指标
1.码元速率 n 误码率 2.数据传输速率 n 误比特率 3.时延 n 往返时间 RTT 1. 码元速率 n 码元 ( Code element) n 码元是 数字信号的计量单位 ( Signal element ), 又称为符号( Symbol )。 n 码元 是指在使用时域表示…...
C语言中的贪心算法
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优解的算法,希望通过局部最优解的选择,最终得到全局最优解。它常用于解决最优化问题,如最小生成树、最短路径等。本文将从理论到实践,逐步引导…...
使用envoyfilter添加请求头
该envoyfilter实现了这样一个功能,如果请求头中含有Sw8,则添加请求头HasSw8: true。 1. 内嵌lua脚本 apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata:name: add-header-filternamespace: demo-bookinfo # 可根据实际情况调整命…...
【机器学习】回归
文章目录 1. 如何训练回归问题2. 泛化能力3. 误差来源4. 正则化5. 交叉验证 1. 如何训练回归问题 第一步:定义模型 线性模型: y ^ b ∑ j w j x j \hat{y} b \sum_{j} w_j x_j y^b∑jwjxj 其中,( w ) 是权重,( b )…...
Elasticsearch名词解释
文章目录 1.什么是Elasticsearch?2.什么是elastic stack(ELK)?3.什么是Lucene?4.什么是文档(document)?5.什么是词条(term)?6.什么是正向索引?7.什么是倒排索引?8.ES中的索引(index)9.映射(Mapping)10.DSL11.elastcisearch与my…...
把Huggingface下载的arrow数据集转化为json格式
Arrow2json 使用默认的Huggingface路径 以allenai/tulu-3-sft-mixture数据集为例。 使用load_dataset即可: from datasets import load_dataset# 加载数据集 dataset load_dataset("allenai/tulu-3-sft-mixture")# 指定保存路径 output_dir "~/…...
手机联系人 查询 添加操作
Android——添加联系人_android 添加联系人-CSDN博客 上面连接添加联系人已测试 是可以 Android : 获取、添加、手机联系人-ContentResolver简单应用_contentresolver 添加联系人-CSDN博客...
kkFileView集成springboot:使用自定义预览接口(非minio预览接口),发现无法预览资源
目录 1、背景2、原因分析3、解决办法 1、背景 按照项目验收要求,需要对minio中存储的数据进行加密 之前提供给kkFileView的预览地址都是获取的minio预览地址 由于minio中的资源进行了加密处理,所以我们自定义预览接口(进行解密操作ÿ…...
C++ 设计模式:观察者模式(Observer Pattern)
链接:C 设计模式 链接:C 设计模式 - 模板方法 链接:C 设计模式 - 策略模式 观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主…...
Mono 和 IL2Cpp的区别
Mono特征: 标准项目中有Assembly-CSharp.dll , 但在更复杂的项目或特定配置中,可能会有其他.dll或结构变更 在游戏的数据目录下看到一系列的.dll文件,这些文件的语言一般为中间语言 CE附加 , 查看是否有Mono.dll相关模块 目录有MonoBleedingEdge文件夹 IL2Cpp 标准项目应该…...
Windows平台ROBOT安装
Windows环境下ROBOT的安装,按照下文进行部署ROBOT的前提是你的python已安装并且环境变量已设置好. 一、安装setuptools 1、下载后安装 https://pypi.python.org/pypi/setuptools/ 下载你需要的包 setuptools-75.6.0.tar.gz 解压下载的包在命令行中进入该包,敲击如下命令后…...
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(2)
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(2) 背景 Tips 翻遍国内外的文档,关于 Argo 作为 CI/CD 当前所有开源的文档,博客,argo官方文档。得出的结论是: argo官方给出的例子都相对…...
深入浅出 MyBatis | CRUD 操作、配置解析
3、CRUD 3.1 namespace namespace 中的包名要和 Dao/Mapper 接口的包名一致! 比如将 UserDao 改名为 UserMapper 运行发现抱错,这是因为 UserMapper.xml 中没有同步更改 namespace 成功运行 给出 UserMapper 中的所有接口,接下来一一对…...
Hutool 发送 HTTP 请求的几种常见写法
最简单的 GET 请求: String result HttpUtil.get("https://www.baidu.com");带参数的 GET 请求: // 方法1: 直接拼接URL参数 String result HttpUtil.get("https://www.baidu.com?name张三&age18");// 方法2: 使用 HashMap…...
计算机网络|数据流向剖析与分层模型详解
文章目录 一、网络中的数据流向二、计算机网络通信模型1.OSI 模型2.TCP/IP 模型3.TCP/IP五层模型3.1 分层架构描述3.2各层地址结构3.3UDP数据包报头结构 三、总结 一、网络中的数据流向 在计算机网络中,数据的流向是指数据从发送端到接收端的传输路径。数据流向涉及…...
在Java技术栈中,常用的分布式一致性算法和框架
在Java技术栈中,常用的分布式一致性算法和框架包括: Raft算法: 常用框架: etcd:虽然主要用Go语言编写,但可以通过Java客户端进行访问和操作。Apache Kafka:在其控制器选举中使用类似Raft的机…...
2024.12.29(进程线程实现并发服务器)
作业 多进程多线程并发服务器实现一遍提交。 服务器 #include <myhead.h> #define PORT 12345 #define IP "192.168.124.123"void *fun(void *fd) {int newfd *(int *)fd;char buff[1024];while(1){int res recv(newfd,buff,sizeof(buff),0);if(res 0){p…...
Docker完整技术汇总
Docker 背景引入 在实际开发过程中有三个环境,分别是:开发环境、测试环境以及生产环境,假设开发环境中开发人员用的是jdk8,而在测试环境中测试人员用的时jdk7,这就导致程序员开发完系统后将其打成jar包发给测试人员后…...
区块链安全常见的攻击合约和简单复现,附带详细分析——不安全调用漏洞 (Unsafe Call Vulnerability)【6】
区块链安全常见的攻击分析——不安全调用漏洞 Unsafe Call Vulnerability 区块链安全常见的攻击合约和简单复现,附带详细分析——不安全调用漏洞 (Unsafe Call Vulnerability)【6】1.1 漏洞合约1.2 漏洞分析1.3 攻击步骤分析1.4 攻击合约 区块链安全常见的攻击合约和…...
Vue.js 高难度组件开发:从插件化到性能极限优化
Vue.js 高难度组件开发:从插件化到性能极限优化 引言一、插件化组件开发1. 什么是插件化组件2. 案例:构建一个插件化的图表组件 二、动态扩展与自定义组件行为1. 动态添加组件功能 三、复杂交互与细粒度状态管理1. 使用 Vuex 的模块化和动态模块注册 四、…...
一个通用的居于 OAuth2的API集成方案
在现代 web 应用程序中,OAuth 协议是授权和认证的主流选择。为了与多个授权提供商进行无缝对接,我们需要一个易于扩展和维护的 OAuth 解决方案。本文将介绍如何构建一个灵活的、支持多提供商的 OAuth 系统,包括动态 API 调用、路径参数替换、…...
折腾日记:如何让吃灰笔记本发挥余热——搭建一个相册服务
背景 之前写过,我在家里用了一台旧的工作站笔记本做了服务器,连上一个绿联的5位硬盘盒实现简单的网盘功能,然而,还是觉的不太理想,比如使用filebrowser虽然可以备份文件和图片,当使用手机使用网页…...
C# dynamic 类型详解
简介 C# 中的 dynamic 是一种特殊类型,它允许在运行时确定对象的类型和成员,而不是在编译时。 dynamic 的定义 dynamic 是一种类型,它告诉编译器对其进行“动态类型解析”。 dynamic 类型的变量会跳过编译时类型检查,所有的操作…...
postgresql ERROR: cannot drop the currently open database
postgresql ERROR: cannot drop the currently open database 解释: 这个错误表明你正在尝试删除或者切换当前正在使用的数据库。在PostgreSQL中,一个数据库对应着一个进程,当一个数据库处于打开状态时,你不能直接删除或者切换它…...
Excel基础知识
一:数组 一行或者一列数据称为一维数组,多行多列称为二维数组,数组支持算术运算(如加减乘除等)。 行:{1,2,3,4} 数组中的每个值用逗号分隔列:{1;2;3;4} 数组中的每个值用分号分隔行列…...
【pwnlab_init靶场渗透】
文章目录 一、基础信息 二、信息收集 三、漏洞利用 四、反弹shell 五、提权 一、基础信息 Kali IP :192.168.20.146 靶机IP:192.168.20.157 二、信息收集 nmap -sS -sV -p- -A 192.168.20.157 开放了80、111、3306、50749等端口 访问一下80端口…...
【泰克生物】酶突变文库筛选技术:通过酵母展示实现酶的精准进化
酶工程是生物技术中的一个重要领域,涵盖了酶的改造、优化和应用。通过对酶分子进行定向进化,可以获得具有更高催化效率、更广泛底物特异性或更强稳定性的酶。酶突变文库筛选技术,尤其是酵母展示平台,提供了一种高效且可操作的方法…...
C++Primer 类简介
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
人工智能知识分享第三天-机器学习中交叉验证和网格搜索
交叉验证和网格搜索 交叉验证解释: 概述: 它是一种更加完善的, 可信度更高的模型预估方式, 思路是: 把数据集分成n份, 每次都取1份当做测试集, 其它的当做训练集, 然后计算模型的: 评分. 然后再用下1份当做测试集, 其它当做训练集, 计算模型评分, 分成几份, 就进行几次计算, 最…...
00序言:我为什么会选择AI?
序言:我为什么会选择AI? 2023年,对我来说是一个转折点。那一年,我在人工智能领域已经积累了几年的经验,深刻感受到了这场技术变革的巨大冲击。曾经,我也像许多人一样,怀疑自己是否能跟上这个快…...
【AIGC-ChatGPT副业提示词指令 - 动图】魔法咖啡馆:一个融合创意与治愈的互动体验设计
引言 在当今快节奏的生活中,咖啡早已不仅仅是提神醒脑的饮品,更成为了一种情感寄托和生活态度的表达。本文将介绍一个独特的"魔法咖啡馆"互动体验设计,通过将咖啡与情感、魔法元素相结合,创造出一个充满想象力和治愈感…...
VSCode outline显示异常的解决方法——清除VSCode的配置和用户文件
1. 删除所有配置文件 sudo apt remove --purge code2. 删除所有用户文件 rm -rf ~/.config/Code rm -rf ~/.vscode rm -rf ~/.local/share/code rm -rf ~/.cache/Code3. 重装Code sudo dpkg -i code_1.96.2-1734607745_amd64.deb如此,可修复异常导致的outline无…...
Maple软件的安装和使用
文章目录 1.前言说明2.我为什么要学习Maple3.软件的安装4.如何使用4.1基本的赋值语句4.2函数的定义4.3三个类型的书写介质 5.指数运算5.1使用面板5.2自己输入 6.对数的使用 1.前言说明 众所周知,我虽然是一名这个计算机专业的学生,但是我对于数学&#…...
elasticsearch-java客户端jar包中各模块的应用梳理
最近使用elasticsearch-java客户端实现对elasticsearch服务的Api请求,现对elasticsearch-java客户端jar包中各模块的应用做个梳理。主要是对co.elastic.clients.elasticsearch路径下的各子包的简单说明。使用的版本为:co.elastic.clients:elasticsearch-…...
android13 系统文字大小和显示大小的修改
没啥可解释,如题所示,修改系统默认文字大小和显示大小 一修改系统文字大小: 系统文字太小,需要修改文字大小修改如下 commit 82675b7d8ac278e80d94e6b2b1417b266065d2ec Author: admin <bianjbflyscale.cn> Date: Sat …...
【华为OD-E卷 - 任务总执行时长 100分(python、java、c++、js、c)】
【华为OD-E卷 - 任务总执行时长 100分(python、java、c、js、c)】 题目 任务编排服务负责对任务进行组合调度。 参与编排的任务有两种类型,其中一种执行时长为taskA,另一种执行时长为taskB。 任务一旦开始执行不能被打断&#x…...
vue中子组件给父组件传值
在 Vue.js 中,子组件向父组件传递数据或事件通常是通过 $emit 方法来实现的。这个方法允许子组件触发一个自定义事件,父组件可以通过监听这些事件来接收信息。以下是实现这一过程的基本步骤: 1. 子组件触发事件 在子组件中,使用…...
【js】记录预览pdf文件
接口调用拿到pdf的文件流,用blob处理这个文件流拿到url,使用window.open跳转新的窗口进行预览 api({dataType: blob, }).then(res >{if(res.code 0){this.previewPDF(res,application/pdf;charsetutf-8,pdf文件名)} })previewPDF (res, type, fname…...
【Spring MVC 异常处理机制】应对意外情况
在 Web 应用中,异常是不可避免的。用户的输入不合法,服务的某部分出错,或者数据库连接失败,这些情况都可能触发异常。那么问题来了:如何优雅地捕获并处理这些异常,让用户体验不至于因为一时的错误而受损&am…...
《计算机组成及汇编语言原理》阅读笔记:p128-p132
《计算机组成及汇编语言原理》学习第 10 天,p128-p132 总结,总计 5 页。 一、技术总结 1.8088 organization and architecture 8088处理器是16位电脑,寄存器是16位,数据总线(data bus)是8位,地址总线是20位。 (1)g…...
留学生交流互动系统|Java|SSM|VUE| 前后端分离
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...
Windows IPC
进程间通信 (IPC,Inter-Process Communication) 进程间通信 (IPC) 是一种在进程之间建立连接的机制,在两台计算机或一台多任务计算机上运行,以允许数据在这些进程之间流动。进程间通信 (IPC) 机制通常用于客户端/服务器环境,并在…...
BMS存储模块的设计
目的 电池管理系统中存在着数据本地存储的要求,保证控制器重新上电后能够根据存储器中的一些参数恢复控制状态,和信息的下电存储1.继电器故障信息的存储。2. 系统性故障的存储。3.SOC、SOH相关信息的存储。4.均衡参数的存储。5.系统时间信息。6.出厂信息…...
2024-12-29-sklearn学习(25)无监督学习-神经网络模型(无监督) 烟笼寒水月笼沙,夜泊秦淮近酒家。
文章目录 sklearn学习(25) 无监督学习-神经网络模型(无监督)25.1 限制波尔兹曼机25.1.1 图形模型和参数化25.1.2 伯努利限制玻尔兹曼机25.1.3 随机最大似然学习 sklearn学习(25) 无监督学习-神经网络模型(无监督) 文章参考网站&a…...
【动态规划篇】穿越算法迷雾:约瑟夫环问题的奇幻密码
欢迎拜访:羑悻的小杀马特.-CSDN博客 本篇主题:带你众人皆知的约瑟夫环问题 制作日期:2024.12.29 隶属专栏:C/C题海汇总 目录 引言: 一约瑟夫环问题介绍: 11问题介绍: 1.2起源与历史背景&…...
【Elasticsearch】DSL查询文档
目录 1.DSL查询文档 1.1.DSL查询分类 1.2.全文检索查询 1.2.1.使用场景 1.2.2.基本语法 1.2.3.示例 1.2.4.总结 1.3.精准查询 1.3.1.term查询 1.3.2.range查询 1.3.3.总结 1.4.地理坐标查询 1.4.1.矩形范围查询 1.4.2.附近查询 1.5.复合查询 1.5.1.相关性算分 …...
MySQL第三弹----函数
笔上得来终觉浅,绝知此事要躬行 🔥 个人主页:星云爱编程 🔥 所属专栏:MySQL 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 一、合计/统计函数 1.1count…...
路由器刷机TP-Link tp-link-WDR5660 路由器升级宽带速度
何在路由器上设置代理服务器? 如何在路由器上设置代理服务器? 让所有连接到该路由器的设备都能够享受代理服务器的好处是一个不错的选择,特别是当需要访问特定的网站或加速网络连接的时候。下面是一些您可以跟随的步骤,使用路由器…...