基于RAG与pgvector构建私有知识库:从语义搜索到智能问答

news2026/5/5 7:41:01
1. 项目概述构建一个基于语义的私有知识库搜索系统如果你手头有大量的文档、笔记、PDF报告或者公司内部有一个不断增长的FAQ和产品手册知识库传统的“关键词匹配”搜索往往会让你感到挫败。你明明记得文档里提过某个概念但就是搜不出来因为系统只认你输入的那个词而不理解你真正想问的是什么。这正是我过去几年在构建内部工具时反复遇到的痛点。直到我开始深入探索RAG检索增强生成技术并结合PostgreSQL的pgvector扩展才找到了一条既强大又相对“接地气”的解决方案。今天要拆解的这个项目rag-system-pgvector就是一个典型的、可以自部署的RAG系统。它的核心价值在于让你能用自然语言比如“怎么重置账户密码”去搜索你自己的数据系统会理解问题的“含义”并找出语义上最相关的文档片段而不是仅仅匹配“重置”、“账户”、“密码”这几个词。这对于构建个人知识库、企业内部智能客服、或是产品文档的智能检索助手来说是一个极具实用性的起点。整个系统的技术栈非常清晰用TypeScript/Node.js构建应用后端FastAPI作为可选的Python服务层PostgreSQL作为核心存储数据库并通过pgvector扩展使其具备存储和查询“向量”即文本的数学化语义表示的能力。前端则是一个简洁的Web界面。它支持集成OpenAI、Cohere、Gemini等主流大模型API来生成文本的向量也称为嵌入也支持自托管的嵌入模型。这意味着你可以完全在本地或私有云环境中运行确保数据隐私。接下来的内容我将以一个资深全栈开发者的视角带你从零开始彻底吃透这个系统的设计思路、部署细节、核心原理以及那些官方文档里不会写的“踩坑”经验。无论你是想直接使用这个项目还是借鉴其架构来构建自己的系统相信都能获得直接的参考。2. 核心架构与组件选型解析一个RAG系统远不止是“调用一下API”那么简单它是一套精心设计的流水线。rag-system-pgvector项目的架构体现了现代RAG系统的典型分层思想我们可以将其拆解为数据流、计算层和存储层三个部分来理解。2.1 数据流从文档到答案的旅程用户的一次查询在系统内部会经历一个完整的闭环文档注入与预处理用户上传PDF、Word、TXT或Markdown文件。系统首先进行文本提取这里用到了Docling这样的库它能很好地处理复杂版式的PDF然后将长文本切割成大小适中的“块”Chunking。切割策略至关重要块太大则检索不精准块太小则丢失上下文。常见的做法是按语义如段落或固定字符数如512个token进行分割。向量化嵌入每个文本块通过嵌入模型Embedding Model被转换成一个高维向量例如1536维。这个向量就像是文本在语义空间中的“坐标”语义相近的文本其向量在空间中的距离通常用余弦相似度衡量也更近。向量存储与索引生成的向量连同原始文本块被存入支持向量搜索的数据库——在这里就是安装了pgvector扩展的PostgreSQL。pgvector会为向量列创建特定的索引如IVFFlat或HNSW以加速近似最近邻搜索。查询与检索用户输入问题后问题本身也会被向量化。系统在向量数据库中搜索与问题向量最相似的若干个文本块向量。答案生成可选检索到的相关文本块作为上下文与用户问题一起拼接提交给大语言模型如GPT-4、Claude或本地模型让模型基于这些上下文生成一个连贯、准确的答案。这就是“检索增强生成”中“生成”的部分。rag-system-pgvector项目灵活地支持了全流程。你可以只用它的检索和前端展示部分也可以开启完整的问答生成功能。2.2 计算层TypeScript与Python的职责划分项目采用了混合技术栈这不是冗余而是基于不同任务的特长所做的合理分工。TypeScript/Node.js后端主应用负责业务流程控制、用户界面服务、文档上传管理和基础API。TypeScript的强类型特性非常适合构建复杂且需要长期维护的应用逻辑其异步IO模型也能很好地处理文件上传等操作。它充当了系统的“大脑”和“交互界面”。FastAPI服务Python通常负责“重计算”任务。虽然Node.js生态也有嵌入模型库但Python在AI/机器学习领域拥有无可比拟的丰富生态如LangChain、sentence-transformers。该项目中Python服务很可能承担了文档解析和文本分割的复杂逻辑。调用多种嵌入模型API或运行本地嵌入模型。与LangChain等框架集成实现更复杂的检索链或问答链。通过fastapi-sqlalchemy等库与数据库进行ORM交互。这种架构的优势在于你可以用Python快速实验和集成最新的AI库而用TypeScript构建稳定、高性能的Web服务。两者通过RESTful API或消息队列进行通信。2.3 存储层为什么是PostgreSQL pgvector这是本项目的核心特色。当很多人把目光投向专用的向量数据库如Qdrant, Pinecone时该项目选择了“老牌劲旅”PostgreSQL。这是一个非常务实且强大的选择。一体化与简化运维你的文档元数据、用户信息、系统日志和向量数据全部存在一个数据库里。这极大地简化了部署、备份和运维的复杂度。你不需要维护另一套数据库系统。事务保证与数据一致性PostgreSQL提供了完整的ACID事务支持。当你插入一个文档及其对应的多个向量块时可以确保这是一个原子操作要么全部成功要么全部回滚避免了数据不一致。成熟的生态与工具你有无数种工具来管理、监控和查询PostgreSQL。任何开发团队都对它不陌生。pgvector的卓越性能pgvector扩展并非玩具。它提供了两种主流的索引算法IVFFlat适合快速构建和HNSW适合高召回率和高性能。对于千万级以下的向量数据规模其性能完全足以支撑生产级应用。并且其查询语法-或运算符非常直观。当然项目关键词中也提到了Qdrant和MongoDB可能通过某些插件支持向量这说明了系统的设计是开放、可插拔的。但PostgreSQL pgvector的组合为大多数自托管场景提供了“开箱即用”的最佳平衡点。实操心得在早期技术选型时我们曾在专用向量数据库和PGpgvector之间犹豫。最终选择后者核心原因是减少了技术栈的复杂度。对于一个中小型团队维护一个PostgreSQL实例比维护“PostgreSQL Redis 向量数据库”的组合要轻松得多。而且当需要进行复杂的、关联业务数据的查询时例如“找出属于某项目的、且与本周故障相关的所有文档”纯向量数据库往往力不从心而PG可以轻松写出联合查询。3. 详细部署与配置指南理论清晰后我们进入实战环节。以下部署流程基于项目提供的典型结构并补充了大量实践中必需的细节。3.1 基础环境准备假设我们在一个干净的Windows 11或主流Linux服务器如Ubuntu 22.04上部署。1. 安装Docker与Docker Compose这是最推荐的部署方式它能解决环境依赖的所有问题。# 在Linux上安装Docker Engine和Compose插件 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo apt-get install docker-compose-pluginWindows和macOS用户请直接从Docker官网下载并安装Docker Desktop它包含了Compose。安装后务必在终端运行docker --version和docker compose version验证安装成功。2. 获取项目代码不要直接下载ZIP包使用Git克隆可以方便地更新。git clone https://github.com/fruitful-lure791/rag-system-pgvector.git cd rag-system-pgvector3. 关键文件解析进入项目根目录你会看到类似如下的结构理解它们的作用是成功部署的关键rag-system-pgvector/ ├── docker-compose.yml # 核心定义所有服务App, DB, Python API等 ├── .env.example # 模板环境变量配置示例需复制修改 ├── backend/ # TypeScript/Node.js 主服务 │ ├── src/ │ ├── package.json │ └── Dockerfile ├── python-api/ # FastAPI 嵌入服务 │ ├── app/ │ ├── requirements.txt │ └── Dockerfile ├── frontend/ # 前端界面可能是Next.js或React │ └── ... └── scripts/ # 可能包含数据库初始化脚本3.2 环境配置与关键参数详解.env文件是系统的中枢神经配置错误会导致应用无法启动。根据.env.example创建一个新的.env文件。cp .env.example .env nano .env # 或用其他编辑器打开以下是需要重点关注的配置项及其背后的逻辑# 数据库配置 - 这是系统的基石 DATABASE_URLpostgresql://rag_user:StrongPassword123postgres:5432/rag_db PGVECTOR_DB_URL${DATABASE_URL} # 通常与DATABASE_URL一致 # 嵌入模型配置 - 决定语义理解能力的核心 EMBEDDING_MODELtext-embedding-3-small # OpenAI 嵌入模型性价比高 # EMBEDDING_MODELembed-english-v3.0 # Cohere 嵌入模型 # EMBEDDING_MODELsentence-transformers/all-MiniLM-L6-v2 # 本地模型无需API OPENAI_API_KEYsk-your-openai-api-key-here # COHERE_API_KEYyour-cohere-key-here # 如果使用Cohere # LLM配置用于答案生成如果启用该功能 LLM_MODELgpt-4-turbo-preview # 或 gpt-3.5-turbo, claude-3-haiku-20240307 OPENAI_BASE_URLhttps://api.openai.com/v1 # 可替换为其他兼容API的地址 # 应用运行配置 NODE_ENVproduction PORT3000 # 主后端服务端口 PYTHON_API_URLhttp://python-api:8000 # Docker网络内FastAPI服务地址 FRONTEND_URLhttp://localhost:5173 # 前端开发服务器地址 # 文本分块配置 - 直接影响检索质量 CHUNK_SIZE1000 # 每个文本块的最大字符数 CHUNK_OVERLAP200 # 块与块之间的重叠字符数避免割裂语义配置要点解析数据库密码务必使用强密码StrongPassword123仅为示例。在生产环境中考虑使用密码管理工具生成并保存。嵌入模型选择text-embedding-3-smallOpenAI当前性价比最高的模型维度可选如512速度快精度对于大多数场景足够。本地模型若数据极度敏感或想消除API成本可使用sentence-transformers库的模型。这需要在Python服务的Dockerfile中安装相应的库并在配置中指定模型名称。缺点是首次加载慢且需要一定的GPU/CPU资源。分块参数CHUNK_SIZE1000和CHUNK_OVERLAP200是经验起始值。对于技术文档可能需要更大的块如1500来保持完整性对于对话记录可能需要更小的块如500。重叠是为了防止一个完整的句子或概念被切分到两个块边缘导致检索时丢失关键信息。这是一个需要根据你的数据内容进行调优的参数。3.3 使用Docker Compose一键启动这是最简洁的启动方式。确保在项目根目录即docker-compose.yml所在目录执行。docker compose up -d这个命令会执行以下操作根据.env文件构建环境。拉取PostgreSQL官方镜像如果本地没有。根据Dockerfile构建Node.js后端和Python API的镜像。按顺序启动所有定义在docker-compose.yml中的服务通常先启动数据库再启动应用。-d参数表示在后台运行。启动后使用以下命令观察日志和状态# 查看所有容器运行状态 docker compose ps # 查看实时日志特别是启动初期 docker compose logs -f # 如果只想看某个服务的日志如后端 docker compose logs -f backend首次启动的数据库初始化 一个设计良好的项目其docker-compose.yml中PostgreSQL服务部分可能会挂载一个初始化SQL脚本到/docker-entrypoint-initdb.d/目录。这个脚本通常负责创建专用的数据库和用户如果.env中的用户不存在。执行CREATE EXTENSION IF NOT EXISTS vector;来启用pgvector扩展。可能创建所需的表结构。你可以检查项目中的scripts/init.sql或类似文件。如果没有你可能需要手动进入数据库容器执行这些命令。3.4 手动安装与配置备用方案如果项目不提供完整的Docker配置或者你需要在已有环境中集成则需要手动安装。1. 安装并配置PostgreSQL (v15)# Ubuntu 示例 sudo apt update sudo apt install postgresql-15 postgresql-contrib-15安装后启用pgvector扩展sudo -u postgres psql在psql命令行中执行CREATE DATABASE rag_db; \c rag_db; CREATE EXTENSION IF NOT EXISTS vector; CREATE USER rag_user WITH PASSWORD StrongPassword123; GRANT ALL PRIVILEGES ON DATABASE rag_db TO rag_user; \q2. 安装Node.js后端cd backend npm install根据项目说明可能需要复制并配置后端的.env文件然后启动npm run build npm start3. 安装Python API服务cd python-api python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows pip install -r requirements.txt uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload注意事项手动安装时最大的挑战是服务间网络通信。确保后端服务Node.js配置的PYTHON_API_URL和DATABASE_URL能够正确访问到运行的Python服务和PostgreSQL数据库注意localhost在容器内外的区别。Docker Compose通过自定义网络自动解决了这个问题。4. 核心功能实操与系统使用系统成功运行后通过浏览器访问http://localhost:3000具体端口请查看日志输出你将看到Web界面。下面我们深入核心功能的使用和背后的原理。4.1 文档注入与向量化流程这是构建知识库的第一步。点击“上传”或“添加文档”选择一个PDF文件。后台发生了什么前端将文件通过API发送到Node.js后端。后端可能将文件暂存然后向Python API服务发起一个处理请求传递文件路径或二进制流。Python服务启动处理流水线解析使用Docling或PyPDF2、python-docx等库提取纯文本和元数据标题、作者等。清洗与分割去除多余空格、换行符。然后根据配置的CHUNK_SIZE和CHUNK_OVERLAP使用文本分割器如RecursiveCharacterTextSplitterfrom LangChain进行分块。向量化对每个文本块调用指定的嵌入模型如OpenAI API。模型会返回一个浮点数数组向量。存储Python服务通过SQLAlchemy将{文本块内容, 向量, 元数据如来源文件、页码}组装成一个数据对象并通过fastapi-sqlalchemy会话存入PostgreSQL。对应的表结构可能如下CREATE TABLE document_chunks ( id BIGSERIAL PRIMARY KEY, content TEXT NOT NULL, embedding vector(1536), -- 维度取决于模型如text-embedding-3-small是1536 metadata JSONB, -- 存储文件路径、页码、章节等信息 created_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX ON document_chunks USING hnsw (embedding vector_cosine_ops); -- 创建HNSW索引加速搜索后端接收处理完成的消息更新前端界面显示“上传成功已生成X个片段”。实操心得上传大型PDF如超过100页时可能会遇到API超时或内存不足。建议在Python服务中实现异步处理和进度回调。一个实用的技巧是在上传界面就提供“分片上传”或“后台任务”的选项并允许用户关闭页面系统通过通知告知处理完成。4.2 执行语义搜索从问题到结果在搜索框输入“如何配置pgvector的HNSW索引参数”。后台的精准匹配过程查询向量化你的问题首先被发送到Python API服务使用与文档块相同的嵌入模型进行向量化。这是关键不同模型生成的向量空间不同无法直接比较。向量相似度搜索Node.js后端或Python服务向PostgreSQL执行一个向量查询。-- 这是一个简化的查询示例 SELECT id, content, metadata, 1 - (embedding [0.12, -0.05, ..., 0.33]) as similarity FROM document_chunks ORDER BY embedding [查询向量] LIMIT 5;是pgvector提供的余弦距离运算符。1 - 距离即得到余弦相似度值越接近1越相似。结果排序与返回数据库返回相似度最高的前K个例如5个文本块及其相似度分数、元数据。前端呈现前端以清晰的方式展示结果通常包括匹配的文本片段高亮显示。相似度分数可作为置信度参考。片段来源如“用户手册.pdf第45页”。一个可展开查看上下文的按钮。为什么是语义搜索如果使用传统关键词搜索“配置 pgvector HNSW 参数”可能会错过那些只写了“设置HNSW索引的m和ef_construction值”的文档。而语义搜索通过向量比对能理解“配置”和“设置”、“参数”和“值”之间的语义关联从而找到更相关的内容。4.3 启用增强生成RAG完整流程如果系统集成了LLM生成功能在搜索后通常会有一个“询问AI”或“生成答案”的按钮。点击后系统执行以下步骤检索同上先获取Top-K个相关文本块。上下文构建将这些文本块的内容、连同它们的元数据如来源作为“上下文”与用户原始“问题”一起按照预定义的提示词模板进行组装。你是一个专业的助手请根据以下上下文信息回答问题。 如果上下文信息不足以回答问题请直接说“根据提供的信息我无法回答这个问题”。 上下文信息 [来自文档块1的内容...] [来源技术白皮书.pdf] [来自文档块2的内容...] [来源安装指南.md] 问题{用户的问题} 请基于上下文提供准确、简洁的回答调用LLM将组装好的提示词发送给配置的LLM如GPT-4。流式回复与引用将LLM的回复流式传输回前端展示。一个优秀的实现还会在生成的答案中以脚注或悬停提示的方式标注出哪句话引用了哪个来源文档块确保答案的可追溯性。注意事项生成答案的质量极度依赖于检索到的上下文质量垃圾进垃圾出和提示词工程。如果检索到的片段不相关或碎片化LLM很容易产生幻觉或给出笼统的回答。因此优化文本分割策略和检索数量K值是提升最终效果的关键。5. 高级配置、优化与故障排查系统跑起来只是第一步让它跑得又快又准才是体现功力的地方。5.1 向量索引优化策略pgvector提供了两种主要索引选择取决于你的数据规模和需求。索引类型创建速度查询速度召回率准确性适用场景IVFFlat快快取决于lists参数可能较低数据量较大百万级对查询速度要求极高可接受一定精度损失。HNSW慢需较长时间构建非常快高通常优于IVFFlat对查询精度和速度要求都高数据量在千万级以下。构建后可获得最佳查询体验。创建HNSW索引的命令示例CREATE INDEX ON document_chunks USING hnsw (embedding vector_cosine_ops) WITH (m 16, ef_construction 64);m每个节点在图中连接的最大邻居数。值越大图越稠密精度越高但构建时间和内存占用也越大。通常范围在16-48。ef_construction构建索引时动态候选列表的大小。值越大构建的索引质量越高但构建越慢。创建IVFFlat索引的命令示例CREATE INDEX ON document_chunks USING ivfflat (embedding vector_cosine_ops) WITH (lists 100);lists将数据分割成的聚类中心数量。规则是lists sqrt(行数)。对于100万行数据lists1000是个不错的起点。优化建议先插入数据后创建索引。在空表上创建索引没有意义索引需要根据数据分布来构建。对于初始数据量不大的场景如十万级优先使用HNSW索引它能提供最好的查询体验。如果数据量增长到百万级以上且构建HNSW索引时间过长可以考虑使用IVFFlat。创建后可以通过SET ivfflat.probes 10;在会话中来调整查询时探查的聚类数量以平衡速度和精度。5.2 嵌入模型的选择与切换项目支持多种嵌入模型切换它们不仅仅是改一个配置项。1. 切换为Cohere模型在.env中将EMBEDDING_MODEL改为embed-english-v3.0或其它Cohere模型。设置COHERE_API_KEY。关键步骤必须重新生成所有文档的向量。因为OpenAI和Cohere的向量空间不同不能混用。这意味着需要清空document_chunks表重新上传和处理所有文档。2. 切换为本地sentence-transformers模型在.env中将EMBEDDING_MODEL改为如all-MiniLM-L6-v2。确保Python服务的Dockerfile或requirements.txt中包含sentence-transformers库。首次请求时Python服务会从Hugging Face下载模型这可能需要几分钟时间和几百MB磁盘空间。优缺点优点数据完全不出局域网无API成本延迟稳定。缺点消耗本地CPU/GPU资源嵌入速度通常慢于API且模型性能可能略逊于顶级商用API。5.3 常见故障与解决方案实录以下是我在部署和运维类似系统中遇到过的典型问题。问题1应用启动失败日志显示“数据库连接被拒绝”。排查检查.env中的DATABASE_URL。在Docker Compose环境下主机名应为服务名如postgres而非localhost。检查PostgreSQL容器是否真的在运行 (docker compose ps)。检查密码是否正确。解决确保数据库服务先于应用启动。在docker-compose.yml中可以使用depends_on和健康检查来管理启动顺序。问题2上传文档后搜索返回结果为空或完全不相关。排查检查Python API服务的日志看文档处理是否报错。登录数据库查询document_chunks表确认数据已插入且embedding字段非空。手动执行一个简单的向量查询测试搜索功能是否正常。SELECT content FROM document_chunks ORDER BY embedding (SELECT embedding FROM document_chunks LIMIT 1) LIMIT 3;检查查询语句的向量是否与存储的向量来自同一个模型。这是最常见的原因。解决确保整个系统使用统一的嵌入模型。如果更换了模型必须重建向量库。问题3搜索或问答响应速度很慢。排查检查是否没有为embedding列创建索引。使用\d document_chunks查看表结构。检查索引类型。对于超过10万条记录的表没有索引或使用低效索引会导致全表扫描速度极慢。检查Python API或LLM API的响应延迟。可能是网络问题或API限速。解决为向量列创建合适的索引HNSW或IVFFlat。优化网络或为LLM调用设置合理的超时和重试机制。问题4Docker容器内存占用过高最终被杀死。排查处理大文档尤其是高分辨率PDF时OCR或解析库可能占用大量内存。解决在docker-compose.yml中为服务尤其是Python API设置内存限制并启用交换空间。services: python-api: deploy: resources: limits: memory: 2G reservations: memory: 1G同时在应用层面实现文档分页处理避免一次性将整个大文件加载到内存。5.4 性能监控与维护建议一个健康的系统需要持续的观察。数据库监控使用pg_stat_statements扩展监控慢查询。重点关注向量搜索查询 (ORDER BY embedding ...) 的性能。应用日志确保Node.js和Python服务都输出了结构化的日志如JSON格式并记录关键操作文档上传开始/结束、搜索请求、模型调用的耗时和状态。这便于通过ELK或LokiGrafana进行聚合分析。定期备份虽然向量数据可以重新生成但备份元数据和关联关系很重要。使用pg_dump定期备份数据库。如果使用本地嵌入模型别忘了备份模型文件或记录其确切版本。缓存策略对于频繁出现的相同或相似查询可以在应用层如Redis缓存搜索结果显著提升响应速度并减少对数据库和LLM API的调用。这个基于rag-system-pgvector的项目蓝图为我们展示了一条构建私有化、可控、高效的智能知识库的清晰路径。从架构设计到每一行配置都体现了在工程实用性与技术先进性之间的权衡。我最深的体会是RAG系统的成功三分之一在于技术选型三分之一在于细节调优如分块、索引剩下的三分之一则在于对业务数据本身的理解——没有哪种分割策略或模型能通吃所有场景。持续地根据实际检索效果反馈进行迭代优化才是让系统真正“智能”起来的关键。如果你在部署过程中遇到了上面没覆盖到的问题我的建议是多查查PostgreSQL和pgvector的官方文档以及LangChain社区的讨论很多棘手的坑前辈们都已经踩过并留下了宝贵的经验。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

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

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