基于LLM智能问答系统【阿里云:天池比赛】
流程:
1、分别识别问题及提供的资料文件中的公司名实体,有公司名的走语义检索,无公司名的走结构化召回
2、结构化召回:Qwen根据问题生成sql,执行sql获取结果数值,把结果数值与问题给到Qwen生成最终结果
3、语义检索:根据1中识别的公司名+比赛提供的数据文件集合找到对应的招股说明书文件、把该文件切分成段N个文本段、使用Qwen为每个文本段生成向量集合A、把问题生成向量B、使用余弦相似度比较2类向量并排序得到top5,把top5合并成一个文本T,把问题与文本T生成提示词给到送给Qwen生成结果
后续优化方向包括不限于:
提升召回率:包括结构化召回与语义召回
提升准确率:主要是语义召回:可以优化提示词+对问题及检索的文本进行归一化
模型微调:sql生成及向量生成这块可以使用微调以后的模型
模型切换:现在使用的是Qwen2.5 7B,可以尝试使用参数更大模型或金融相关的专业模型
得分:综合:78.49
结构化召回:89.05
语义:62.65
排名:31/3502
说明:
本文源码下载:https://download.csdn.net/download/love254443233/90106437
参考的baseline代码=大模型说的队(源码FinQwen)Tongyi-EconML/FinQwen: FinQwen: 致力于构建一个开放、稳定、高质量的金融大模型项目,基于大模型搭建金融场景智能问答系统,利用开源开放来促进「AI+金融」。https://github.com/Tongyi-EconML/FinQwen
关键源码:
提取实体:
import csv
import pandas as pd
import numpy as np
import re
import copy
from modelscope import AutoModelForCausalLM, AutoTokenizer, snapshot_download
from modelscope import GenerationConfigmodel_dir = '/data/nfs/baozhi/models/Qwen-7B-Chat'# Note: The default behavior now has injection attack prevention off.
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)new_question_file_dir = 'intermediate/A01_question_classify.csv'
new_question_file = pd.read_csv(new_question_file_dir,delimiter = ",",header = 0)
company_file_dir = 'files/AF0_pdf_to_company.csv'
company_file = pd.read_csv(company_file_dir,delimiter = ",",header = 0)
company_data_csv_list = list()
company_index_list = list()
company_name_list = list()
for cyc in range(len(company_file)):company_name_list.append(company_file[cyc:cyc+1]['公司名称'][cyc])company_data_csv_list.append(company_file[cyc:cyc+1]['csv文件名'][cyc])temp_index_cp = tokenizer(company_file[cyc:cyc+1]['公司名称'][cyc])temp_index_cp = temp_index_cp['input_ids']company_index_list.append(temp_index_cp)g = open('intermediate/A02_question_classify_entity.csv', 'w', newline='', encoding = 'utf-8-sig')
csvwriter = csv.writer(g)
csvwriter.writerow(['问题id','问题','分类','对应实体','csv文件名'])for cyc in range(len(new_question_file)):tempw_id = new_question_file[cyc:cyc+1]['问题id'][cyc]tempw_q = new_question_file[cyc:cyc+1]['问题'][cyc]tempw_q_class = new_question_file[cyc:cyc+1]['分类'][cyc]tempw_entity = 'N_A'tempw_csv_name = 'N_A'if new_question_file[cyc:cyc+1]['分类'][cyc] == 'Text':temp_index_q = tokenizer(new_question_file[cyc:cyc+1]['问题'][cyc])temp_index_q = temp_index_q['input_ids']q_cp_similarity_list = list()for cyc2 in range(len(company_file)):temp_index_cp = company_index_list[cyc2]temp_simi = len(set(temp_index_cp) &set(temp_index_q))/ (len(set(temp_index_cp))+len(set(temp_index_q)))q_cp_similarity_list.append(temp_simi)t = copy.deepcopy(q_cp_similarity_list) max_number = []max_index = []for _ in range(1):number = max(t)index = t.index(number)t[index] = 0max_number.append(number)max_index.append(index)t = []tempw_entity = company_name_list[max_index[0]]tempw_csv_name = company_data_csv_list[max_index[0]]csvwriter.writerow([str(tempw_id),str(tempw_q),tempw_q_class,tempw_entity,tempw_csv_name])elif new_question_file[cyc:cyc+1]['分类'][cyc] == 'SQL':csvwriter.writerow([str(tempw_id),str(tempw_q),tempw_q_class,tempw_entity,tempw_csv_name])else:find_its_name_flag = 0for cyc_name in range(len(company_name_list)):if company_name_list[cyc_name] in tempw_q:tempw_entity = company_name_list[cyc_name]tempw_csv_name = company_data_csv_list[cyc_name]csvwriter.writerow([str(tempw_id),str(tempw_q),tempw_q_class,tempw_entity,tempw_csv_name])find_its_name_flag = 1breakif find_its_name_flag == 0:csvwriter.writerow([str(tempw_id),str(tempw_q),tempw_q_class,tempw_entity,tempw_csv_name])g.close()
print('A02_finished')
exit()
生成sql:
import csv
import pandas as pd
import numpy as np
import sqlite3
import re
import copy
from langchain_community.utilities import SQLDatabase
from modelscope import AutoModelForCausalLM, AutoTokenizer, snapshot_download
from modelscope import GenerationConfigtable_name_list = ['基金基本信息','基金股票持仓明细','基金债券持仓明细','基金可转债持仓明细','基金日行情表','A股票日行情表','港股票日行情表','A股公司行业划分表','基金规模变动表','基金份额持有人结构']
table_info_dict = {}
n = 5
deny_list = ['0','1','2','3','4','5','6','7','8','9',',','?','。','一','二','三','四','五','六','七','八','九','零','十','的','小','请','.','?','有多少','帮我','我想','知道','是多少','保留','是什么','-','(',')','(',')',':','哪个','统计','且','和','来','请问','记得','有','它们']# url='sqlite:model_train/other/FinQwen-main/solutions/4_大模型说的队/app/tcdata/bobi.db'
# url="sqlite:data/nfs/baozhi/my_model_train/other/FinQwen-main/bs_challenge_financial_14b_dataset/dataset/bobi.db"
# db0 = SQLDatabase.from_uri(url, sample_rows_in_table_info=0)
# dbd0 = db0.table_info
#
# db2 = SQLDatabase.from_uri(url, sample_rows_in_table_info=2)
# dbd2 = db2.table_info
# list1 = dbd2.split('CREATE TABLE')
# for cyc_piece in range(len(list1)):
# list1[cyc_piece] = 'CREATE TABLE' + list1[cyc_piece]
# for piece in list1:
# for word in table_name_list:
# if word in piece:
# table_info_dict[word] = piece
question_csv_file_dir = "intermediate/A01_question_classify.csv"
question_csv_file = pd.read_csv(question_csv_file_dir,delimiter = ",",header = 0)
model_dir = '/data/nfs/baozhi/models/Qwen-7B-Chat'
# Note: The default behavior now has injection attack prevention off.
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="cuda:0", trust_remote_code=True, bf16=True).eval()
model.generation_config = GenerationConfig.from_pretrained(model_dir,trust_remote_code=True,temperature = 0.0001,top_p = 1,do_sample = False,seed = 1234)print('B01_model_loaded')deny_token_list = list()
for word in deny_list:temp_tokens = tokenizer(word)temp_tokens = temp_tokens['input_ids']deny_token_list = deny_token_list + temp_tokensdef get_prompt_v33(question,index_list):Examples = '以下是一些例子:'for index in index_list:Examples = Examples + "问题:" + example_question_list[index] + '\n'Examples = Examples + "SQL:" + example_sql_list[index] + '\n'impt2 = """你是一个精通SQL语句的程序员。我会给你一个问题,请按照问题描述,仿照以下例子写出正确的SQL代码。"""impt2 = impt2 + Examplesimpt2 = impt2 + "问题:" + question + '\n'impt2 = impt2 + "SQL:" return impt2SQL_examples_file_dir = "files/ICL_EXP.csv"
SQL_examples_file = pd.read_csv(SQL_examples_file_dir,delimiter = ",",header = 0)example_employ_list = list()
for cyc in range(len(SQL_examples_file)):example_employ_list.append(0)example_question_list = list()
example_table_list = list()
example_sql_list = list()
example_token_list = list()for cyc in range(len(SQL_examples_file)):example_question_list.append(SQL_examples_file[cyc:cyc+1]['问题'][cyc])example_sql_list.append(SQL_examples_file[cyc:cyc+1]['SQL'][cyc])temp_tokens = tokenizer(SQL_examples_file[cyc:cyc+1]['问题'][cyc])temp_tokens = temp_tokens['input_ids']temp_tokens2 = [x for x in temp_tokens if x not in deny_token_list]example_token_list.append(temp_tokens2)g = open('intermediate/question_SQL_V6.csv', 'w', newline='', encoding = 'utf-8-sig')
csvwriter = csv.writer(g)
csvwriter.writerow(['问题id','问题','SQL语句','prompt'])pattern1 = r'\d{8}'for cyc in range(len(question_csv_file)):if cyc % 50 == 0:print(cyc)response2 = 'N_A'prompt2 = 'N_A'if question_csv_file['分类'][cyc] == 'SQL' and cyc not in [174]:temp_question = question_csv_file[cyc:cyc+1]['问题'][cyc]date_list = re.findall(pattern1,temp_question)temp_question2_for_search = temp_questionfor t_date in date_list:temp_question2_for_search.replace(t_date,' ')temp_tokens = tokenizer(temp_question2_for_search)temp_tokens = temp_tokens['input_ids']temp_tokens2 = [x for x in temp_tokens if x not in deny_token_list]temp_tokens = temp_tokens2#计算与已有问题的相似度similarity_list = list()for cyc2 in range(len(SQL_examples_file)):similarity_list.append(len(set(temp_tokens) &set(example_token_list[cyc2]))/ (len(set(temp_tokens))+len(set(example_token_list[cyc2])) ))#求与第X个问题相似的问题t = copy.deepcopy(similarity_list)# 求m个最大的数值及其索引max_number = []max_index = []for _ in range(n):number = max(t)index = t.index(number)t[index] = 0max_number.append(number)max_index.append(index)t = []temp_length_test = ""short_index_list = list()for index in max_index:temp_length_test_1 = temp_length_testtemp_length_test = temp_length_test + example_question_list[index]temp_length_test = temp_length_test + example_sql_list[index]if len(temp_length_test) > 2300:breakshort_index_list.append(index)prompt2 = get_prompt_v33(question_csv_file['问题'][cyc],short_index_list)print(f"{str(cyc)} prompt2:{prompt2}")response2, history = model.chat(tokenizer, prompt2, history=None)print(f"response2 = {response2}, \n history = {history}")print("---------------------------------------------------------------------------------")else:passcsvwriter.writerow([str(question_csv_file[cyc:(cyc+1)]['问题id'][cyc]),str(question_csv_file[cyc:(cyc+1)]['问题'][cyc]),response2,prompt2])
语义检索:
import json
import csv
import pandas as pdimport re
from collections import Counter
import math
from modelscope import AutoTokenizerfrom ai_loader import tongyidef counter_cosine_similarity(c1, c2): # 使用截断的ccsterms = set(c1).union(c2)dotprod = sum(c1.get(k, 0) * c2.get(k, 0) for k in terms)magA = math.sqrt(sum(c1.get(k, 0) ** 2 for k in terms))magB = math.sqrt(sum(c2.get(k, 0) ** 2 for k in terms))if magA * magB != 0:return dotprod / (magA * magB)else:return 0pattern1 = r'截至'
pattern2 = r'\d{1,4}年\d{1,2}月\d{1,2}日'q_file_dir = 'intermediate/A02_question_classify_entity.csv'
q_file = pd.read_csv(q_file_dir, delimiter=",", header=0)c00_file = 'intermediate/C00_text_understanding.csv'
g = open(c00_file, 'w', newline='', encoding='utf-8-sig')
text_file_dir = 'tcdata/pdf_txt_file'
csvwriter = csv.writer(g)
csvwriter.writerow(['问题id', '问题', '问题[标准化后]', '对应实体', 'csv文件名', 'FA', 'top_text'])stopword_list = ['根据', '招股意见书', '招股意向书', '截至', '千元', '万元', '哪里', '哪个','知道', "什么", '?', '是','的', '想', '元', '。', ',', '怎样', '谁', '以及', '了', '对', '?', ',']
bd_list = ['?', '。', ',', '[', ']']tongyi_model_path = "/data/nfs/baozhi/models/Qwen-7B-Chat"
tokenizer = AutoTokenizer.from_pretrained(tongyi_model_path, trust_remote_code=True)from langchain.prompts import ChatPromptTemplate
from langchain.text_splitter import RecursiveCharacterTextSplitterdef text_split(content):""" 将文本分割为较小的部分 """text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=100,separators=['\n\n', "\n", "。"],keep_separator=False)return text_splitter.split_text(content)def embedding_2_ver(embedding):temp_tokens = list()for word_add in embedding:temp_tokens.append(word_add)return temp_tokensdef counter_cosine_similarity(c1, c2): # 使用截断的ccsterms = set(c1).union(c2)dotprod = sum(c1.get(k, 0) * c2.get(k, 0) for k in terms)magA = math.sqrt(sum(c1.get(k, 0) ** 2 for k in terms))magB = math.sqrt(sum(c2.get(k, 0) ** 2 for k in terms))if magA * magB != 0:return dotprod / (magA * magB)else:return 0n = 30
cap = 4def text_similarity(text, C_temp_q_tokens):""" 计算文本和问题的相似度 """temp_s_tokens = tokenizer(text)temp_s_tokens = temp_s_tokens['input_ids']C_temp_s_tokens = Counter(temp_s_tokens)C_temp_s_tokens['220'] = 0for token in C_temp_s_tokens:if C_temp_s_tokens[token] >= cap:C_temp_s_tokens[token] = capreturn counter_cosine_similarity(C_temp_s_tokens, C_temp_q_tokens)import copy
def process_text_question(question, company, file_path):""" 处理单个问题 """try:temp_q_list = question.split()temp_q_tokens = list()for word in temp_q_list:temp_q_tokens_add = tokenizer(word)temp_q_tokens_add = temp_q_tokens_add['input_ids']for word_add in temp_q_tokens_add:temp_q_tokens.append(word_add)C_temp_q_tokens = Counter(temp_q_tokens)with open(file_path, 'r', encoding='utf-8') as file:content = file.read()content = content.replace(' ', '')text_list = text_split(content)t = copy.deepcopy(text_list)sim_list = list()for text in text_list:text1 = textfor bd in bd_list:text1 = text1.replace(bd,' ')sim = text_similarity(text1, C_temp_q_tokens)sim_list.append(sim)sorted_indices = sorted(enumerate(sim_list), key=lambda x: x[1], reverse=True)top_texts = [t[index] for index, _ in sorted_indices[:5]]# prompt = ChatPromptTemplate.from_template(# "你是一个能精准提取文本信息并回答问题的AI。\n"# "请根据以下资料的所有内容,首先帮我判断能否依据给定材料回答出问题。"# "如果能根据给定材料回答,则提取出最合理的答案来回答问题,并回答出完整内容,不要输出表格:\n\n"# "{text}\n\n"# "请根据以上材料回答:{q}\n\n"# "请按以下格式输出:\n"# "能否根据给定材料回答问题:回答能或否\n"# "答案:").format_messages(q=question, text="\n".join(top_texts))prompt = ChatPromptTemplate.from_template("你是一个能精准提取文本信息并回答问题的AI。\n""下面是一段资料,不要计算,不要计算,直接从资料中寻找问题的答案,使用完整的句子回答问题。\n ""如果资料不包含问题的答案,回答“不知道。”如果从资料无法得出问题的答案,回答“不知道。”如果答案未在资料中说明,回答“不知道。”如果资料与问题无关或者在资料中找不到问题的答案,回答“不知道。”如果资料没有明确说明问题答案,回答“不知道。”资料:\n\n""{text}\n\n""请根据以上材料回答:{q}\n\n""答案:").format_messages(q=question, text="\n".join(top_texts))response = tongyi(prompt[0].content, temperature=0.01, top_p=0.5)return (response, top_texts)except Exception as e:print(f"Error processing question: {e}")return Noneprint('C00_Started')
for cyc in range(1000):temp_q = q_file[cyc:cyc + 1]['问题'][cyc]temp_class = q_file[cyc:cyc + 1]['分类'][cyc]temp_e = q_file[cyc:cyc + 1]['对应实体'][cyc]print(cyc)if temp_e == 'N_A':csvwriter.writerow([q_file[cyc:cyc + 1]['问题id'][cyc],q_file[cyc:cyc + 1]['问题'][cyc],'N_A', 'N_A', 'N_A', 'N_A', 'N_A'])continueelse:if '\n' in temp_e:temp_e = temp_e.replace('\n', '')print(f'问题:{temp_q}')print(f'分类:{temp_class}')print(f'对应实体:{temp_e}')temp_text_name = q_file[cyc:cyc + 1]['csv文件名'][cyc]print(f'csv文件名:{temp_text_name}')temp_text_name = temp_text_name.replace('PDF.csv', '')temp_text_name = temp_text_name + "txt"temp_csv_dir = text_file_dir + '/' + temp_text_nameprint(f'csv文件名[转换后]:{temp_csv_dir}')temp_q = temp_q.replace(' ', '')temp_q = temp_q.replace(temp_e, ' ')#去除截至与日期,使得匹配更有针对性str1_list = re.findall(pattern1, temp_q)str2_list = re.findall(pattern2, temp_q)for word in str1_list:temp_q = temp_q.replace(word,'')for word in str2_list:temp_q = temp_q.replace(word,'')for word in stopword_list:temp_q = temp_q.replace(word, ' ')print(f'问题[标准化后]:{temp_q}')FA, top_text = process_text_question(temp_q, temp_e, temp_csv_dir)print(f'答案如下:')print(FA)print("-----------------------------------------------------------")csvwriter.writerow([q_file[cyc:cyc + 1]['问题id'][cyc],q_file[cyc:cyc + 1]['问题'][cyc],temp_q, temp_e, temp_text_name, FA, json.dumps(top_text, ensure_ascii=False)])
g.close()
相关文章:
基于LLM智能问答系统【阿里云:天池比赛】
流程: 1、分别识别问题及提供的资料文件中的公司名实体,有公司名的走语义检索,无公司名的走结构化召回 2、结构化召回:Qwen根据问题生成sql,执行sql获取结果数值,把结果数值与问题给到Qwen生成最终结果 …...
k8s-Informer概要解析(2)
Client-go 主要用在 k8s 控制器中 什么是 k8s Informer Informer 负责与 kubernetes APIServer 进行 Watch 操作,Watch 的资源,可以是 kubernetes 内置资源对象,也可以 CRD。 Informer 是一个带有本地缓存以及索引机制的核心工具包&#x…...
Leetcode 3376. Minimum Time to Break Locks I
Leetcode 3376. Minimum Time to Break Locks I 1. 解题思路2. 代码实现 题目链接:3376. Minimum Time to Break Locks I 1. 解题思路 这一题我最开始的思路走的是贪婪算法的路子,优先走X的增长,不过很不幸失败了,后面还是暴力…...
介绍8款开源网络安全产品
01 HFish蜜罐 HFish是一款开源的蜜罐系统,用于模拟各种网络服务和应用,以吸引潜在的黑客攻击。它能够记录攻击尝试并收集攻击者的信息,从而帮助网络管理员识别潜在的威胁。HFish支持多种协议和服务,包括HTTP、FTP、SSH等&#…...
vue2面试题|[2024-12-5]
开题答辩终于结束了,又要开始我的前端面试学习啦!!! 1.v-model双向绑定原理 class Vue{constructor(options){this.$options optionsthis.$watchEvent {}if(typeof options.beforeCreate function){options.beforeCreate.bind…...
共筑数字安全防线,2024开源和软件安全沙龙即将启幕
随着数字化转型进程的加快以及开源代码的广泛应用,开源凭借平等、开放、协作、共享的优秀创作模式,逐渐成为推动数字技术创新、加速传统行业转型升级的重要模式。但随着软件供应链日趋复杂多元,使得其安全风险不断加剧,针对软件供…...
目标跟踪领域经典论文解析
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在…...
SQL DQL数据查询语言(后续)
SQL DQL数据查询语言(后续) 1.子查询 在查询语句中的WHERE条件子句中,又嵌套了另外一个查询语句在返回列中嵌套一个查询 where条件中嵌套 要求:查询课程为《高等数学-2》且分数不小于80分的学生的学号和姓名select a.StudentNo,a…...
Gitee配置SSH公钥
采用SSH协议同步Git仓库代码的好处就是高效。在配置好SSH公钥后,不需要每次操作都要输入用户名和密码(主要针对命令行来说)。 以我个人项目为例。 生成 SSH 公钥 1. 通过命令 ssh-keygen 生成 SSH Key: ssh-keygen -t ed25519…...
机器学习——感知机模型
文章目录 前言1.感知机模型介绍1.1基本概念1.2数学表达1.3几何解释1.4优缺点 2.二分类应用2.1应用介绍2.2准备数据集2.2.1环境检查2.2.2数据集介绍2.2.3获取数据2.2.4划分数据集 2.3可视化训练集2.4训练过程2.4.1首轮梯度下降2.4.2多轮梯度下降 2.5可视化分类结果2.6在验证集验…...
如何选择安全、可验证的技术?
澳大利亚信号局的澳大利亚网络安全中心 (ASD 的 ACSC) 发布了一份指导文件,题为《选择安全和可验证的技术》,旨在帮助组织在采购软件(专有或开源)、硬件(例如物联网设备)和云服务(SaaS、MSP 服务…...
STL库中list的使用与迭代器的实现
STL库中list的使用与迭代器的实现 1.使用list中的部分函数assignspliceremoveuniquemeger 2.list的部分功能实现(重点)框架迭代器的实现 1.使用list中的部分函数 assign 功能一:当前链表的节点全部销毁,替换成迭代区间的值 功能二…...
android 常用三方框架
说实话, 我是比较讨厌三方框架的, 比如一个eventbus 底层逻辑就是个观察者模式,当然他的场景涵盖的比较丰富, 单从 单一原则来说, 还是一个简单的观察者模式就能解决问题, 何必要添加那么多文件到我们的项目…...
Browser.js断点续传上传
通过断点续传上传的方式将文件上传到OSS前,您可以指定断点记录点。上传过程中,如果出现网络异常或程序崩溃导致文件上传失败时,将从断点记录处继续上传未上传完成的部分。 attention: 1、 当您使用webpack或browserify等打包工具…...
Java项目实战II基于微信小程序的无中介租房系统(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速,租房市场日益繁荣&a…...
了解Cocoa Touch框架与主要组件
Cocoa Touch框架详解及其主要组件 一、Cocoa Touch框架概述 Cocoa Touch框架是苹果公司为iOS应用程序开发提供的一套完整的框架,它基于Cocoa框架,并专为触控设备如iPhone、iPad等设计。这套框架不仅包含了构建图形用户界面(GUI)…...
ISO45001职业健康安全管理体系涵盖了丰富的内容
范围与术语 适用范围:明确规定了该标准适用于任何有愿望建立、实施和保持职业健康安全管理体系的组织,旨在使组织能够通过管理体系的有效运行,预防和控制职业健康安全风险,持续改进职业健康安全绩效。术语定义:对职业…...
Spring Boot 整合 Druid 并开启监控
文章目录 1. 引言2. 添加依赖3. 配置数据源4. 开启监控功能5. 自定义 Druid 配置(可选)6. 访问监控页面7. 注意事项8. 总结 Druid 是一个由阿里巴巴开源的高性能数据库连接池,它不仅提供了高效的连接管理功能,还自带了强大的监控和…...
【JAVA高级篇教学】第一篇:Springboot对接通义千问大模型
博主今天打算讲解下Java如何对接阿里云的通义千问大模型,可以自己玩玩ai问答之类的! 目录 一、发展历程 二、API-KEY的获取与配置 三、引用SDK 四、文本模型 1.代码 2.返回数据 3.官方代码案例 五、通义千问VL 1.计量计费 六、查看API-KEY调用额…...
【Windows 同时安装 MySQL5 和 MySQL8 - 详细图文教程】
卸载 MySQL 参考文章: 完美解决Mysql彻底删除并重装_怎么找到mysql并卸载-CSDN博客使用命令卸载mysql_卸载mysql服务命令-CSDN博客 先管理员方式打开 cmd ,切换到 MySQL 安装目录的 bin 文件夹下,执行如下命令,删除 MySQL 服务 my…...
Next.js 系统性教学:深入理解缓存与数据优化策略
更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 前言 1. 缓存的基本概念 1.1 缓存的作用 1.2 Next.js 中的缓存策略 2. Next.js 的缓存机制 2.1 请求记忆化(Request Memoization) 2.1.1 什…...
JAVA数据结构
1.数组 (Array): 固定大小的容器,用于存储相同类型的元素,数组在内存中是连续存储的,支持通过索引快 速访问元素。 int[] numbers = new int[10]; numbers[0] = 1;2.Java Collections Framework (JCF) JCF提供了一组接口和类用于管理和操作集合(如列表,集合,…...
力扣第96题 不同的二叉搜索树
力扣第96题 - 不同的二叉搜索树 题目描述 给定一个整数 n,求以 1 到 n 为节点组成的所有 不同的二叉搜索树(BST) 的个数。 题目分析 二叉搜索树的性质 对于一个二叉搜索树,以 i 为根节点: 左子树的节点值来自 [1, i…...
在Ubuntu上使用IntelliJ IDEA:开启你的Java开发之旅!
你好,年轻的学徒!🧑💻 是时候踏上进入Java开发世界的史诗之旅了,我们的得力助手将是强大的IntelliJ IDEA。准备好了吗?出发吧! 在我们开始之前,我们需要下载这个工具。但是&#…...
【C语言】18. 自定义类型:结构体类型
文章目录 前言:一、结构体类型的声明1、结构体回顾1)结构的声明2)结构体变量的创建和初始化 2、结构的特殊声明3、结构的⾃引⽤ 二、结构体变量的创建和初始化1、对⻬规则2、为什么存在内存对⻬?3、修改默认对⻬数 三、结构成员访问操作符1、…...
智能租赁管理系统助力规范化住房租赁市场提升用户体验
内容概要 在当今的住房租赁市场中,智能租赁管理系统应运而生,为房东和租客带来了前所未有的便利。这套系统就像一位全能助手,将租赁信息、监管机制以及在线签约功能集成在一起,让整个过程变得流畅而高效。换句话说,您…...
ERROR: KeeperErrorCode = NoNode for /hbase/master
原因分析 通过上面的情景模拟,我们可以看到报错的原因在于zookeeper中出现问题,可能是zookeeper中的/hbase/master被删除,或者是在hbase集群启动之后重新安装了zookeeper,导致zookeeper中的/hbase/master节点数据异常。 1. 停止…...
springboot第84集:Java进阶之路, Netty
# kafka-map文件夹 cd /usr/local/kafka-map # 根据需求自行修改配置 vi application.yml # 启动 java -jar kafka-map.jar byte minByte -128; byte maxByte 127; 用于表示一个 8 位(1 字节)有符号整数。它的值范围是 -128(-2^7࿰…...
DevOps持续集成
DevOps流程 第一步安装git 关闭防火墙 systemctl stop firewalld cd /usr/loacl vim docker-compose.yml docker search gitlab 拉取gitlab镜像 2.33GB docker pull gitlab/gitlab-ce:latestvim docker-compose.yml修改docker-compose.yml version: 3.1 services:gitlab:i…...
sql server log文件
确定 SQL Server 实例中具有大量 VDF 的数据库 SELECT [name], COUNT(l.database_id) AS vlf_count FROM sys.databases AS s CROSS APPLY sys.dm_db_log_info(s.database_id) AS l GROUP BY [name] HAVING COUNT(l.database_id) > 100; 在收缩日志文件之前确定事务日志中…...
pip install报错 Missing dependencies for SOCKS support的正确解决办法:离线安装pysocks
今天准备开发python项目的时候,发现在pip install 的时候报错了,提示:Missing dependencies for SOCKS support,查遍csdn所有的回答都统一是只需要执行: unset all_proxy unset ALL_PROXY 然后再执行 pip install p…...
嵌入式学习(15)-stm32通用GPIO模拟串口发送数据
一、概述 在项目开发中可能会遇到串口不够用的情况这时候可以用通过GPIO来模拟串口的通信方式。 二、协议格式 按照1位起始位8位数据位1位停止位的方式去编写发送端的程序。起始位拉低一个波特率的时间;发送8位数据;拉高一个波特率的时间。 三、代码 …...
AKE 安全模型:CK, CK+, eCK
参考文献: [BCK98] Mihir Bellare, Ran Canetti, Hugo Krawczyk. A Modular Approach to the Design and Analysis of Authentication and Key Exchange Protocols (Extended Abstract). STOC 1998: 419-428.[CK01] Ran Canetti, Hugo Krawczyk. Analysis of Key-E…...
【Linux】通过crond服务设置定时执行shell脚本,实际执行时间却延迟了8小时
一、问题描述 通过使用crond服务设置定时任务,在每天凌晨的2:00执行脚本,但检查结果时发现,实际执行时间却在上午10点。 检查shell脚本执行结果发现,实际执行脚本时间在上午10:00,延迟了8小时。 检查系统时间…...
什么是云原生数据库 PolarDB?
云原生数据库 PolarDB 是阿里云推出的一款高性能、兼容性强、弹性灵活的关系型数据库产品。它基于云原生架构设计,结合分布式存储和计算分离的技术优势,为用户提供强大的计算能力、卓越的可靠性以及高性价比的数据库解决方案。PolarDB 适合各种业务场景&…...
(6)JS-Clipper2之ClipperOffset
1. 描述 ClipperOffset类封装了对打开路径和关闭路径进行偏移(膨胀/收缩)的过程。 这个类取代了现在已弃用的OffsetPaths函数,该函数不太灵活。可以使用不同的偏移量(增量)多次调用Execute方法,而不必重新分配路径。现在可以在一次操作中对开放和封闭路…...
基于51单片机64位病床呼叫系统设计( proteus仿真+程序+设计报告+原理图+讲解视频)
基于51单片机病床呼叫系统设计( proteus仿真程序设计报告原理图讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0095 1. 主要功能: 基于51单片机的病床呼叫系统proteus仿…...
工业智能网关如何为企业实现智能制造赋能?
在数字化转型的浪潮中,工业智能网关作为连接物理世界与数字世界的桥梁,正逐步成为智能制造领域的核心组件。本文将通过一个实际使用案例,深入剖析工业智能网关如何助力企业实现生产流程的优化、数据的高效采集与分析,以及智能化决…...
【Spring项目】表白墙,留言板项目的实现
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:项目实现准备 1:需求 2:准备工作 (1)…...
Java-WebSocket
文章目录 WebSocket概念SpringBoot实现一个WebSocket示例STOMP消息订阅和发布后端主动发送消息 跨域 WebSocket概念 应用层协议,底层采用TCP,特点:持续连接,有状态,双向通信 当客户端想要与服务器建立WebSocket连接时…...
C#请求https提示未能为 SSL/TLS 安全通道建立信任关系
System.Net.WebException: 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系 ,这个错误通常表明你的应用程序在尝试建立一个安全的 SSL/TLS 连接时遇到了问题。这通常是由于证书验证失败引起的。证书验证失败可能有几个原因: 证书不受信任&#…...
pdf转word/markdown等格式——MinerU的部署:2024最新的智能数据提取工具
一、简介 MinerU是开源、高质量的数据提取工具,支持多源数据、深度挖掘、自定义规则、快速提取等。含数据采集、处理、存储模块及用户界面,适用于学术、商业、金融、法律等多领域,提高数据获取效率。一站式、开源、高质量的数据提取工具&…...
人工智能与机器学习:真实案例分析及其在各行业的应用前景
目录 引言 人工智能与机器学习的基础概念 人工智能的历史与演变 机器学习的算法分类 深度学习与传统机器学习的区别 行业应用案例分析 医疗健康 疾病预测与诊断 影像识别的运用 案例:IBM Watson在肿瘤治疗中的应用 金融服务 风险评估与欺诈检测 投资预测…...
再谈多重签名与 MPC
目录 什么是 MPC 钱包以及它们是如何出现的 多重签名和智能合约钱包已经成熟 超越 MPC 钱包 关于小队 多重签名已经成为加密货币领域的一部分,但近年来,随着 MPC(多方计算)钱包的出现,多重签名似乎被掩盖了。MPC 钱包之…...
(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验二----网络分析(超超超详细!!!)
相信实验一大家已经完成了,对Arcgis已进一步熟悉了,现在开启第二个实验 ArcMap实验--网络分析 目录 ArcMap实验--网络分析 1.1 网络分析介绍 1.2 实验内容及目的 1.2.1 实验内容 1.2.2 实验目的 2.2 实验方案 2.3 实验流程 2.3.1 实验准备 2.3.2 空间校正…...
Python、R循环神经网络RNN、指数平滑ETS、ARIMA模型预测网络流量、ATM机取款、旅游需求时间序列数据...
全文链接:https://tecdat.cn/?p38496 分析师:Pengyuan Wen 在当今经济研究与商业决策领域,精准的时间序列预测具有极为关键的意义。社会消费品零售总额作为反映人民消费水平以及国民经济状况的核心指标,其发展趋势的精准把握对中…...
通过PS和Unity制作2D动画之二:IK的使用
一、IK的概念 IK:Inverse Kinematics,反向动力学。 (1)正向动力学 在骨骼动画中,构建骨骼的方法被称为正向动力学。它的表现形式是:子骨骼(关节)的位置根据父骨骼(关节…...
如何防御ARP欺骗 保护IP安全
在数字化浪潮席卷全球的今天,网络安全威胁如同暗流涌动,时刻考验着我们的防范能力。其中,ARP欺骗攻击作为一种隐蔽性强、成本低廉且危害严重的网络攻击手段,成为众多网络安全事件中的一颗“毒瘤”。那么我们究竟是如何防御ARP欺骗…...
浏览器插件上架流程
上回说到,用 AI 开发上架了个浏览器插件。有朋友想知道上架扩展有需要哪些步骤。这里做个整理,这篇文章结构和步骤都是 AI 整理的。里面的文案细节、推荐的工具是我自己总结,以前发布扩展时直接用的。有需要的话下面的文案可以直接拷贝使用。…...
Android13 USB 串口默认授权
一)场景需求 项目中使用到了can协议控制车机功能,can 直接转串口,用USB转串口工具 cn.wch.uartlib 来实现. can 板子通过usb 插入到机器上面,那就是usb 协议了。 遇到问题: 插入can 板的usb 到机器上后,直…...