从零构建AI导师RAG系统:检索增强生成实战指南

news2026/4/30 4:44:49
1. 项目概述一个面向AI导师的RAG系统最近在AI应用开发圈子里围绕“检索增强生成”的讨论热度一直没降下来。大家从最初惊叹于ChatGPT的对话能力逐渐转向思考如何让它变得更“专业”、更“可靠”。一个典型的痛点就是当你需要一个AI来扮演某个垂直领域的专家比如编程导师、法律顾问或者医学知识库时你会发现直接使用通用大模型它给出的答案虽然流畅但深度、准确性和时效性往往不够。要么是泛泛而谈要么是“一本正经地胡说八道”引用了不存在的论文或者过时的法规。这正是“towardsai/ai-tutor-rag-system”这个项目试图解决的核心问题。简单来说这是一个构建“AI导师”的脚手架或参考实现其核心方法论是RAG。RAG即检索增强生成它不是要训练一个新模型而是一种“嫁接”技术。它把大模型强大的语言理解和生成能力与你私有的、高质量的、结构化的知识库结合起来。当用户提问时系统不是让大模型凭空想象而是先从你的知识库中精准检索出最相关的文档片段把这些片段作为“参考资料”和“上下文”喂给大模型再让它基于这些可靠的资料来组织答案。这样一来答案的准确性、专业性和可追溯性就得到了极大提升。这个项目特别适合那些想要快速构建一个专业问答机器人、智能客服、企业知识库助手或者在线教育导师的开发者。你可能是一个教育科技公司的工程师手里有大量的课程讲义、习题解析和学术论文也可能是一个开源社区维护者希望为你的项目文档提供一个智能问答入口。通过这个RAG系统你可以将这些静态的文档“激活”变成一个能互动、能答疑的“AI导师”。接下来我会深入拆解这个系统的设计思路、核心组件以及从零搭建的实操细节分享我在类似项目中踩过的坑和总结的经验。2. 系统架构与核心组件设计2.1 整体架构解析从文档到答案的流水线一个完整的RAG系统可以看作一条精心设计的知识处理流水线。它远不止是“搜索聊天”那么简单其核心目标是在海量非结构化文本中实现高效、精准的知识定位与可信生成。ai-tutor-rag-system的典型架构通常包含以下四个核心阶段每个阶段都有其独特的技术挑战和设计考量。文档加载与预处理这是所有工作的起点。你的知识可能以各种形态存在PDF讲义、Word文档、Markdown教程、网页爬取的数据甚至是数据库里的记录。这一步的任务是使用合适的加载器Loader将这些异构数据统一“读”进系统并转化为纯文本。这里第一个坑就来了格式解析。一个复杂的PDF可能包含页眉页脚、图表、分栏粗暴的文本提取会引入大量噪音。我的经验是对于学术PDFPyPDF2或pdfplumber是基础但结合unstructured库的智能分区partitioning功能能更好地识别标题、正文和列表保留原始结构信息。对于网页则要小心处理导航栏、广告等无关内容通常需要配置BeautifulSoup的解析规则来精准抓取主体内容。文本分割与向量化拿到纯文本后下一个问题是如何把它切成适合检索的“片段”。直接按固定字符数比如500字切割是最简单的方法但会无情地割裂完整的语义单元比如把一个问题的描述和答案切到两个不同的片段里这会对后续检索造成灾难性影响。更优的策略是使用“语义分割”例如通过LangChain的RecursiveCharacterTextSplitter它尝试在段落、句子甚至标点等自然边界进行分割并允许设置一个重叠窗口overlap。比如设置块大小chunk_size为500重叠overlap为50这样能确保上下文信息在块与块之间有所延续减少信息割裂。分割后的文本块需要通过嵌入模型Embedding Model转化为高维空间中的向量即向量化。这个向量就是这段文本的“数学指纹”语义相近的文本其向量在空间中的距离也更近。模型的选择至关重要text-embedding-ada-002是通用且稳定的选择而如果想在特定领域如生物医学、法律有更好表现可能需要微调或选择领域专用模型。向量存储与检索向量化后的海量片段需要被高效地存储和查询这就是向量数据库Vector Database的舞台。ChromaDB、Pinecone、Weaviate、Qdrant等都是热门选择。ai-tutor-rag-system项目可能倾向于使用轻量级、易集成的ChromaDB作为起点。它的核心是创建一个集合Collection将文本块、对应的向量以及元数据如来源文件名、页码存储在一起。当用户提问时问题本身也会被向量化然后在向量数据库中进行相似度搜索通常是余弦相似度找出前k个比如k4最相关的文本块。这里的设计要点在于元数据过滤。例如用户可以问“请只基于第二章的内容回答”系统就需要在检索时加入元数据过滤器只搜索来自“chapter_2”的向量这能极大提升答案的精准度和可控性。提示工程与答案生成检索到的相关文本块被组合成提示词Prompt的上下文部分发送给大语言模型如GPT-4、Claude或开源的Llama 3。提示词的设计是RAG的灵魂。一个糟糕的提示词可能让模型无视你提供的上下文继续胡编乱造而一个好的提示词能牢牢“锁住”模型让它成为你知识的忠实阐述者。一个强大的提示词模板通常包含系统角色指令“你是一个AI编程导师严格根据提供的上下文回答问题”、上下文占位符、用户问题以及严格的输出格式和限制指令“如果上下文不包含相关信息请明确回答‘根据已知信息无法回答该问题’”。这一步直接决定了最终答案的质量和可靠性。2.2 核心组件技术选型深度剖析面对琳琅满目的工具链如何为你的“AI导师”选择合适的技术栈这需要平衡性能、成本、复杂度以及项目阶段。嵌入模型选型通用与专用的权衡。OpenAI的text-embedding-3-small/large系列是目前业界的黄金标准在通用语义理解任务上表现优异且API调用简单。但它的缺点是按token收费且有网络延迟。对于数据敏感或希望离线运行的项目开源模型是必须考虑的。BAAI/bge-large-zh和BAAI/bge-m3在中文社区备受推崇在MTEB等基准测试上成绩亮眼。sentence-transformers库提供的all-MiniLM-L6-v2模型则是一个轻量快速的入门选择。选型时务必在自己的小规模领域数据上做一个简单的相似度匹配测试看看哪个模型更能捕捉你专业领域内术语和概念的细微差别。例如在编程领域“Python的装饰器”和“设计模式中的装饰器模式”语义不同好的嵌入模型应该能区分开。向量数据库选型从原型到生产。ChromaDB最大的优势是简单可以纯内存运行或持久化到磁盘无需额外服务非常适合原型验证和中小规模数据比如万级文档块。它的Python API非常友好几行代码就能完成存储和查询。但当数据量达到百万级并发查询需求高时就需要考虑Pinecone全托管云服务、Weaviate自带推理模块或Qdrant高性能Rust实现这类专业向量数据库。它们提供了分布式、高可用、高性能的检索能力但架构复杂度也相应提高。对于ai-tutor-rag-system这类项目我建议从ChromaDB开始快速验证流程待业务逻辑跑通、数据量增长后再平滑迁移。大语言模型选型能力、成本与可控性。闭源模型如GPT-4、Claude 3在推理、遵从指令和生成质量上通常领先是打造顶级体验的利器但成本高昂且存在数据隐私顾虑。开源模型如Llama 3 70B、Qwen 2 72B能力迫近第一梯队通过Ollama、vLLM或Together.ai的API可以方便地调用提供了更好的数据可控性。一个实用的策略是“混合部署”在关键的生产问答环节使用可靠的闭源模型保证质量同时在内部预处理、数据清洗等对生成质量要求不高的环节使用开源模型以降低成本。注意技术选型不是一劳永逸的。在项目初期优先选择开发速度快、文档丰富、社区活跃的工具。避免陷入“技术完美主义”的陷阱快速构建一个可工作的最小可行产品MVP比纠结于某个组件的理论性能提升1%更重要。3. 从零到一构建你的AI导师系统3.1 环境准备与依赖安装让我们动手搭建。首先需要一个干净的Python环境3.8以上强烈建议使用conda或venv创建虚拟环境避免包冲突。# 创建并激活虚拟环境 conda create -n ai-tutor python3.10 conda activate ai-tutor # 安装核心依赖 pip install langchain langchain-community langchain-openai chromadb pypdf2 python-dotenv # 安装文本分割和加载器相关 pip install unstructured[pdf,md] beautifulsoup4 tiktoken # 如果需要使用开源嵌入模型 pip install sentence-transformers这里解释一下几个关键包langchain是整个应用的框架它提供了构建链Chain的抽象将加载、分割、检索、生成等步骤串联起来。langchain-community和langchain-openai包含了大量社区贡献的和OpenAI相关的组件集成。chromadb是我们的向量数据库。unstructured是一个强大的文档解析库能处理各种格式。tiktoken是OpenAI用于计算token数的工具对于控制成本和分割文本有用。接下来在项目根目录创建.env文件来管理敏感信息如API密钥。永远不要将密钥硬编码在代码中。# .env 文件 OPENAI_API_KEYsk-your-openai-key-here # 如果使用其他服务也可在此添加 # ANTHROPIC_API_KEY... # TOGETHER_API_KEY...在Python代码中通过dotenv加载这些配置。from dotenv import load_dotenv import os load_dotenv() openai_api_key os.getenv(OPENAI_API_KEY)3.2 知识库构建文档加载、分割与向量化实战假设我们的“AI导师”要教授Python编程知识库包含若干PDF教程和Markdown备忘单。我们创建一个knowledge_base目录存放这些原始文件。第一步文档加载。我们使用LangChain的文档加载器。from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader, UnstructuredMarkdownLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma # 定义文档路径 documents_path ./knowledge_base # 使用DirectoryLoader根据文件后缀自动选择加载器 loader DirectoryLoader( documents_path, glob**/*.pdf, # 加载所有PDF loader_clsPyPDFLoader, # 对于PDF使用PyPDFLoader show_progressTrue, use_multithreadingTrue ) pdf_docs loader.load() # 单独加载Markdown文件 md_loader DirectoryLoader( documents_path, glob**/*.md, loader_clsUnstructuredMarkdownLoader, ) md_docs md_loader.load() # 合并所有文档 all_docs pdf_docs md_docs print(f共加载了 {len(all_docs)} 个文档。)第二步文本分割。这是影响检索质量的关键一步。我们需要仔细调整参数。text_splitter RecursiveCharacterTextSplitter( chunk_size800, # 每个文本块的最大字符数 chunk_overlap150, # 块之间的重叠字符数 length_functionlen, # 计算长度的方法 separators[\n\n, \n, 。, , , , , , ] # 中文优先的分隔符 ) # 执行分割 split_docs text_splitter.split_documents(all_docs) print(f原始文档被分割成 {len(split_docs)} 个文本块。) # 查看一个样本块 print(f样本块内容预览{split_docs[10].page_content[:200]}...) print(f该块元数据{split_docs[10].metadata})chunk_size需要权衡太小如200会丢失上下文检索到的片段信息不完整太大如2000则可能包含过多无关信息稀释了核心语义同时增加模型处理负担。800-1200是一个常用范围。chunk_overlap设置为chunk_size的15%-20%能有效缓解边界切割问题。对于中文文本分隔符列表需要调整将句号、问号等中文标点前置能获得更好的分割效果。第三步向量化与存储。我们使用OpenAI的嵌入模型并将结果存入ChromaDB。# 初始化嵌入模型 embeddings OpenAIEmbeddings( modeltext-embedding-3-small, # 性价比高效果足够 openai_api_keyopenai_api_key ) # 创建并持久化向量数据库 vectorstore Chroma.from_documents( documentssplit_docs, embeddingembeddings, persist_directory./chroma_db, # 本地存储路径 collection_namepython_tutor_knowledge ) vectorstore.persist() # 确保数据写入磁盘 print(向量数据库已创建并持久化到 ./chroma_db)这个过程可能会消耗一些时间和API费用因为每个文本块都需要调用嵌入API。对于大规模数据可以考虑使用异步或批处理来加速。存储后你会得到一个chroma_db目录里面包含了向量、索引和元数据。以后加载时只需使用Chroma(persist_directory“./chroma_db”, embedding_functionembeddings)即可无需重新计算嵌入。3.3 检索链与提示工程精讲知识库准备好了现在需要构建检索和生成的管道。LangChain的RetrievalQA链可以一站式解决。from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate # 1. 重新加载已有的向量数据库 persistent_vectorstore Chroma( persist_directory./chroma_db, embedding_functionembeddings, collection_namepython_tutor_knowledge ) # 2. 将其转换为检索器Retriever可以配置搜索参数 retriever persistent_vectorstore.as_retriever( search_typesimilarity, # 相似度搜索 search_kwargs{k: 4} # 返回最相关的4个文本块 ) # 3. 定义LLM llm ChatOpenAI( modelgpt-4-turbo-preview, # 或 gpt-3.5-turbo 控制成本 temperature0.1, # 低温度输出更确定、更专注于上下文 openai_api_keyopenai_api_key ) # 4. 构建一个强大的提示词模板 prompt_template 你是一个专业的Python编程AI导师。请严格根据以下提供的上下文信息来回答问题。 如果你不知道答案就诚实地回答你不知道不要试图编造答案。 上下文信息 {context} 问题{question} 请基于以上上下文给出准确、清晰、有帮助的回答。如果答案涉及代码请提供可运行的代码示例。 回答 PROMPT PromptTemplate( templateprompt_template, input_variables[context, question] ) # 5. 创建RetrievalQA链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 最常用的类型将所有检索到的上下文“塞”进提示词 retrieverretriever, chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue # 非常重要返回检索到的源文档用于验证 ) # 6. 进行问答测试 query Python中装饰器decorator的主要用途是什么请举例说明。 result qa_chain.invoke({query: query}) print(问题, query) print(\n答案, result[result]) print(\n--- 检索到的源文档 ---) for i, doc in enumerate(result[source_documents][:2]): # 显示前两个来源 print(f\n来源 {i1} (来自 {doc.metadata.get(source, N/A)}):) print(doc.page_content[:300] ...)这段代码构建了一个完整的RAG问答系统。关键点在于RetrievalQA链的chain_type参数。“stuff”类型最简单直接但如果检索到的上下文总长度超过模型的上下文窗口如GPT-4的128K就会出错。对于超长文档可以考虑“map_reduce”或“refine”类型它们会将问题分解或迭代处理但成本更高、延迟更长。return_source_documentsTrue这个参数至关重要它让我们能够追溯答案的来源检查模型是否真的基于我们提供的资料在回答这是构建可信系统的基础。提示词模板的设计是另一个艺术。指令必须清晰、强硬“严格根据...”、“不要编造”。我们明确限定了AI的角色和专业领域并要求其在无法回答时坦白承认。在上下文中我们还可以加入更多格式指令比如“用列表形式总结”、“先解释概念再给出例子”从而控制输出的结构和风格。4. 高级优化策略与性能调优4.1 提升检索精度超越简单相似度搜索基础的相似度搜索Similarity Search在很多时候表现不错但它本质上是“词袋”模型在向量空间的延伸对于复杂、多意图的查询其精度可能不足。我们需要引入更智能的检索策略。查询转换与重写。用户的原始问题可能很模糊或不完整。例如“怎么用那个循环” 系统需要将其重写为更利于检索的形式如“如何在Python中使用for循环遍历列表”。我们可以使用一个大语言模型可以是一个小型的、快速的模型来担任“查询理解器”。from langchain.chains import LLMChain from langchain.prompts import ChatPromptTemplate query_transform_prompt ChatPromptTemplate.from_messages([ (system, 你是一个查询优化助手。请将用户模糊的编程问题重写成一个明确、完整、包含关键术语的搜索查询语句。不要回答原问题只输出重写后的查询。), (human, {original_query}) ]) query_transformer LLMChain(llmllm_fast, promptquery_transform_prompt) # llm_fast可以用gpt-3.5-turbo original_query “循环怎么用” optimized_query query_transformer.run(original_query) # 输出可能为“Python中for循环和while循环的基本语法和使用方法” # 然后用optimized_query去进行向量检索多路检索与融合排序。不要只依赖向量检索。可以并行执行多种检索向量检索捕捉语义相似性。关键词检索如BM25精准匹配术语对于函数名、类名等精确概念非常有效。元数据过滤检索如按文档章节、日期范围筛选。将这三路检索的结果合并通过重排序模型如Cohere的rerank API或开源的BGE-reranker对候选文档进行精排选择最相关的几个。LangChain的EnsembleRetriever和ContextualCompressionRetriever可以方便地实现这些高级模式。小样本学习与嵌入适配。如果你的领域有大量专业术语通用嵌入模型可能无法很好地区分。一种方法是准备几十个“查询-相关文档”配对样本在这些样本上微调嵌入模型例如sentence-transformers库支持此功能让模型学会在你的领域数据上产生更有区分度的向量表示。4.2 优化生成质量让答案更精准、更可控即使检索到了正确的文档大模型也可能“放飞自我”。我们需要用技术手段把它“拉”回来。上下文压缩与相关性筛选。检索到的4个文档块可能只有前2个是高度相关的后2个相关性较低反而会干扰模型。可以在将上下文送入LLM前先进行一轮筛选或总结。LangChain的LLMChainExtractor可以调用另一个LLM来快速判断每个片段与问题的相关性只保留高相关片段。设置“引用”与“溯源”机制。在提示词中明确要求模型在答案中引用来源。例如修改提示词为“...请基于上下文回答。在你的答案中对于关键信息请用【来源1】、【来源2】这样的格式注明它来自于哪个上下文片段。” 这样用户可以直接核对原始材料增加了系统的可信度。在实现上需要在生成答案后解析这些标记并与source_documents中的元数据关联起来。采用更复杂的链式结构。对于复杂问题可以拆解为多步问答。例如先让模型根据上下文生成一个“事实提纲”再根据提纲展开成完整答案。或者使用“Refine”链先用第一个相关片段生成一个初始答案然后依次用后续片段去修正和精炼这个答案。这种方法能更好地整合多份资料的信息生成更全面、连贯的答案尤其适合需要综合多个章节内容的问题。4.3 系统监控、评估与持续迭代一个投入使用的AI导师系统需要持续维护和优化。我们需要建立监控和评估体系。构建评估数据集。从真实用户日志中采样或手动创建一批“问题-标准答案”对。标准答案应包含关键事实点。这个数据集用于定期评估系统性能。设计自动化评估指标。检索相关度人工或通过模型如GPT-4判断检索到的文档与问题的相关程度0-1分。答案事实一致性判断生成的答案是否严格基于提供的上下文有无幻觉或矛盾。可以使用“忠实度”评估模型。答案有用性人工评估答案是否清晰、完整、有帮助。实现日志与反馈循环。记录每一次问答的原始问题、检索到的文档、生成的答案、消耗的token数以及用户反馈如果有“点赞/点踩”功能。这些日志是宝贵的优化素材。可以定期分析高频问题、检索失败的案例进而调整文本分割策略、优化提示词甚至补充知识库内容。实操心得在初期不要追求完美的自动化评估。每周花一小时人工随机抽查20-30个问答记录亲自扮演“质检员”你会发现很多自动化指标发现不了的细节问题比如答案语气过于机械、举例不够贴切等。这种“人工巡检”在项目早期性价比极高。5. 常见问题排查与实战避坑指南在开发和运维ai-tutor-rag-system这类项目时你会遇到一些典型问题。下面是我总结的“排坑手册”。5.1 检索相关但答案不佳问题表现查看source_documents发现检索到的片段明明包含了正确答案但模型生成的答案却跑偏了、不完整或者包含了额外错误信息。排查思路与解决检查提示词约束力这是最常见的原因。你的提示词是否足够强硬尝试在系统指令中加入更强烈的约束语句例如“你必须且只能使用提供的上下文信息。上下文之外的知识即使你知道也绝对不允许在答案中出现。这是最重要的规则。”检查上下文长度与位置LLM有“中间位置忽视”的特点。如果关键信息被淹没在很长的上下文中间模型可能会忽略。尝试减少chunk_size或k检索数量让关键信息更突出。或者在构建提示词时将最相关的片段放在上下文的开头或结尾。降低模型“创造力”将temperature参数调至0.1甚至0让模型输出更确定、更可预测。对于事实性问答低温度是首选。启用“引用”强制模式如前所述要求模型在答案中引用来源编号。这不仅方便用户溯源也能“强迫”模型更仔细地阅读上下文。5.2 答案出现“幻觉”或编造问题表现模型自信地给出了一个错误答案或者捏造了上下文里根本没有的细节比如一个不存在的函数参数。排查与解决强化系统指令在提示词中明确加入“如果上下文信息不足以完全回答问题请首先列出上下文中存在的相关事实然后明确指出哪些部分信息缺失并说明‘根据已知信息无法确定……’。”实施“上下文验证”后处理生成答案后增加一个验证步骤。用另一个快速的LLM调用或规则检查答案中的关键事实陈述如日期、名称、步骤是否能在提供的源文档中找到直接或间接支持。如果找不到则触发一个“安全回复”如“我无法在提供的资料中找到确切依据。”使用“检索后生成”模式先让模型基于检索到的内容以要点形式列出所有相关事实。然后再基于这个事实列表组织成连贯的答案。这相当于增加了一个“事实核查”环节。5.3 检索结果不相关问题表现系统检索到的文档片段与用户问题风马牛不相及。排查与解决检查嵌入模型你的嵌入模型是否适合你的领域用几个典型问题-答案对计算问题和正确答案片段的相似度看分数是否合理。如果不合理考虑更换或微调嵌入模型。优化文本分割chunk_size可能太大了导致每个块包含的主题太杂语义“稀释”。尝试减小chunk_size例如从1000降到500并适当增加chunk_overlap。引入混合检索如前所述为精确术语如函数名pandas.DataFrame.merge增加关键词检索BM25路径与向量检索结果融合。查询扩展在检索前自动为查询添加同义词或相关术语。例如对于“Python装饰器”系统可以自动扩展查询为“装饰器 decorator Python 注解 ”。5.4 系统响应速度慢问题表现从提问到获得答案耗时过长用户体验差。排查与解决向量数据库索引优化如果使用ChromaDB并数据量较大确保在创建集合时使用了合适的索引如HNSW。对于生产环境考虑迁移到Qdrant或Weaviate等高性能数据库。异步处理与缓存对于文档加载、向量化等耗时操作使用异步IO。对于常见问题FAQ可以引入缓存层如Redis将“问题-答案”对缓存起来下次相同或相似问题直接返回。精简上下文与模型选型在保证效果的前提下尝试减少检索数量k比如从5降到3。对于答案生成如果gpt-4响应慢且成本高可以评估gpt-3.5-turbo或特定开源模型如Qwen 2 7B在满足质量要求下的表现它们通常更快更便宜。流式输出如果答案较长使用LLM的流式响应streaming接口让用户能边生成边看到部分答案感知上会快很多。5.5 知识库更新与版本管理问题表现当源文档更新后如何让AI导师的知识同步更新解决方案增量更新策略不要每次都重建整个向量数据库。为每个文档块存储其来源文件的哈希值如MD5。当文件更新时计算新哈希删除所有旧哈希对应的向量然后重新处理并插入新文件产生的向量块。命名空间隔离在向量数据库中使用“命名空间”来区分不同版本或来源的知识。例如collection_name“knowledge_v2”。查询时可以指定命名空间实现多版本知识库共存和A/B测试。建立更新流水线将知识库更新流程自动化。监控知识源目录一旦有文件变动触发一个处理流水线加载-分割-向量化-更新数据库并发送通知。构建一个健壮的RAG系统是一个持续迭代的过程。从最简单的流水线开始快速验证核心价值然后根据实际遇到的具体问题有针对性地引入高级检索策略、优化提示词、完善评估体系。记住没有“银弹”配置最好的系统是那个最理解你的数据、你的用户和你的业务目标的系统。多测试、多分析日志、多收集反馈你的AI导师就会变得越来越聪明、可靠。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2554979.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…