安徽建设工程网站,wordpress标签云代码,免费100个简历模板,wordpress批量替换在构建政策问答智能聊天助手的过程中#xff0c;我们采用了 RAG#xff08;Retrieval-Augmented Generation#xff09;技术。RAG 是一种结合了检索和生成的混合型自然语言处理技术#xff0c;它通过检索相关信息来增强生成模型的上下文理解能力。RAG 的主要优点在于能够有…
在构建政策问答智能聊天助手的过程中我们采用了 RAGRetrieval-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, dpi300, first_pagestart_page, last_pageend_page)text_pages {}for i, image in enumerate(images, startstart_page):gray_image ImageOps.grayscale(image)text pytesseract.image_to_string(gray_image, langchi_simeng)print(f\nPage {i} Text:\n{text}) # Print recognized texttext_pages[i] text \nreturn 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个字符我们采用 width300overlapping50 的分割法。
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 段落K5
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(keylambda x: x[1], reverseTrue)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【内容{idx1}】\n{chunk_text}\n\nprompt 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我们选取 W80overlap40。对于 Open_llama_7b我们选取 top K3。 在学员们利用 RAG 技术搭建政策问答智能聊天助手的流程中他们经历了详尽的调研和调试已经从最初的探索者成长为能够独立处理复杂任务的专家。然而这个项目方案仍有提升空间。
我们注意到模型的训练和推理过程并未完全分离导致超参数hyperparameters的设定过于依赖初始设计缺乏迭代优化的过程这是机器学习早期的常见问题。随着深度学习技术的不断进步出现了多种调参方法。在这些方法中LoRA 因其能够在较低成本下实现大模型的局部微调而备受青睐。通过引入 LoRA 技术我们可以更有效地优化模型实现更精准的调整从而提升整体性能。
01. 什么是 LoRA
LoRAlow-rank adaptation低秩适应是一种高效的机器学习模型微调技术它能够迅速使模型适应新环境。与 RAG 专注于特定数据集不同LoRA 使模型能够更好地适应特定的任务需求。在面对多样化的细分任务时全面微调一个大型模型往往成本过高而 LoRA 提供了一种经济且快速的解决方案。通过在模型的 QKVQuery, Key, Value部分引入低秩矩阵即形式为 Bmxr x Arxn 的结构其中 r 远小于 m 和 nLoRA 只需训练两个残差residual矩阵A和B。这种方法显著减少了训练的参数量同时对模型的自注意力层和交叉注意力层产生影响从而实现对模型的快速且有效的微调。
02. 把 LoRA 应用到 RAG Chatbot
我们先将先前的评价集 dataset.json 以 2055 拆成 trainvalidtest。设置 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_mapauto)# Apply LoRA to the modellora_config LoraConfig(r8, # Low-rank approximation factorlora_alpha16, # Scaling factor for the LoRA weightstarget_modules[q_proj, k_proj, v_proj], # Target the attention layerslora_dropout0.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_epochs3,per_device_train_batch_size2, per_device_eval_batch_size2,gradient_accumulation_steps4, fp16True, # Enable mixed precisionevaluation_strategyepoch,save_strategyepoch,logging_dir./logs,logging_steps10,# 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大模型商业化落地方案 作为普通人入局大模型时代需要持续学习和实践不断提高自己的技能和认知水平同时也需要有责任感和伦理意识为人工智能的健康发展贡献力量。