RAG工程-基于LangChain 实现 Advanced RAG(预检索-查询优化)(上)
Enrich 完善问题
完善问题流程概述
问题转述
在典型RAG架构中,用户问题的质量直接影响检索系统的表现。研究表明,未经优化的自然语言查询会导致:
-
关键实体识别缺失
-
语义漂移导致召回偏离
-
长尾问题检索失败率升高
大多数用户并非提示词工程专家,其提出的问题往往存在模糊、冗余或缺乏关键背景信息等问题。为了提升检索效果,在 Advanced RAG 预检索查询场景下,问题转述成为优化问题质量的关键手段。下面我将详细介绍问题转述的三种核心优化方式,并结合 langchain 框架给出具体的代码实现。
明确核心问题,去除冗余内容
用户提出的问题可能包含大量与核心诉求无关的描述,这些冗余信息会干扰检索的准确性。例如,用户询问 “我前几天在网上看到一款特别酷炫的笔记本电脑,它有着超级好看的外观,还有特别厉害的性能,我现在特别想知道它到底怎么样”,其中 “特别酷炫”“超级好看的外观”“特别厉害的性能” 等修饰性表述属于冗余内容。通过分析,我们可以将核心问题提取为 “这款笔记本电脑的性能怎么样”。
我们可以通过LLM识别并保留核心语义单元,过滤这些干扰性描述。以下是基于LangChain 框架的代码示例:
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplatesimplify_prompt = PromptTemplate(input_variables=["query"],template="""请从以下问题中提取核心问题(保留实体和动作):原始问题:{query}精简后问题:"""
)simplify_chain = LLMChain(llm=llm, prompt=simplify_prompt)
optimized_query = simplify_chain.run("我前几天在网上看到一款特别酷炫的笔记本电脑,它有着超级好看的外观,还有特别厉害的性能,我现在特别想知道它到底怎么样?")# 输出:"这款笔记本电脑的性能怎么样"
我们直接使用提示词的方式,对问题进行精简,以保留核心语义。也可以使用LangChain 的RePhraseQueryRetriever 方法,重写用户查询以优化检索效果。
'''
You are an assistant tasked with taking a natural language \
query from a user and converting it into a query for a vectorstore. \
In this process, you strip out information that is not relevant for \
the retrieval task. Here is the user query: {question}你是一名负责从用户那里获取自然语言查询并将其转换为向量库查询的助手。在此过程中,你将删除与检索任务无关的信息。
以下是用户查询:{question}
'''
# retriever = RePhraseQueryRetriever.from_llm(retriever, llm)
在systemPrompt 补充背景信息
为了让大模型更准确地理解用户意图,给出符合需求的回答,需要在 systemPrompt 中补充必要的背景信息。例如,用户提问 “这个方案可行吗”,由于缺乏具体的方案内容和应用场景,大模型难以给出准确回答。此时,我们可以在 systemPrompt 中补充背景信息,将问题转述为 “在当前预算有限且时间紧迫的情况下,针对某电商平台用户增长的营销方案可行吗”。
补充背景信息时,要围绕问题核心,根据领域特征自动补充查询条件。并结合用户可能的使用场景和需求,提供足够的上下文,帮助大模型明确回答问题的方向。
以下是LangChain 框架的代码示例:
context_enrich_prompt = PromptTemplate(input_variables=["query"],template="""作为医疗领域专家,请为以下问题补充必要限定条件:1. 时间范围(近3年)2. 研究类型(临床验证)3. 数据来源(权威期刊)原始问题:{query}优化后问题:"""
)enrich_chain = LLMChain(llm=llm, prompt=context_enrich_prompt)
enriched_query = enrich_chain.run("CT图像识别技术现状")# 输出:"2020-2023年基于深度学习的CT图像识别技术在临床验证中的最新进展(来源:Nature、Science子刊)"
通过用户问题生成多个转述问题
生成多个相关的转述问题,可以从不同角度覆盖用户需求,提高检索到相关内容的概率。在生成转述问题时,需要保持与原始问题的语义一致性,同时通过调整表述方式、变换提问角度等方法,生成多样化的问题表述。
我们依旧选用LangChain 框架的RePhraseQueryRetriever方法,它可以很方便的创建多个转述问题,以下是具体的LangChain 框架代码示例:
from langchain.retrievers import RePhraseQueryRetrieverrephrase_prompt = """请生成3个不同视角的问题表述:
要求:
1. 保持核心实体不变
2. 使用不同句式结构
3. 包含抽象化和具体化两种形式输入:{query}
输出:"""base_retriever = vectorstore.as_retriever()
enhanced_retriever = RePhraseQueryRetriever.from_llm(retriever=base_retriever,llm=llm,prompt_template=rephrase_prompt,num_phrases=3
)
多轮会话交互
多轮会话交互基于自然语言处理和对话管理技术,系统在接收到用户的初始问题后,会分析问题中的关键信息和缺失部分,主动向用户提问,引导用户补充信息。每一轮对话中,系统会根据用户的回答更新对问题的理解,并决定下一轮提问的方向,直到获取足够的信息来完善问题。
多轮会话交互的实现流程
-
问题分析与意图识别:系统接收到用户问题后,利用自然语言处理技术,如分词、词性标注、命名实体识别、语义分析等,提取问题中的关键信息,并尝试识别用户意图。
-
确定缺失信息与生成提问:根据问题分析结果,确定需要补充的关键信息,结合业务场景和常见问题模式,生成针对性的提问。
-
对话管理与交互推进:管理多轮对话的流程和状态,记录用户的每一轮回答,并根据回答内容调整后续提问策略。
-
问题完善与结束判断:当系统认为获取到的信息足以清晰界定问题,或达到预设的对话轮数上限时,结束对话,并将用户的原始问题与补充信息整合,生成完善后的问题。
基于LangChain 框架的代码示例
from typing import Dict, List, Any
from dotenv import load_dotenv
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory# 假设已实现的LLM配置和历史管理模块
from llm import llmConfig # 需要实际实现
from llm.llmHistory import get_session_history # 需要实际实现# 加载环境变量(需包含LLM连接配置)
load_dotenv()class IntentRecognizer:def __init__(self):# 初始化LLMself.llm = llmConfig.getCommonLLM()# 配置JSON解析器self.parser = JsonOutputParser()# 构建对话链self.prompt = ChatPromptTemplate.from_messages([("system", "你是一个信息补充助手,任务是分析用户问题是否完整,并根据模板提取关键信息。"),MessagesPlaceholder(variable_name="chat_history"),("human", "{input}")])self.chain = self.prompt | self.llm# 配置带历史记录的链self.chain_with_history = RunnableWithMessageHistory(self.chain,get_session_history=get_session_history,input_messages_key="input",history_messages_key="chat_history")def recognize_intent(self,user_input: str,selected_template: List[str],session_id: str = "default") -> Dict[str, Any]:"""完整可调用的意图识别方法参数示例:>>> recognizer = IntentRecognizer()>>> result = recognizer.recognize_intent("我想了解治疗方案",["疾病名称", "患者年龄", "症状描述"])"""try:# 构建信息补充提示info_prompt = f"""请根据用户原始问题和模板,判断原始问题是否完善。如果问题缺乏需要的信息,请生成一个友好的请求,明确指出需要补充的信息。若问题完善后,返回包含所有信息的完整问题。### 原始问题 {user_input}### 模板字段{",".join(selected_template)} ### 输出格式{{"isComplete": true,"content": "完整问题内容","extracted_info": {{"字段1": "对应值","字段2": "对应值"}}}}或{{"isComplete": false,"content": "友好的引导需要补充的信息","missing_fields": ["缺失字段"]}} """# 第一轮调用response = self.chain_with_history.invoke(input={"input": info_prompt},config={"configurable": {"session_id": session_id}}).content# 解析响应try:json_data = self.parser.parse(response)except Exception as e:return self._handle_parse_error(e)# 处理完整问题的情况if json_data.get("isComplete"):return self._handle_complete_case(json_data, selected_template, session_id)# 处理不完整问题的情况return self._validate_incomplete_response(json_data, selected_template)except Exception as e:return self._handle_general_error(e)def _handle_complete_case(self, data: Dict, template: List[str], session_id: str) -> Dict:"""处理完整问题的结构化提取"""extraction_prompt = f"""请从以下完整问题中提取关键信息:### 完整问题{data['content']}### 模板字段{",".join(template)}### 输出格式{{"extracted_info": {{"{template[0]}": "值","{template[1]}": "值"}}}}"""try:extraction_response = self.chain_with_history.invoke(input={"input": extraction_prompt},config={"configurable": {"session_id": session_id}}).contentextraction_data = self.parser.parse(extraction_response)if "extracted_info" in extraction_data:data["extracted_info"] = extraction_data["extracted_info"]return datareturn {"isComplete": False,"content": "信息提取失败,请重新描述问题","error": "extraction_failed"}except Exception as e:return self._handle_parse_error(e)def _validate_incomplete_response(self, data: Dict, template: List[str]) -> Dict:"""验证不完整响应格式"""required_keys = ["isComplete", "content", "missing_fields"]if not all(k in data for k in required_keys):return {"isComplete": False,"content": "响应格式异常,请重新尝试","error": "invalid_format"}# 验证缺失字段是否在模板范围内invalid_fields = [f for f in data["missing_fields"] if f not in template]if invalid_fields:return {"isComplete": False,"content": "检测到无效字段请求","error": f"invalid_fields: {invalid_fields}"}return datadef _handle_parse_error(self, error: Exception) -> Dict:"""处理解析错误"""print(f"JSON解析错误: {str(error)}")return {"isComplete": False,"content": "解析响应时出错,请尝试重新提问","error": f"parse_error: {str(error)}"}def _handle_general_error(self, error: Exception) -> Dict:"""处理通用错误"""print(f"系统错误: {str(error)}")return {"isComplete": False,"content": "处理请求时发生系统错误","error": f"system_error: {str(error)}"}# 使用示例
if __name__ == "__main__":recognizer = IntentRecognizer()# 测试用例1:完整问题case1 = recognizer.recognize_intent("我想了解糖尿病患者的胰岛素治疗方案(患者年龄65岁,病程10年)",["疾病名称", "患者年龄", "症状描述"])print("测试用例1结果:", case1)# 测试用例2:不完整问题case2 = recognizer.recognize_intent("关于心脏病的治疗",["疾病类型", "患者年龄", "症状表现"])print("测试用例2结果:", case2)# 测试用例3:错误格式输入case3 = recognizer.recognize_intent("我想预约挂号",["科室名称", "预约时间"])print("测试用例3结果:", case3)
实现多轮会话包含一些必要组件,首先是RunnableWithMessageHistory,作为对话历史管理的核心载体,通过记录每一轮用户输入与模型回复,为 LLM 构建起完整的上下文语境。这样LLM才能基于上下文,识别用户是否补充了完整信息。第二个必要组件就是一个引导LLM 进行多轮会话的提示词模板,精心设计的提示词模板是规范 LLM 输出的 “导航仪”。它通过明确的指令框架,约束模型的回复方向,确保对话沿着既定目标推进,以保证整体输出内容的正确性。
元数据模板
元数据模板是一种预先定义好的结构化框架,它包含了与问题相关的各类属性和字段。在用户提出问题后,系统依据元数据模板,引导用户补充或自动提取问题相关的关键信息,如问题的主题、涉及对象、应用场景、时间范围、约束条件等。这些结构化的元数据能够帮助系统更精准地理解问题背景和用户意图,避免因信息缺失或模糊导致的检索偏差。
以下是一段采用引导用户补充元数据的方式,以获取标准元数据模板的代码示例:
import json
# 定义元数据模板
metadata_template = {"question_topic": "","product_name": "","problem_phenomenon": "","operation_environment": "","impact_scope": "","urgency": ""
}
# 模拟用户输入问题
original_question = "电脑无法开机"
# 引导用户补充元数据信息
print("请根据以下模板补充问题相关信息:")
for key in metadata_template.keys():metadata_template[key] = input(f"{key}: ")
# 整合原始问题和元数据信息
completed_question = f"{original_question}。问题主题:{metadata_template['question_topic']},产品名称:{metadata_template['product_name']},问题现象:{metadata_template['problem_phenomenon']},操作环境:{metadata_template['operation_environment']},影响范围:{metadata_template['impact_scope']},紧急程度:{metadata_template['urgency']}"
print("完善后的问题:", completed_question)
意图分析
意图分析是指通过对用户输入的文本信息进行理解和处理,识别用户话语背后真正的目的和需求。在 RAG 系统中,用户的初始提问往往模糊、隐晦,如 “帮我看看”,若不进行意图分析,系统难以理解用户具体想解决什么问题。准确的意图分析能让系统明确用户是想查询信息、寻求解决方案,还是进行其他操作,进而确定后续对话策略,引导用户完善问题,避免无效沟通,提高交互效率。
意图分析的实现流程
-
数据预处理:对用户输入的文本进行清洗,去除噪声,如特殊字符、停用词;进行分词处理,将文本拆分成词语;有时还需要进行词性标注、词形还原等操作,以便后续的特征提取和分析。
-
特征提取:根据所选的分析方法,提取文本的特征。基于规则时,提取关键词等特征;基于机器学习时,使用词向量(如 Word2Vec、GloVe)、TF-IDF 值等作为特征;基于深度学习时,模型自动学习文本的分布式表示作为特征 。
-
意图识别与分类:将提取的特征输入到训练好的模型(规则引擎或机器学习 / 深度学习模型)中,判断用户意图所属的类别。
-
意图修正与细化:在多轮对话过程中,根据用户后续的回答和上下文信息,对初始识别的意图进行修正和细化。
基于语料库对问题进行意图分析
我们可以采用自然语言处理库,如 NLTK、spaCy 或基于深度学习框架(如 TensorFlow、PyTorch)搭建的自定义模型,对用户输入文本进行深度处理。以使用 spaCy 库为例,可通过以下代码实现基础的意图分析:
import spacynlp = spacy.load("en_core_web_sm")def analyze_intent(text):doc = nlp(text)# 定义关键词匹配规则和语义分析逻辑for token in doc:if token.text in ["relax", "rest"]:return "休闲度假"return "未明确"
在实际的意图分析过程中,为提高准确性,还可结合预训练的语言模型,如 BERT、GPT 系列等,通过微调模型适应特定领域的意图识别任务。将用户输入的文本转化为向量表示,输入到微调后的模型中,模型输出对用户意图的预测结果,从而更精准地把握用户真实需求。
使用朴素贝叶斯构建意图分类模型
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline# 示例训练数据,包含问题文本和对应的意图标签
train_data = [("如何安装软件", "软件安装"),("软件打开后闪退", "软件故障"),("推荐一款手机", "产品推荐"),("手机电池不耐用", "手机故障")
]
texts, intents = zip(*train_data)# 创建文本分类管道,包含TF-IDF特征提取和朴素贝叶斯分类器
pipeline = Pipeline([('vectorizer', TfidfVectorizer()),('classifier', MultinomialNB())
])# 训练模型
pipeline.fit(texts, intents)# 示例用户输入
user_input = "软件运行时很卡顿"
# 预测意图
predicted_intent = pipeline.predict([user_input])[0]
print("预测的用户意图:", predicted_intent)
上述代码使用朴素贝叶斯算法构建了一个简单的意图分类模型。先准备训练数据,然后通过Pipeline将 TF-IDF 特征提取和朴素贝叶斯分类器组合起来进行训练,最后对用户输入进行意图预测。在实际应用中,可使用更多的训练数据和更复杂的模型,以提高意图分析的准确性。
相关文章:
RAG工程-基于LangChain 实现 Advanced RAG(预检索-查询优化)(上)
Enrich 完善问题 完善问题流程概述 问题转述 在典型RAG架构中,用户问题的质量直接影响检索系统的表现。研究表明,未经优化的自然语言查询会导致: 关键实体识别缺失 语义漂移导致召回偏离 长尾问题检索失败率升高 大多数用户并非提示词工程…...
交我算使用保姆教程:在计算中心利用singularity容器训练深度学习模型
文章目录 准备工作步骤如何封装和使用容器安装创建 Singularity 容器编写 def 文件构建容器查看构建容器的 python 版本本地测试挂载数据集和代码 如何上传数据windows 系统Linux 系统 如何设置作业任务脚本的结构常用的 Slurm 参数一份完整的 slurm 作业示例 如何在 debug 队列…...
CMake中强制启用option定义变量的方法
在CMake中,若要在另一个CMake文件中强制启用由option()定义的变量,可使用set(... FORCE)覆盖缓存变量。具体步骤如下: 使用set命令强制覆盖缓存: 在需要强制启用选项的CMake文件中,使用set命令并指定CACHE和FORCE参数。…...
图解 Git 工作流:理解 Rebase、Merge 与 Pull Request 的区别
图解 Git 工作流:理解 Rebase、Merge 与 Pull Request 的区别 在多人协作开发中,选择合适的 Git 分支管理策略至关重要。Merge、Rebase 和 Pull Request 是最常见的三种方式,它们本质不同,使用场景也不同。 本文将通过流程图&am…...
图与网络模型
目录 图的基本概念 例题:比赛的安排 MATLAB作图 最短路径模型 Dijkstra算法步骤 最短路径的Dijkstra算法示例 Dijkstra算法的Matlab函数 最短路径的Floyd算法模型 最短路径的Floyd算法步骤 Floyd算法的Matlab函数 图的基本概念 图G是一个二重组: …...
连接linux虚拟机并运行C++【从0开始】
连接linux虚拟机并运行C【从0开始】 NetSarang安装后两个,其实更加常用的 安装VMware安装Ubuntu 的 ISO 镜像VMWare--TipsUbuntu快捷键,可以在设置里面修改 连接Linux运行cwhy剪不断,理还乱操作 因为好多判题系统,后台都是Linux环…...
多线程系列二:Thread类
Thread类是jvm用来管理线程的一个类,换句话说,每个线程都有一个唯一的Thread对象与之关联 1.Thread常见构造方法 Thread():创建线程对象Thread(Runnable target):使用Runnable对象创建线程对象Thread(String name):创…...
2025五一杯数学建模C题:社交媒体平台用户分析问题,完整第一问模型与求解+代码
完整代码模型请见文末名片 • 问题1分析: – 来龙去脉和与其他问题的内在联系: • 来龙去脉:社交媒体平台为了评估博主的价值,合理分配资源和优化内容推荐,需要准确预测博主的新增关注数。新增关注数是衡量博主影响…...
开源飞控软件:推动无人机技术进步的引擎
在过去的二十年里,众多开源自动驾驶仪项目极大地推动了无人机技术的发展。像 MatrixPilot、Baseflight、TauLabs、OpenPilot、Cleanflight、MultiWii 和 dRonin 等一些开源自动驾驶仪项目已经停止开发,然而,Ardupilot/APM、Pixhawk/PX4、Papa…...
Pinia: vue3状态管理
一、Pinia 的相关介绍 1. 什么是 Pinia Pinia 是一个专门配合 vue.js 使用的状态管理, 从而实现跨组建通信或实现多个组件共享数据的一种技术 2. 使用 Pinia 的目的 我们的vuejs有俩个特性: 1> 数据驱动视图. 2> 组件化开发 基于这俩个特性, 我们引出pinia的使用目的 …...
初学Vue之记事本案例
初学Vue之记事本案例 案例功能需求相关Vue知识案例实现1.实现方法及代码2.演示 案例收获与总结 案例功能需求 基于Vue实现记事功能(不通过原生JS实现) 1.点击保存按钮将文本框的内容显示在特定位置,且清空文本框内容 2.点击清空按钮&#x…...
中国发布Web3计划:区块链列为核心基础技术,不排除发展加密资产应用!
在全球数字化浪潮汹涌、Web3概念方兴未艾之际,中国政府再次展现了其在区块链技术领域的雄心与布局。近日,北京市多个核心政府部门联合发布了一项名为《北京市区块链创新应用发展行动计划(2025–2027年)》的重要政策文件࿰…...
并发设计模式实战系列(11):两阶段终止(Two-Phase Termination)
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第十一章两阶段终止(Two-Phase Termination),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 两阶段终止流…...
科学养生,解锁健康生活密码
健康是生命的基石,养生并非高深的学问,而是通过科学的生活方式,为身体构筑持久的健康防线。在现代快节奏生活中,掌握正确的养生方法,能有效提升生活质量,预防疾病侵袭。 均衡饮食是养生的核心。日常饮食应遵…...
计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践
概述 设想一下,你在多地拥有多个仓库,要同时监控每个仓库的实时状况,这对于时间和精力而言,都构成了一项艰巨挑战。从成本和可靠性的层面考量,大规模部署计算设备也并非可行之策。一方面,大量计算设备的购…...
初识 Java
文章目录 一、背景知识二、技术体系 一、背景知识 Java 是美国 sun(Stanford University Network)公司(2009 年被 Oracle 公司收购)在 1995 年推出的一门计算机高级编程语言 二、技术体系 Java SE(Java Standard Edition):标准版,Java 技术的核心和基…...
彩带飘落效果
文章目录 彩带效果适应场景HTML版本Vue3版本 彩带效果 彩带特效组件 适应场景 完成小结、版本升级等场景。提供HTM、Vue3版本。 HTML版本 <!doctype html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"…...
统计模式识别理论与方法
我们在前文《模式识别的基本概念与理论体系》中就已经提及“模式分类”。 具体内容看我的CSDN文章:模式识别的基本概念与理论体系-CSDN博客 模式的识别方法主要有统计模式识别方法和结构模式识别方法两大类。统计模式识别方法提出得较早,理论也较成熟…...
Ubuntu 安装 Cursor
Cursor 目前只有 Windows 和 Mac 版本,那么如何在 Ubuntu 上运行呢? 本质上是一个如何在 Ubuntu 运行 .appimage 的问题。 1. 下载 Cursor Linux 首先找到 Cursor 官网,下载 x64 安装包,如果你是 arm 架构,就下载 ar…...
前端八股 7
垃圾回收机制 系统周期性地找出暂时不再使用的变量的机制,释放其内存的机制 方法:古老引用计数法 创建一张引用表记录各种资源被引用的次数,当引用次数为0就回收 问题:当有两个对象互相引用时会造成内存泄漏 比如:…...
二、HTML
2.1 介绍 HTML(HyperText Markup Language,超文本标记语言) HTML是网页的骨架,用于定义网页的结构和内容。通过各种标签(如<div>、<p>、<a>、<img>等)来组织文本、图片、表格、表…...
EBO的使用
EBO 其实就是个索引,绑定在相应的VAO中,用来描述绘制顺序。比如在OpenGL绘制三角形的时候,假设有四个顶点,我称他们分别为1,2,3,4号顶点,常规绘制三角形函数是按三个点为一组&#x…...
AI大模型基础设施:NVIDIA的用于AI大语言模型训练和推理的几款主流显卡
英伟达(NVIDIA)在AI大语言模型(LLM)的训练和推理领域占据主导地位,其GPU因强大的并行计算能力和专为深度学习优化的架构而广受青睐。以下介绍几款主流的NVIDIA GPU,适用于AI大语言模型的训练和推理…...
面试手撕——迭代法中序遍历二叉树
思路 访问顺序和处理顺序不一致导致迭代法难写,体现在总要先遍历根节点,才能访问左右孩子,用null标记,null标记的节点表示已经访问过了,下一次可以处理,所以在当前栈顶节点不是null的时候,都要…...
SQL注入与简单实战
Example1 谁从小还没有一个当黑帽子的梦想呢,所以就来讲讲SQL💉🩸吧… 环境要求 sqlmap命令行工具使用Go语言安装包:waybackruls (需要在自己的电脑上部署) 寻找目标 url 对目标网站使用: echo https://xxx | wayb…...
ffmpeg 元数据
ffmpeg 元数据 1. 解释什么是ffmpeg元数据 ffmpeg元数据是指与音视频文件相关的附加信息,这些信息不直接影响音视频内容的播放,但提供了关于文件内容、创作者、版权、播放参数等的有用信息。元数据在音视频文件的处理、管理和共享中起着重要作用。 2.…...
Qwen3 正式发布
2025 年 4 月 29 日,阿里巴巴正式发布新一代通义千问模型 Qwen31。此次发布的 Qwen3 包含多种模型版本,具体如下: MoE 模型:有 Qwen3-235B-A22B(总参数 2350 亿,激活参数 220 亿)和 Qwen3-30B-A…...
[操作系统] 线程互斥
文章目录 背景概念线程互斥的引出互斥量锁的操作初始化 (Initialization)静态初始化动态初始化 加锁 (Locking)阻塞式加锁非阻塞式加锁 (尝试加锁/一般不考虑) 解锁 (Unlocking)销毁 (Destruction)设置属性 (Setting Attributes - 通过 pthread_mutex_init) 锁本身的保护互斥锁…...
KDD 2025 | (8月轮)时间序列(Time Series)论文总结
KDD 2025将在2025年8月3号到7号在加拿大多伦多举行,本文总结了KDD 2025(August Cycle)有关时间序列(Time Series)相关文章,共计11篇,其中1-10为Research Track,11为ADS Track。如有疏漏,欢迎补充…...
Spring MVC @PathVariable 注解怎么用?
我们来详细分析 Spring MVC 中的 PathVariable 注解。 PathVariable 注解的作用 PathVariable 注解用于从 URI 模板(URI Template)中提取值,并将这些值绑定到 Controller 方法的参数上。URI 模板是一种包含占位符的 URL 路径,这…...
PostgreSQL运算符
运算符 算数运算符 运算符描述示例加法SELECT 2 3; 结果为 5-减法SELECT 5 - 2; 结果为 3*乘法SELECT 2 * 3; 结果为 6/除法(对于整数相除,会截断小数部分)SELECT 5 / 2; 结果为 2 ,若要得到精确结果,可使用浮点数 …...
Ocelot与.NETcore7.0部署(基于腾讯云)
资料链接:https://download.csdn.net/download/ly1h1/90731290 1.效果 基于Ocelot,实现对3个微服务的轮询调用,实现不停机更新,无缝更新; 2.环境要求 1.部署环境:腾讯云的轻量化应用服务器 2.系统环境&…...
Umi-OCR项目(1)
最近接触到了一个项目,我在想能不能做出点东西出来。 目标:识别一张带表格的图片,要求非表格内容和表格内容都要识别得很好,并且可视化输出为word文档。 下面是第一步的测试代码,测试是否能够调用ocr能力。 import re…...
前端面试常问问题[From CV]
作为前端面试官,我会针对简历中的技术栈、项目经历和技能细节提出以下20个问题,并附上参考答案: 技术基础类问题 Q:请解释JavaScript事件循环机制,结合宏任务/微任务说明代码执行顺序 A:事件循环分为调用栈…...
C语言学习之动态内存的管理
学完前面的C语言内容后,我们之前给内存开辟空间的方式是这样的。 int val20; char arr[10]{0}; 我们发现这个方式有两个弊端:空间是固定的;同时在声明的时候必须指定数组的长度,一旦确定了大小就不能调整的。 而实际应用的过程中…...
CMake中的“包管理“模块FetchContent
背景介绍 C的包管理工具,好像除了微软家的vcpkg外,并没有一个特别有名的包管理器。 CMake其实也提供了基础的包管理功能。使用 FetchContent 模块系列命令可以下载项目依赖的源代码或者其他文件。 基本用法 FetchContent_Declare命令定义我们下载的内…...
python3基础
Python3 基础教程 1. Python简介 Python是一种高级、解释型、通用的编程语言,由Guido van Rossum于1989年底发明。Python的设计哲学强调代码的可读性和简洁性,其核心理念体现在"Python之禅"中: 优美胜于丑陋(Beautiful is better than ugly) 显式胜于隐式(E…...
课题推荐——通信信号处理中的非线性系统状态估计(如信号跟踪、相位恢复等场景),使用无迹卡尔曼滤波(UKF)的非线性滤波算法,MATLAB实现
给出一个基于无迹卡尔曼滤波(UKF)的非线性滤波算法及其MATLAB实现,适用于通信信号处理中的非线性系统状态估计(如信号跟踪、相位恢复等场景)。该算法结合了非线性动态模型和观测模型,并通过UT变换避免雅可比…...
Postgresql源码(145)优化器nestloop参数化路径评估不准问题分析
相关 《Postgresql源码(133)优化器动态规划生成连接路径的实例分析》 1 问题 最近遇到一个问题,评估行数和真实行数存在较大差距,导致计划不准的问题。 nestloop内表评估是根据外表的参数来的。因为外表驱动表每取一条ÿ…...
【深度学习新浪潮】小米MiMo-7B报告内容浅析
一段话总结 该报告介绍了专为推理任务设计的大语言模型MiMo-7B,其在预训练阶段通过优化数据预处理、采用三阶段数据混合策略(处理约25万亿token)和引入MultiToken Prediction(MTP)目标提升推理潜力;后训练阶段构建13万可验证数学和编程问题数据集,结合测试难度驱动奖励…...
使用Python和Pandas实现的Snowflake权限检查与SQL生成用于IT审计
import snowflake.connector import pandas as pddef get_snowflake_permissions():# 连接Snowflake(需要替换实际凭证)conn snowflake.connector.connect(user<USER>,password<PASSWORD>,account<ACCOUNT>,warehouse<WAREHOUSE&g…...
spring 从application.properties中获取参数的四种方式
在Spring Boot中,自定义一个Starter时,从application.properties中获取参数主要有以下几种方法: 使用Value注解 这是最常用的方法之一,通过Value注解可以直接将application.properties中的属性值注入到Spring管理的Bean中。 imp…...
react学习笔记2——基于React脚手架与ajax
使用create-react-app创建react应用 react脚手架 xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置(语法检查、jsx编译、devServer…)下载好了所有相关的依赖可以直接运行一个简单效果 react提供了一个用于创建react项…...
nim模块教程
导入一个模块 如果我们想要导入一个模块,并且和它的所有函数,我们要做的是写import <moduleName>在我们的文件里,这通常是在文件顶部进行的,这样我们就可以很容易地看到我们的代码使用了什么。 创建一个模块 first.nim …...
雅马哈SMT贴片机高效精密制造解析
内容概要 作为电子制造领域的核心装备,雅马哈SMT贴片机通过集成高速运动控制、智能视觉识别与模块化供料三大技术体系,构建了精密电子元件贴装的工业化解决方案。其YSM系列设备在5G通讯模组、汽车电子控制器及智能穿戴设备等场景中,实现了每…...
审计专员简历模板
模板信息 简历范文名称:审计专员简历模板,所属行业:其他 | 职位,模板编号:KSJYVR 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工作。希…...
npm宿主依赖、宿主环境依赖(peerDependencies)(指由宿主环境提供的依赖)
文章目录 宿主环境依赖详解基本概念工作原理应用场景插件开发UI组件库 与其他依赖类型对比npm不同版本处理差异npm v3-v6npm v7 实际应用示例React插件开发 解决宿主依赖问题 宿主环境依赖详解 基本概念 宿主环境依赖(peerDependencies)是指包声明自身…...
Android Kotlin 项目集成 Firebase Cloud Messaging (FCM) 全攻略
Firebase Cloud Messaging (FCM) 是 Google 提供的跨平台消息推送解决方案。以下是在 Android Kotlin 项目中集成 FCM 的详细步骤。 一、前期准备 1. 创建 Firebase 项目 访问 Firebase 控制台点击"添加项目",按照向导创建新项目项目创建完成后&#x…...
游戏引擎学习第252天:允许编辑调试值
回顾并为今天的工作设定目标 我们处理了调试值(debug value)的编辑功能。我们希望实现可以在调试界面中编辑某些值,为此还需要做一些额外的工作。 我们的问题在于:当某个调试值被编辑时,我们需要把这个“编辑”的操作…...
支持selenium的chrome driver更新到136.0.7103.49
最近chrome释放新版本:136.0.7103.49 如果运行selenium自动化测试出现以下问题,是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only su…...