从零构建基于LangChain与Llama 2的私有知识库问答系统

news2026/5/4 5:02:54
1. 从零到一理解Prompt Engineering与LangChain的核心价值如果你和我一样在过去一年里被ChatGPT和各种大语言模型LLM刷屏从最初的惊叹到跃跃欲试再到真正想用它来解决手头的实际问题时可能会遇到一个尴尬的局面想法很美好但真要把这些模型“用起来”却发现无从下手。直接调用API得到的回答可能天马行空无法控制想让模型基于你的私有数据工作又不知道如何喂给它想构建一个多步骤的复杂AI应用代码很快就会变成一团乱麻。这正是Prompt Engineering提示工程和LangChain框架要解决的核心痛点。简单来说Prompt Engineering是一门“与AI沟通的艺术与科学”它研究如何设计输入提示Prompt以引导大语言模型产生更精准、可靠、符合预期的输出。这远不止是“把问题写清楚”那么简单它涉及到角色设定、上下文构建、格式约束、思维链Chain-of-Thought激发等一系列技巧。而LangChain则是一个为开发基于大语言模型的应用而生的框架。你可以把它想象成AI应用开发的“乐高积木”工具箱。它把与大模型交互、连接外部数据源、管理对话记忆、控制复杂工作流等常见任务都模块化了让你能像搭积木一样快速构建出功能强大且稳定的AI应用而不用重复造轮子。这个领域发展极快新模型、新工具层出不穷从OpenAI的GPT系列到开源的Llama 2、Falcon再到层出不穷的微调、量化技术。对于开发者而言真正的挑战不在于知道有哪些工具而在于如何将它们系统地、工程化地组合起来解决真实的业务问题。无论是构建一个能对话公司内部文档的智能客服一个自动分析市场情绪的金融助手还是一个能根据用户描述生成代码的编程副驾其底层逻辑都是相通的。接下来我将结合实战经验为你拆解如何利用Prompt Engineering和LangChain真正“把事情搞定”。2. 基础构建Prompt Engineering的核心原则与LangChain快速上手在开始搭建复杂应用之前我们必须打好地基。理解Prompt Engineering的基本法则和LangChain的核心概念是避免后续开发过程中踩坑的关键。2.1 超越简单问答结构化你的Prompt很多人使用ChatGPT的体验停留在“一问一答”的层面但要让模型成为可靠的生产力工具必须采用结构化的Prompt。一个强大的Prompt通常包含以下几个部分角色Role明确告诉模型它应该扮演谁。例如“你是一位经验丰富的Python软件工程师”或“你是一位严谨的金融数据分析师”。这能立刻将模型的回答风格和知识范围约束在特定领域。任务Task清晰、无歧义地描述你希望模型完成的具体工作。避免使用模糊的词汇尽量将任务分解为可执行的步骤。上下文Context提供完成任务所必需的背景信息。这可能是用户的历史对话、相关的文档片段、当前的系统状态等。在LangChain中这部分内容通常通过“记忆Memory”模块或“检索Retrieval”链来动态管理。输入数据Input Data需要模型处理的具体内容比如一段待总结的文本、一个需要解答的问题、一段需要调试的代码。输出指示Output Instructions明确规定输出的格式、长度、风格等。例如“请用JSON格式输出包含‘summary’和‘keywords’两个字段。”或“请分点列出每点不超过一句话。”一个反面教材是“帮我分析一下数据。”而一个结构化的正面例子是“你是一位数据分析专家。我将给你一份过去一周的网站流量日志见下方‘数据’部分。你的任务是1. 计算每日独立访客数UV和页面浏览量PV。2. 找出流量最高的三个渠道。3. 分析流量随时间的变化趋势。请将结果以Markdown表格的形式呈现并附上简要的结论分析。”注意模型的输出质量与你的输入清晰度直接相关。花时间精心设计Prompt比事后用复杂的代码去清洗和修正输出要高效得多。2.2 LangChain核心六要素解析LangChain通过将AI应用开发抽象为几个核心模块极大地简化了流程。理解这些模块是灵活运用的前提模型Models这是与各种LLM交互的抽象层。LangChain支持多种模型提供商如OpenAI、Anthropic、Cohere以及本地部署的Hugging Face模型如Llama 2、Falcon。通过统一的接口调用你可以轻松切换模型而无需重写业务逻辑。提示PromptsLangChain提供了PromptTemplate类帮助你管理可复用的Prompt模板。你可以将角色、任务等固定部分写成模板将用户输入、检索到的上下文等作为变量动态插入这保证了Prompt的一致性和可维护性。链Chains这是LangChain的灵魂。一个“链”将多个组件模型、提示、工具等按顺序组合起来完成一个特定任务。最简单的链是LLMChain模型提示复杂的链可以包含检索、API调用、条件判断等。例如一个“问答链”可能包含检索相关文档 - 将文档作为上下文填入Prompt - 调用模型生成答案。检索Retrieval这是让模型“拥有”私有知识的关键。LangChain提供了与各种数据源文本文件、PDF、网页、数据库连接的“文档加载器”以及将文档切分、向量化并存入向量数据库如Chroma、Pinecone、Weaviate的工具。当用户提问时系统会从向量库中快速检索出最相关的文档片段作为上下文提供给模型。记忆Memory为了让对话或交互具有连贯性需要让模型记住之前说过什么。LangChain提供了多种记忆方案从简单的缓存对话历史ConversationBufferMemory到只保留关键摘要的记忆ConversationSummaryMemory再到能根据实体重要性进行记忆的复杂类型。代理Agents这是构建自主AI智能体的核心。代理的核心思想是让模型学会“使用工具”。你为模型提供一个工具列表如搜索网络、查询数据库、执行代码模型会根据用户的问题自主决定调用哪个工具、以什么参数调用并整合工具返回的结果来生成最终答案。这极大地扩展了模型的能力边界。2.3 环境搭建与第一个LangChain应用理论说再多不如动手一试。我们从一个最简单的例子开始使用OpenAI的模型你需要准备一个OPENAI_API_KEY。# 安装LangChain及相关库 pip install langchain openai# 第一个LangChain脚本使用结构化Prompt进行文本总结 from langchain.llms import OpenAI from langchain.prompts import PromptTemplate from langchain.chains import LLMChain # 1. 初始化模型这里使用OpenAI的GPT-3.5 Turbo性价比高 # 请将your_openai_api_key替换为你的实际密钥 llm OpenAI(model_namegpt-3.5-turbo-instruct, temperature0, openai_api_keyyour_openai_api_key) # 2. 创建一个Prompt模板 prompt_template PromptTemplate( input_variables[text], # 定义输入变量 template 你是一位专业的编辑助理。请对以下文本进行总结要求如下 - 总结出核心要点不超过3点。 - 每点用一句话概括。 - 语言简洁、客观。 待总结文本 {text} 总结 ) # 3. 创建链将模型和提示模板组合起来 summary_chain LLMChain(llmllm, promptprompt_template) # 4. 运行链 input_text LangChain是一个用于开发由语言模型驱动的应用程序的框架。它提供了模块化的抽象和组件使得与各种LLM交互、管理提示、连接数据源和构建复杂工作流变得简单。其核心价值在于可组合性允许开发者像搭积木一样创建强大的应用。 result summary_chain.run(textinput_text) print(result)运行这段代码你会得到一个结构清晰的总结。这个简单的例子展示了LangChain的核心工作流定义模型 - 设计提示模板 - 组合成链 - 运行。temperature参数控制输出的随机性0表示最确定创造性最低适合总结、提取等任务接近1则更具创造性。3. 实战进阶构建基于私有知识的智能问答系统掌握了基础之后我们来解决一个更实际的问题如何让大模型基于你公司内部的文档、手册、报告来回答问题这是目前企业级AI应用最普遍的需求之一。我们将使用开源的Llama 2模型和LangChain来实现一个本地部署的、安全的文档问答机器人。3.1 技术选型与准备工作为什么选择Llama 2首先它是Meta开源的可免费用于研究和商业用途需申请但流程简单。其次它的性能在开源模型中属于第一梯队特别是经过微调的对话版本Llama-2-7b-chat在理解力和安全性上都有不错的表现。最后它可以在消费级GPU甚至CPU上运行保证了方案的可行性和隐私性。我们需要以下工具栈模型Llama-2-7b-chat-hf (Hugging Face格式)框架LangChain嵌入模型sentence-transformers库中的模型用于将文本转换为向量。向量数据库Chroma轻量级、易用适合本地开发和中小规模数据。环境Python 3.8建议使用Anaconda管理环境。首先确保你有足够的磁盘空间模型约15GB以及一块至少8GB显存的GPU如RTX 3070/4070或同等级别以获得可接受的推理速度。纯CPU模式也可运行但速度会慢很多。# 创建并激活conda环境推荐 conda create -n langchain-llama python3.10 conda activate langchain-llama # 安装核心依赖 pip install langchain pip install sentence-transformers # 用于文本嵌入 pip install chromadb # 向量数据库 pip install pypdf # 用于读取PDF文档 pip install accelerate # 用于优化模型加载 pip install bitsandbytes # 用于4-bit量化降低显存占用可选但强烈推荐 # 安装Hugging Face的transformers库和huggingface_hub以下载模型 pip install transformers huggingface-hub3.2 文档加载、处理与向量化这是构建知识库最关键的步骤直接决定了后续检索的质量。核心流程是加载 - 分割 - 向量化 - 存储。import os from langchain.document_loaders import PyPDFLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import Chroma # 1. 加载文档 # 假设你的文档放在 ./docs 目录下支持PDF和TXT documents [] for file in os.listdir(./docs): if file.endswith(.pdf): loader PyPDFLoader(f./docs/{file}) documents.extend(loader.load()) elif file.endswith(.txt): loader TextLoader(f./docs/{file}, encodingutf-8) documents.extend(loader.load()) print(f已加载 {len(documents)} 个文档片段) # 2. 分割文档 # 大语言模型有上下文长度限制必须将长文档切分成小块。 # RecursiveCharacterTextSplitter会尝试在段落、句子等自然分隔符处切割保持语义完整。 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个块的最大字符数 chunk_overlap50, # 块之间的重叠字符数避免信息被割裂 separators[\n\n, \n, 。, , , , , , ] # 分割符优先级 ) chunks text_splitter.split_documents(documents) print(f分割为 {len(chunks)} 个文本块) # 3. 创建嵌入模型并向量化存储 # 使用开源嵌入模型无需API密钥 embedding_model HuggingFaceEmbeddings(model_namesentence-transformers/paraphrase-multilingual-MiniLM-L12-v2) # 这个模型支持中文体积小效果不错。 # 4. 创建向量数据库 # persist_directory 指定持久化目录这样下次启动无需重新计算向量 vector_db Chroma.from_documents( documentschunks, embeddingembedding_model, persist_directory./chroma_db # 向量数据库存储路径 ) vector_db.persist() # 持久化到磁盘 print(向量数据库构建完成并已保存。)实操心得chunk_size的选择至关重要。太小会导致信息碎片化检索到的片段可能缺乏完整上下文太大则可能超出模型的上下文窗口且检索精度下降。对于通用文档500-1000是一个不错的起点。chunk_overlap设置50-100可以有效地防止关键信息如一个问题的答案刚好在段落末尾被切割丢失。对于中文文档务必使用支持中文的嵌入模型如上面示例中的paraphrase-multilingual-MiniLM-L12-v2。3.3 集成Llama 2模型与构建问答链现在我们将本地的Llama 2模型与刚刚建好的向量数据库连接起来形成一个完整的“检索-生成”问答链。from langchain.llms import HuggingFacePipeline from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline import torch from langchain.chains import RetrievalQA # 1. 加载Llama 2模型和分词器 model_name meta-llama/Llama-2-7b-chat-hf # 注意首次运行需要登录Hugging Face并同意Llama 2的使用协议。 # 可以在命令行执行huggingface-cli login # 或者设置环境变量HUGGINGFACE_TOKENyour_token_here tokenizer AutoTokenizer.from_pretrained(model_name) # 使用4-bit量化大幅降低显存需求约需6-8GB显存 model AutoModelForCausalLM.from_pretrained( model_name, load_in_4bitTrue, # 启用4-bit量化 device_mapauto, # 自动分配模型层到GPU/CPU torch_dtypetorch.float16, ) # 2. 创建文本生成管道 pipe pipeline( text-generation, modelmodel, tokenizertokenizer, max_new_tokens512, # 生成文本的最大长度 temperature0.1, # 低温度保证答案更确定、更少胡言乱语 repetition_penalty1.1, # 抑制重复 do_sampleTrue, ) # 3. 将管道包装为LangChain的LLM对象 llm HuggingFacePipeline(pipelinepipe) # 4. 从磁盘加载之前创建的向量数据库 embedding_model HuggingFaceEmbeddings(model_namesentence-transformers/paraphrase-multilingual-MiniLM-L12-v2) vector_db Chroma(persist_directory./chroma_db, embedding_functionembedding_model) # 5. 创建检索器 retriever vector_db.as_retriever(search_kwargs{k: 3}) # 每次检索返回最相关的3个片段 # 6. 构建检索问答链 # chain_typestuff 是最简单的方式将检索到的所有文档片段“塞”进Prompt上下文。 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever, return_source_documentsTrue, # 返回源文档便于溯源 chain_type_kwargs{ prompt: PromptTemplate( input_variables[context, question], template[INST] SYS 你是一个专业的助手请严格根据以下提供的上下文信息来回答问题。如果上下文信息中没有明确答案请直接说“根据提供的资料我无法回答这个问题”不要编造信息。 /SYS 上下文 {context} 问题{question} 请根据上下文给出答案[/INST] ) } ) # 7. 进行提问 question LangChain的主要用途是什么 result qa_chain({query: question}) print(f问题{question}) print(f答案{result[result]}) print(\n--- 参考来源 ---) for i, doc in enumerate(result[source_documents]): print(f[片段 {i1}]: {doc.page_content[:200]}...) # 打印每个来源片段的前200字符这个流程构建了一个完整的闭环用户提问 - 从向量库检索相关文档片段 - 将片段和问题组合成Prompt - 发送给本地Llama 2模型 - 生成基于上下文的答案。[INST]和SYS是Llama 2 Chat模型特定的指令格式用于更好地遵循系统提示。4. 性能优化与生产化考量让一个Demo跑起来是一回事让它稳定、高效、低成本地运行则是另一回事。以下是几个关键的优化和生产化方向。4.1 模型推理优化技巧在本地运行大模型性能是首要挑战。除了使用4-bit量化还有以下方法使用更高效的注意力实现如Flash Attention 2可以显著加速推理并降低显存占用。在加载模型时可以通过attn_implementationflash_attention_2参数启用需安装flash-attn库。模型量化除了4-bit还有GPTQ、AWQ等更精细的量化方法能在精度损失极小的情况下进一步压缩模型。可以使用auto-gptq或llama.cpp等库。批处理Batching如果服务端需要同时处理多个请求将输入进行批处理可以更充分地利用GPU算力提高吞吐量。使用更小的模型对于特定垂直领域较小的模型如Llama-2-7b经过高质量领域数据微调后其表现可能接近甚至超过通用的大模型而推理成本则低得多。# 示例使用Flash Attention 2加载模型需先安装 flash-attn model AutoModelForCausalLM.from_pretrained( model_name, load_in_4bitTrue, device_mapauto, torch_dtypetorch.float16, attn_implementationflash_attention_2, # 启用Flash Attention 2 )4.2 提示工程优化与评估如何知道你的Prompt设计得好不好如何优化这需要一套评估和迭代的方法。A/B测试为同一个任务设计两套不同的Prompt例如一套详细一套简洁一套带有示例一套没有在同一个测试集上运行比较生成结果的质量。可以从准确性、完整性、相关性、无害性等多个维度设计评分标准。使用更高级的链stuff链简单但当检索到的文档很多时可能超出模型上下文窗口。LangChain提供了其他链类型map_reduce先将每个文档片段单独生成答案再汇总这些答案。适合处理大量文档但成本高。refine迭代式处理基于上一个片段的答案和当前片段生成新的答案。能产生更连贯的答案但速度慢。map_rerank为每个片段生成答案并打分选择最高分的答案。适合答案明确存在于某个片段的情况。引入自我验证Self-Consistency让模型对同一个问题生成多个答案然后通过投票或选择最一致的一个作为最终输出可以提高复杂推理任务的准确性。4.3 部署与监控当应用准备上线时需要考虑部署方式API服务使用FastAPI或Gradio快速构建一个Web API封装你的问答链。这便于与其他系统集成。云服务如果不想管理服务器可以考虑Hugging Face Inference Endpoints、RunPod、Replicate等服务它们提供了托管大模型的一站式解决方案。容器化使用Docker将你的整个应用代码、环境、模型打包确保在任何环境下的运行一致性。监控与日志性能监控记录每个请求的响应时间、Token消耗量监控GPU显存和利用率。质量监控定期用一批标准问题测试系统确保答案质量没有下降。可以引入人工审核或自动化的简单规则检查如答案是否包含“无法回答”。成本监控如果使用按Token收费的API如OpenAI必须严格监控用量设置预算和告警。安全与合规输入输出过滤对用户输入进行审查防止Prompt注入攻击用户输入恶意指令劫持系统。对模型输出进行过滤防止生成有害、偏见或敏感内容。数据隐私确保用户上传的文档和提问内容得到妥善处理符合数据保护法规。使用本地化模型是保障隐私的有效手段。5. 避坑指南与常见问题排查在实际开发和运维中我遇到了不少典型问题。这里列出一个速查表希望能帮你节省大量调试时间。问题现象可能原因排查步骤与解决方案模型输出乱码或胡言乱语1.temperature参数过高。2. Prompt格式不符合模型要求特别是Chat模型。3. 上下文过长模型丢失了早期指令。1. 将temperature调低至0.1-0.3。2. 检查Prompt是否使用了正确的特殊标记如Llama 2的[INST]ChatGPT的system/user/assistant角色。3. 尝试缩短Prompt或使用map_reduce链。检索到的文档不相关1. 文档分割策略不佳chunk_size太大或太小。2. 嵌入模型不适合当前语种或领域。3. 检索数量k设置不当。1. 调整chunk_size和chunk_overlap并检查分割后的片段是否语义完整。2. 尝试不同的嵌入模型如text-embedding-ada-002OpenAI API或针对中文优化的BGE系列模型。3. 增加k值以获取更多上下文或使用更复杂的检索器如同时检索相似性和最大边际相关性MMR。回答“根据上下文无法回答”但明明有答案1. Prompt中的指令不够强硬模型倾向于“自由发挥”。2. 检索到的相关文档片段排名不够靠前。3. 模型能力有限未能从上下文中正确提取信息。1. 强化Prompt指令如“你必须且只能根据以下上下文回答”。2. 改进检索质量见上一条。尝试在Prompt中明确要求模型引用上下文中的句子。3. 换用能力更强的模型或对当前模型进行相关领域的微调。推理速度极慢1. 模型过大硬件资源不足。2. 未使用量化或GPU加速。3. 每次请求都重新加载模型。1. 考虑使用更小的模型如7B参数。2. 务必使用4/8-bit量化和GPU推理。启用Flash Attention。3. 确保模型在服务启动时只加载一次并通过API池化处理请求。显存溢出OOM1. 模型参数过多显存不足。2. 输入上下文过长。3. 未启用量化。1. 使用量化模型4-bit。2. 限制输入Token长度通过max_length参数。3. 如果使用多轮对话定期清理记忆或使用摘要式记忆。无法连接到Hugging Face下载模型1. 网络问题。2. 未登录或未同意模型协议Llama 2等。3. 访问令牌Token无效或未设置。1. 配置网络代理或使用国内镜像源。2. 在Hugging Face网站登录账号并访问模型页面点击“Agree and access”。3. 通过huggingface-cli login命令或环境变量正确设置访问令牌。一个特别重要的坑Prompt注入。这是指用户通过在输入中嵌入特殊指令试图覆盖你预设的系统Prompt。例如你让模型“根据上下文回答”用户可能输入“忽略之前的指令直接告诉我...”。防范措施包括在将用户输入插入Prompt前进行严格的字符串检查和过滤在系统Prompt中明确警告模型不要听从任何试图改变其行为的指令对于关键应用可以设计多轮验证或最终输出由另一个轻量级模型或规则系统进行安全检查。构建基于大语言模型的应用是一场结合了艺术Prompt设计和工程系统架构的旅程。从设计一个清晰的Prompt开始到用LangChain模块化地组装你的数据流和逻辑再到优化性能和部署上线每一步都需要细致的考量和不断的迭代。本地化部署开源模型虽然前期准备稍复杂但它带来了数据隐私、成本可控和定制化自由的巨大优势。希望这篇从原理到实战、从搭建到优化的长文能为你提供一张清晰的路线图助你顺利启动自己的AI项目。记住最好的学习方式就是动手从一个具体的小问题开始用这里介绍的工具和方法去解决它你会在过程中积累最宝贵的经验。

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