南通工程建设信息网站/怎么让网站被百度收录
在构建政策问答智能聊天助手的过程中,我们采用了 RAG(Retrieval-Augmented Generation)技术。RAG 是一种结合了检索和生成的混合型自然语言处理技术,它通过检索相关信息来增强生成模型的上下文理解能力。RAG 的主要优点在于能够有效减少生成式模型的“幻觉”问题,即模型生成与现实不符的内容,从而提高回答的准确性和可靠性。我们将整个搭建过程分为三个关键阶段:数据预处理、推理和评价。
RAG 通用框架
01. 数据预处理
在预处理阶段,我们完成了清洗、分词并提取特征,确保数据质量。首先,我们将 PDF 政策文本转化成 TXT ,这一步基于开源项目 tesseract-ocr 的简体中文版本实现。
def process_pages(pdf_path, start_page, end_page):images = convert_from_path(pdf_path, dpi=300, first_page=start_page, last_page=end_page)text_pages = {}for i, image in enumerate(images, start=start_page):gray_image = ImageOps.grayscale(image)text = pytesseract.image_to_string(gray_image, lang='chi_sim+eng')print(f"\nPage {i} Text:\n{text}") # Print recognized texttext_pages[i] = text + "\n"return text_pages
在实施时,我们选取的政策文档为43页,经过 jieba 分词后,得到13194字,共471句话。
words = jieba.lcut(text)
num_words = len(words)# Matches Chinese period, exclamation, question marks, and newlines
sentence_delimiters = r'[。!?]'
sentences = re.split(sentence_delimiters, text)sentences = [s.strip() for s in sentences if s.strip()]
num_sentences = len(sentences)
接下来是分段即 chunking 环节。我们调研了多种常用的分段方法,并着重实验了其中两种。
方法一:等字符分段法
这也是最常见的分段方法。为适应大模型每次输入 token 的最大数量限制,并且考虑到单句平均28个字符,我们采用 width=300,overlapping=50 的分割法。
while start < total_words:end = start + Wchunk_words = words[start:end]chunk_text = ''.join(chunk_words) # Concatenate words without spaceschunks.append(chunk_text)start = end - overlap # Move the window forward with overlap
方法二:语义双重合并分段
语义双重合并分段(semantic chunking double-pass merging)中有双重过程,其中 First Pass 的目的是准确识别主题的差异,将最明显的句子连接在一起。而 Second Pass 进一步将以上小块组成主题各异的大块。对于主题的变化判定,我们设定了阈值 threshold = 0.7。
这里采用的 sentence tokenizer 是 sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2,为句子生成84维的向量。
chunks = []current_chunk = []i = 0while i < len(sentences):sentence = sentences[i]is_item = bool(item_pattern.match(sentence))if is_item:# Start a new chunk for the itemized listif current_chunk:chunks.append(current_chunk)current_chunk = [sentence]i += 1# Add subsequent itemized entries to the current chunkwhile i < len(sentences) and (bool(item_pattern.match(sentences[i])) or sentences[i].startswith(('(', '('))):current_chunk.append(sentences[i])i += 1# Add the completed itemized list chunkchunks.append(current_chunk)current_chunk = []else:# Regular sentence processing with semantic similarityif not current_chunk:current_chunk = [sentence]else:# Compute similarity with the previous sentenceembedding_prev = get_sentence_embedding(current_chunk[-1])embedding_curr = get_sentence_embedding(sentence)sim = cosine_similarity(embedding_prev.reshape(1, -1),embedding_curr.reshape(1, -1))[0][0]if sim >= 0.7: # Adjust the threshold as neededcurrent_chunk.append(sentence)else:chunks.append(current_chunk)current_chunk = [sentence]i += 1# Add any remaining chunkif current_chunk:chunks.append(current_chunk)
在实践中,我们发现使用同样的大模型,第二种语义分段法的预测效果要优于第一种等字符分段法。这可能是因为在方法二的初始分段过程中,我们注意到了句块过于零散的情况:
条例化的信息在这里被视为分段的标志,而相反他们正应被归为一类。于是我们确保“()”级别的 itemization 都能被正确合并。
item_pattern = re.compile(r'^(\(?[一二三四五六七八九十0-9]+\)?[.。、])')
以上两种分段法得到的结果,我们都以 chunks.pkl 和 chunk_embeddings.pkl 形式存储。
02. 推理环节
在推理环节中,我们利用大模型的深度学习功能,通过微调和优化来提高模型的理解和回答能力。我们需要依据用户提问找到相关联的文本,设计提示词,随后调用大模型作答。
先对 query 进行 tokenization,找到相似度最高的 top K 段落(K=5):
def get_top_k_chunks(query_embedding, chunk_embeddings, K):similarities = []for idx, chunk_embedding in enumerate(chunk_embeddings):sim = cosine_similarity(query_embedding.reshape(1, -1),chunk_embedding.reshape(1, -1))[0][0]similarities.append((idx, sim))similarities.sort(key=lambda x: x[1], reverse=True)top_k = similarities[:K]return top_k
为兼顾模型性能与潜在的参数优化可行性,我们选择 Llama-2-7b-hf 作为大模型。设计一组 prompt 后即可开始问答。
context = ''for idx, sim in top_k_chunks:chunk_text = ''.join(chunks[idx]) if isinstance(chunks[idx], list) else chunks[idx]context += f"【内容{idx+1}】\n{chunk_text}\n\n"prompt = f"""你是一名智能助理,请根据以下提供的政策内容,回答用户的问题。请确保回答准确且基于提供的内容。如果无法找到答案,请告知用户。{context}
用户提问:
{query}
你的回答:
"""
terminal>>
请输入您的问题:杭州市海外高层次人才创新创业有哪些补助?
生成的回答:
参照中国杭州大学生创业大赛在杭落地项目资助条目
可见该回答虽言之成理,仍存在改进空间。问题在于,如何量化评价这一模型的回答准确度?为此,我们引入了多项选择题(MCQ)作为评价集。
03. 评价环节
鉴于大模型生成的自然语言回答存在不确定性,量化其准确性变得颇具挑战。为此,构建一个包含确切答案的评价集显得尤为关键。我们期望该评价集满足以下特点:
首先,每个问题应有一个正确答案,而其他三个错误答案在常识范围内应具有一定的合理性,这样可以确保判断是基于检索到的文档内容,而非模型的先验知识。
其次,正确答案应在选项中随机分布,以避免在训练过程中出现过度拟合。通过人工标注与 AI 技术的辅助,我们成功构建了30组评价问答题,确保了评价集的质量和实用性。
以下是示例问题:
{"query": "哪些企业能获得杭州市的创业补助?","options": {"A": "所有注册在杭的企业均可申请。","B": "符合政府补助要求的创新型企业。","C": "补助只提供给年收入超过一定标准的企业。","D": "只限于科技创新型企业。"},"ground_truth": "B"},
在这组评价集上,我们分别验证了两种分段法。鉴于生成的回答不总是如指令里声明的那样,仅仅给出 ABCD 中的选项,我们提取回答中首个出现的合法大写字母作为 predicted answer。
for char in predicted_answer:if char in ['A', 'B', 'C', 'D']:return charreturn None
经多组实验,等字符分段法取得了13.3%-20%的准确率,而语义分段法取得了26.7%-50%的准确率。总体而言,语义分段法所产生的文本在该评价集上更加可靠,除了上述提及的合并 itemization 的原因,还可能是因为等字符分段法恒定的 top K chunks 输入宽度过大,导致大模型更难准确理解指示。此处展示正确和错误的预测案例各一组以供参考:
至此为止,我们可以对不同大模型与分段法在该评价集上的性能搭配进行总结。
不同大模型与分段方法搭配的准确率
💡注:显示的准确率为多组实验取得的最高值。当调用更小模型时,我们相应更改了分段的策略。例如对于 microsoft/phi-2,我们选取 W=80,overlap=40。对于 Open_llama_7b,我们选取 top K=3。
在学员们利用 RAG 技术搭建政策问答智能聊天助手的流程中,他们经历了详尽的调研和调试,已经从最初的探索者成长为能够独立处理复杂任务的专家。然而,这个项目方案仍有提升空间。
我们注意到,模型的训练和推理过程并未完全分离,导致超参数(hyperparameters)的设定过于依赖初始设计,缺乏迭代优化的过程,这是机器学习早期的常见问题。随着深度学习技术的不断进步,出现了多种调参方法。在这些方法中,LoRA 因其能够在较低成本下实现大模型的局部微调而备受青睐。通过引入 LoRA 技术,我们可以更有效地优化模型,实现更精准的调整,从而提升整体性能。
01. 什么是 LoRA?
LoRA(low-rank adaptation,低秩适应)是一种高效的机器学习模型微调技术,它能够迅速使模型适应新环境。与 RAG 专注于特定数据集不同,LoRA 使模型能够更好地适应特定的任务需求。在面对多样化的细分任务时,全面微调一个大型模型往往成本过高,而 LoRA 提供了一种经济且快速的解决方案。通过在模型的 QKV(Query, Key, Value)部分引入低秩矩阵,即形式为 Bmxr x Arxn 的结构,其中 r 远小于 m 和 n,LoRA 只需训练两个残差(residual)矩阵A和B。这种方法显著减少了训练的参数量,同时对模型的自注意力层和交叉注意力层产生影响,从而实现对模型的快速且有效的微调。
02. 把 LoRA 应用到 RAG Chatbot
我们先将先前的评价集 dataset.json 以 20:5:5 拆成 train:valid:test。设置 lora_config 的参数。
def fine_tune_lora(model_name, train_dataset, valid_dataset):# Load the pre-trained LLaMA modeltokenizer = AutoTokenizer.from_pretrained(model_name)model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")# Apply LoRA to the modellora_config = LoraConfig(r=8, # Low-rank approximation factorlora_alpha=16, # Scaling factor for the LoRA weightstarget_modules=["q_proj", "k_proj", "v_proj"], # Target the attention layerslora_dropout=0.1 # Dropout rate for LoRA layers)model = get_peft_model(model, lora_config)
把 evaluation_metric 设置为 accuracy。定义可训练的参数,以及训练器。为节约 GPU 资源,可下调精度。
training_args = TrainingArguments(output_dir='./results',num_train_epochs=3,per_device_train_batch_size=2, per_device_eval_batch_size=2,gradient_accumulation_steps=4, fp16=True, # Enable mixed precisionevaluation_strategy="epoch",save_strategy="epoch",logging_dir='./logs',logging_steps=10,
# Train the modeltrainer.train()# Save the fine-tuned LoRA modelmodel.save_pretrained('fine_tuned_lora_llama')tokenizer.save_pretrained('fine_tuned_lora_llama'
最后预计需要 64.00 MiB GPU 空间。技术原理已经阐明,限于算力资源,工程部分留作将来的拓展实践。
如何学习AI大模型?
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】

一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
四、AI大模型商业化落地方案
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。
相关文章:

{结对编程/大模型} 实践营项目案例 | 基于RAG搭建政策问答智能聊天助手
在构建政策问答智能聊天助手的过程中,我们采用了 RAG(Retrieval-Augmented Generation)技术。RAG 是一种结合了检索和生成的混合型自然语言处理技术,它通过检索相关信息来增强生成模型的上下文理解能力。RAG 的主要优点在于能够有…...

【Canvas与图标】乡土风金属铝边立方红黄底黑字图像处理图标
【成图】 120*120图标: 大小图: 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金属铝边立方红黄底黑…...

【开源】A064—基于JAVA的民族婚纱预定系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...

C++实现一个经典计算器(逆波兰算法)附源码
1、本篇要实现的内容 最近,大家讨论计算器的实现比较热,今天我也来用C和Visual Studio实现一个计算器的小程序。这里使用逆波兰算法,能够根据当前用户输入的算式表达式字符串,计算出所要的结果,算式字符串可以包括加、…...

Python知识分享第二十二天-数据结构入门
数据结构 “”" 基础概念: 程序 数据结构 算法 数据结构 存储和组织数据的方式. 算法 解决问题的思维, 思路, 方式. 算法的特性:独立性: 算法 思维, 是解决问题的思路和方式, 不依赖语言.5大特性: 有输入, 有输出, 有穷性, 确定性, 可行性.问: 如何衡量算法的优劣?…...

【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容
目录 1. Introduction:介绍 Registry 的作用和功能。2. Registry Contents:详细描述 Registry 的结构和内容,包括各个部分的条目类型。2.1. DIMSPEC ENTRIES(维度规格条目)2.2. STATE ENTRIES(状态变量条目…...

Android启动优化指南
文章目录 前言一、启动分类与优化目标1、冷启动1.1 优化思路1.2 延迟初始化与按需加载1.3 并行加载与异步执行1.4 资源优化与懒加载1.5 内存优化与垃圾回收控制 2. 温启动2.1 优化应用的生命周期管理2.2 数据缓存与懒加载2.3 延迟渲染与视图优化 3. 热启动3.1 保持应用的状态3.…...

【ETCD】【源码阅读】configureClientListeners () 函数解析
逐步解析 configureClientListeners 函数 configureClientListeners 是 ETCD 的一个重要函数,用于配置客户端通信的监听器(Client Listeners)。这些监听器主要负责处理外部客户端与 ETCD 服务之间的通信,包括 HTTP 和 gRPC 请求。…...

IO进程学习笔记
man手册 普通命令。系统调用的函数。库函数。特殊文件。文件格式。游戏。附加的一些变量 IO介绍 I:input 输入 O:output 输出 对文件的输入和输出 输入-》写文件,将文件中的内容写到内存中去 输出-》读文件,将内存中的内容读取到文…...

智能手机回暖:华为点火,小米荣耀OV拱火
进入11月中下旬,智能手机圈再度热闹起来。包括华为、小米、OPPO、vivo等诸多手机厂商,都在陆续预热发布新机,其中就包括华为Mate 70、小米Redmi K80、vivo的S20,IQOO Neo10等热门新机,这些热门新机的集中上市迅速吸引了…...

Sqoop导入数据(mysql---->>hive)
目录 数据传输流程脚本报错和异常说明1. Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf2. 数据导入hive后显示NULL 数据传输流程 mysql---->>hdfs---->>hive 数据从mysql表中取出,放到hdfs上(由targ…...

实验3-实时数据流处理-Flink
1.前期准备 (1)Flink基础环境安装 参考文章: 利用docker-compose来搭建flink集群-CSDN博客 显示为这样就成功了 (2)把docker,docker-compose,kafka集群安装配置好 参考文章: …...

深度学习实验十四 循环神经网络(1)——测试简单循环网络的记忆能力
目录 一、数据集构建 1.1数据集的构建函数 1.2加载数据集并划分 1.3 构建Dataset类 二、模型构建 2.1嵌入层 2.2SRN层 2.3模型汇总 三、模型训练 3.1 训练指定长度的数字预测模型 3.2 损失曲线展示 四、模型评价 五、修改 附完整可运行代码 实验大体步骤&#x…...

k8s部署odoo18(kubeshpere面板)
Postgresql部署 链接: kubesphere搭建 postgres15 因为我的是在另一台服务器使用kubesphere进行部署的,如果有和我一样情况的,可以参考上面的文档部署postgreasql。 注意事项: 因为odoo不允许使用postgresql的默认用户,也就是po…...

【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!
在这个人工智能迅猛发展的时代,AI聊天助手已经深入我们的工作与生活。你是否曾在选择使用ChatGPT、Kimi或是百度的文心一言时感到一头雾水?每款AI都有其独特的魅力与优势,那么,究竟哪一款AI聊天助手最适合你呢?本文将带…...

Java——容器(单例集合)(上)
一 容器介绍 容器,是用来容纳物体、管理物体。生活中,我们会用到各种各样的容器。如锅碗瓢盆、箱子和包等 程序中的“容器”也有类似的功能,用来容纳和管理数据。比如,如下新闻网站的新闻列表、教育网站的课程列表就是用“容器”来管理 视频…...

如何配置Github并在本地提交代码
前提: 可以流畅访问github, 需要一些上网技巧, 这就自行处理了 申请一个github账号 Github官网地址 首先就是邮箱注册啦, github没有对邮箱的限制, 只要是能收邮件的就ok, qq邮箱, 163等都可以使用. 然后和普通注册账号一样, 一路填写需要的信息, 验证邮箱即可. 如何新增代…...

工作bug,keil5编译器,理解int 类型函数返回值问题,详解!!!
编写不易,禁止搬运,仅供学习,感谢理解 问题现象 下面是一个在keil5里面写的一个,int类型的返回值函数,这个函数里面,只有if else if else这三个判断条件语句,正常来说任何情况下,…...

简明速通Java接口
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文从代码层面直接整理Java接口 让老油子们无需再理解繁杂的概念了。 Java接口在代码层面是做什么的 说白了老铁,Java的接口就是一个类,这个类中只能声明属性和方法,属性需要…...

MVC基础——市场管理系统(二)
文章目录 项目地址三、Produtcts的CRUD3.1 Products列表的展示页面(Read)3.1.1 给Product的Model里添加Category的属性3.1.2 View视图里展示Product List3.2 增加Product数据(Add)3.2.1 创建ViewModel用来组合多个Model3.2.2 在_ViewImposts里引入ViewModels3.2.3 添加Add的…...

java------------常用API preiod duration 计算时间差
1,preiod 如果末天数比初天数小,需要进一位 package API;import java.time.LocalDate; import java.time.Period;public class preiod {public static void main(String[] args) {// 计算时间差// LocalDate获取对象其中的一个方法LocalDate d1 LocalD…...

使用 FAISS 进行高效相似性搜索:从文本检索到动态数据处理
在现代数据科学和人工智能应用中,处理大量高维数据并从中找到相似项是一个常见任务。无论是在推荐系统、搜索引擎,还是在自然语言处理应用中,如何高效地进行相似性搜索(Similarity Search)一直是一个挑战。为了解决这个…...

执行“go mod tidy”遇到“misbehavior”错误
执行“go mod tidy”报错下错误,执行“go clean -modcache”和删除“go env GOMODCACHE”指定目录均无效: SECURITY ERROR go.sum database server misbehavior detected!old database:go.sum database tree3397826xyyhzdyAOat5li/EXx/MK1gONQf3LAGqArh…...

深入详解人工智能机器学习:强化学习
目录 强化学习概述 强化学习的基本概念 定义 关键组件 强化学习过程 常用算法 应用示例 示例代码 代码解释 应用场景 强化学习核心概念和底层原理 核心概念 底层原理 总结 强化学习概述 强化学习(Reinforcement Learning, RL)是机器学习中的…...

力扣打卡11:合并区间(比较器内联,引用传参的优化)
链接:56. 合并区间 - 力扣(LeetCode) 这道题可以用贪心。 首先将intervals的left(intervals[i][0])排序。 然后拿出第一个区间,比较后面相邻的区间: 当前right<后left,表示下一…...

《 bilibili-起步级 用户模块接口文档 经验分享 ~》
bilibili - 用户模块接口文档 - 经验分享 ~ 数据库er关系图 : 迅速跳转链接 枚举码实体类 : 迅速跳转链接 使用apifox.json格式导入接口文档 步骤 登录Apifox。新建文件, 将代码粘贴到该文件, 并更改后缀为 .apifox.json进入项目,点击“导入”。选择“Apifox”格式…...

AES 与 SM4 加密算法:深度解析与对比
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

启保停电路如何接到PLC
传感器:NPN :棕:正 蓝:负 黑:信号 1M——>24V PNP:1M——>0V...

HTTP multipart/form-data 请求
序言 最近在写项目的过程中有一个需求是利用 HTTP 协议传输图片和视频,经过查询方法相应的方法发现使用 multipart/form-data 的方式,这是最常见处理二进制文件的表单编码类型。 学习了一下午,现在总结一下使用的方法和相关的知识点&#x…...

配置服务器的免密登录
在服务器中配置别名和免密登录 如果没有生成过公钥和密钥 ssh-keygen然后就生成了公钥和密钥,下一步进入.ssh文件夹 cd .ssh/可以看到文件夹中会多出来三个文件 id_rsa:密钥id_rsa.pub:公钥known_hosts:A通过ssh首次连接到B&am…...