优化需求类 Markdown 文件以提高 RAG 系统查询准确度

标题:优化需求类 Markdown 文件以提高 RAG 系统查询准确度


目录

  1. 概述
  2. 示例 Markdown 文件
  3. 处理步骤
  4. 处理步骤代码详解
    • 合并标题与内容
    • 丰富标题语义
    • 清洗文本
    • 生成摘要
    • 语义文本切分
  5. 综合处理
  6. 向量化与存储
  7. 检索示例
  8. 总结

概述

处理需求类的 Markdown 文件时,由于标题如“需求名称”、“功能描述”等过于通用,直接用于检索难以准确定位有价值的内容。因此需要对文件进行预处理,通过丰富标题语义、清洗文本、生成摘要、文本切分等步骤提高 RAG(Retrieval-Augmented Generation)系统的查询准确度。


示例 Markdown 文件

文件名:requirement.md

# 需求名称用户管理系统# 需求描述本系统需要实现对用户的增删改查操作,支持批量导入和导出用户数据。# 功能描述## 用户添加管理员可以添加新用户,填写用户名、密码、角色等信息。## 用户删除管理员可以删除现有用户,支持单个和批量删除。![用户删除流程图](https://example.com/images/delete_user_flowchart.png)# 非功能需求系统需要具备高可用性和安全性,支持权限控制和日志记录。

处理步骤

  1. 合并标题与内容:合并 Markdown 文件中每个标题及其下属内容,形成完整的章节。
  2. 丰富标题语义:根据章节内容,对通用标题(如“需求名称”)进行语义丰富。
  3. 清洗文本:去除不必要的 Markdown 标记、图片链接等,保留核心内容。
  4. 生成摘要:为每个章节生成简要摘要,方便快速理解内容。
  5. 语义文本切分:将长文本切分为语义完整的片段,适合模型处理。

处理步骤代码详解

合并标题与内容

合并每个标题及其下属内容。

def merge_titles_with_content(markdown_text):import relines = markdown_text.split('\n')merged_sections = []current_section = {'title': '', 'content': ''}title_pattern = re.compile(r'^(#{1,6})\s*(.*)')for line in lines:title_match = title_pattern.match(line)if title_match:if current_section['title'] or current_section['content']:merged_sections.append(current_section)current_section = {'title': title_match.group(2), 'content': ''}else:current_section['content'] += line + '\n'if current_section['title'] or current_section['content']:merged_sections.append(current_section)return merged_sections
丰富标题语义

通过章节内容的第一行来增强标题语义。

def enrich_title(section):generic_titles = ['需求名称', '需求描述', '功能描述', '非功能需求']title = section['title']content_lines = section['content'].strip().split('\n')if title in generic_titles and content_lines:enriched_title = f"{title}: {content_lines[0]}"else:enriched_title = titlereturn enriched_title
清洗文本

去除不必要的 Markdown 标记、图片链接等,使文本更简洁易于处理。

def clean_text(text):import retext = re.sub(r'#{1,6}\s*', '', text)text = re.sub(r'!\[([^\]]*)\]\([^\)]*\)', r'\1', text)text = re.sub(r'\s+', ' ', text).strip()return text
生成摘要

生成每个章节的摘要。

def generate_summary(text, max_length=50):from gensim.summarization import summarizetry:summary = summarize(text, word_count=max_length)if not summary:summary = text[:max_length]except ValueError:summary = text[:max_length]return summary
语义文本切分

将文本切分为语义完整的片段,适合向量化处理。

def semantic_text_split(text, max_length=100):import nltknltk.download('punkt', quiet=True)sentences = nltk.sent_tokenize(text)chunks = []current_chunk = ''for sentence in sentences:if len(current_chunk) + len(sentence) <= max_length:current_chunk += ' ' + sentenceelse:chunks.append(current_chunk.strip())current_chunk = sentenceif current_chunk:chunks.append(current_chunk.strip())return chunks

综合处理

将上述所有步骤整合在一起。

def process_requirement_markdown(markdown_text):sections = merge_titles_with_content(markdown_text)processed_data = []for section in sections:enriched_title = enrich_title(section)content_clean = clean_text(section['content'])summary = generate_summary(content_clean)chunks = semantic_text_split(content_clean)for chunk in chunks:combined_text = f"{enriched_title}\n{chunk}"processed_data.append({'text': combined_text,'metadata': {'title': enriched_title,'summary': summary}})return processed_data

应用

with open('requirement.md', 'r', encoding='utf-8') as file:markdown_text = file.read()processed_data = process_requirement_markdown(markdown_text)
for item in processed_data:print("Processed Text:", item['text'])print("Metadata:", item['metadata'])print("---")

向量化与存储

对处理后的文本进行向量化和存储,以供后续检索使用。

向量化文本
from sentence_transformers import SentenceTransformerdef vectorize_texts(texts):model = SentenceTransformer('distiluse-base-multilingual-cased-v1')embeddings = model.encode(texts)return embeddings

应用

texts = [item['text'] for item in processed_data]
embeddings = vectorize_texts(texts)
存储向量和元数据
import faiss
import numpy as npdef store_embeddings(embeddings, processed_data):dimension = embeddings.shape[1]index = faiss.IndexFlatL2(dimension)index.add(embeddings)faiss.write_index(index, 'requirement_vectors.index')metadata_list = [item['metadata'] for item in processed_data]np.save('requirement_metadata.npy', metadata_list)with open('requirement_texts.txt', 'w', encoding='utf-8') as f:for item in processed_data:f.write(item['text'] + '\n')

应用

store_embeddings(embeddings, processed_data)

检索示例

通过向量化检索以实现精准查询。

def search_requirements(query, k=3):index = faiss.read_index('requirement_vectors.index')metadata_list = np.load('requirement_metadata.npy', allow_pickle=True)with open('requirement_texts.txt', 'r', encoding='utf-8') as f:texts = f.read().splitlines()query_embedding = vectorize_texts([query])distances, indices = index.search(query_embedding, k)results = []for idx in indices[0]:result = {'text': texts[idx],'metadata': metadata_list[idx]}results.append(result)return resultsquery = "如何删除用户?"
results = search_requirements(query)
for result in results:print("Result Text:", result['text'])print("Metadata:", result['metadata'])print("---")

总结

通过以下步骤对不含代码的需求类 Markdown 文件进行处理,显著提高了 RAG 系统的查询准确度:

  1. 合并标题与内容:确保标题和内容逻辑关联,便于理解。
  2. 丰富标题语义:增强通用标题的表达能力,增加检索准确度。
  3. 清洗文本:去除无用标记,保留核心信息。
  4. 生成摘要:为检索过程提供简要概览。
  5. 语义文本切分:将长文本切分为适合模型处理的片段。
  6. 向量化与存储:对处理后的文本进行向量化处理,以便于检索。
  7. 检索验证:通过示例验证了查询的有效性。

优化建议

  • 多语言支持:确保使用支持中文的预训练模型,如 distiluse-base-multilingual-cased-v1
  • 性能与扩展性:对于大型数据集,建议使用 Milvus 或 Pinecone 等专业向量数据库。

通过这样的预处理流程,可以显著提高需求文档在 RAG 系统中的查询准确度,满足用户快速查找需求信息的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

window的wsl(Ubuntu)安装kafka步骤

环境&#xff1a;Win11 WSL(Linux子系统Ubuntu) apache-zookeeper-3.9.3-bin kafka_2.12-3.8.1 思路&#xff1a;apache上分别下载zookeeper和kafka&#xff0c;在wsl环境安装。在kafka上创建消息的topic&#xff0c;发送消息&#xff0c;接受消息&#xff0c;验证是否安…

数据结构树和二叉树知识点和递归序列

二叉树知识点 一.树的概念1.1关于树的名词解释 二.二叉树的概念1. 二叉树性质&#xff1a; 三.满二叉树与完全二叉树递归前序遍历递归中序遍历递归后续遍历 一.树的概念 树是一种非线性数据结构&#xff0c;它是由n个或大于n个的结点来组成具有层次关系的一个集合&#xff08;…

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…

使用 Elastic 3 步实现基于 OTel 的原生 K8s 和应用可观测性

作者&#xff1a;来自 Elastic Bahubali Shetti Elastic 的 OpenTelemetry 发行版现已支持 OTel Operator&#xff0c;可使用 EDOT SDK 自动检测应用程序&#xff0c;并管理 EDOT OTel Collector 的部署和生命周期以实现 Kubernetes 可观察性。了解如何通过 3 个简单步骤进行配…

stack、queue、priority_queue、deque的使用和模拟实现

目录 1.容器适配器 2.stack stack的常用接口及使用示例 stack的模拟实现 3.queue queue的常用接口及使用示例 queue的模拟实现 4.priority_queue priority_queue的常用接口及使用示例 priority_queue的模拟实现 5.deque 认识deque deque底层的数据结构 deque和ve…

Linux的cuDNN(cudnn)安装教程(CUDA(cuda\cuda toolkit))

CUDA(cuda\cuda toolkit&#xff09;安装教程 https://blog.csdn.net/huiyayaya/article/details/143863835?spm1001.2014.3001.5502官网下载cudnn https://developer.nvidia.com/rdp/cudnn-archive这个下载到自己的电脑 下载到本地就好 复制到服务器 切换到cudnn文件所在目…

Kafka中ACKS LSO LEO LW HW AR ISR OSR解析

名称解释 ACKS&#xff08;Acknowledgments&#xff09;确认、回执 LW&#xff08;Low watermark&#xff09;低水位、LSO&#xff08;Log start offset&#xff09;起始偏移量 HW&#xff08;High watermark&#xff09;高水位 LEO&#xff08;Log end offset&#xff09;…

C++设计模式行为模式———迭代器模式

文章目录 一、引言二、迭代器模式三、总结 一、引言 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。C标准库中内置了很多容器并提供了合适的迭代器&#xff0c;尽管我们不…

智能体Agent调研

单个智能体建模与优化现状 人类长期以来追求类似于或超越人类水平的人工智能 (AI)&#xff0c;而 基于AI的代理&#xff08;Agent&#xff09;被认为是一个有前途的研究方向。传统计算机领域的Agent有多种&#xff0c;如自动化脚本、网络爬虫、推荐系统、软件机器人能够独立自…

SAP PI/PO Proxy2JDBC SQL_QUERY动态接口示例

目录 背景&#xff1a; 完整demo步骤&#xff1a; IR: ID: SPROXY: 测试代码&#xff1a; 注意点&#xff1a; 背景&#xff1a; 中途临时帮客户项目做其他功能&#xff0c;项目上有部分开发项需要通过PO去第三方数据库取数&#xff0c;项目上的开发对PO不太熟&#xf…

【汇编语言】数据处理的两个基本问题(三) —— 汇编语言的艺术:从div,dd,dup到结构化数据的访问

文章目录 前言1. div指令1.1 使用div时的注意事项1.2 使用格式1.3 多种内存单元表示方法进行举例1.4 问题一1.5 问题一的分析与求解1.5.1 分析1.5.2 程序实现 1.6 问题二1.7 问题二的分析与求解1.7.1 分析1.7.2 程序实现 2. 伪指令 dd2.1 什么是dd&#xff1f;2.2 问题三2.3 问…

模型的评估指标——IoU、混淆矩阵、Precision、Recall、P-R曲线、F1-score、mAP、AP、AUC-ROC

文章目录 预测框的预测指标——IoU&#xff08;交并比&#xff09;分类预测指标混淆矩阵&#xff08;Confusion Matrix&#xff0c;TP、FP、FN、TN)Precision&#xff08;精度&#xff09;Recall&#xff08;召回率&#xff09;P-R曲线F1-scoreTPR、TNR、FPR、FNRROC曲线下面积…

轻量云服务器:入门级云计算的最佳选择

在云计算领域&#xff0c;轻量云服务器逐渐成为小型企业、个人开发者和初创公司关注的热点。它凭借高性价比、简单易用和稳定性能&#xff0c;正在改变传统的服务器部署方式。本文将详细解析轻量云服务器的定义、优势、适用场景及如何选择最佳方案&#xff0c;帮助您全面了解这…

【初阶数据结构篇】归并排序、计数排序

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

移远通信5G RedCap模组RG255C-CN通过中国电信5G Inside终端生态认证

近日&#xff0c;移远通信5G RedCap模组RG255C-CN荣获中国电信颁发的5G Inside终端生态认证证书。这表明&#xff0c;该产品在5G基本性能、网络兼容性、安全特性等方面已经过严格评测且表现优异&#xff0c;将进一步加速推动5G行业终端规模化应用。 中国电信5G Inside终端生态认…

Towards Reasoning in Large Language Models: A Survey

文章目录 题目摘要引言什么是推理?走向大型语言模型中的推理测量大型语言模型中的推理发现与启示反思、讨论和未来方向 为什么要推理?结论题目 大型语言模型中的推理:一项调查 论文地址:https://arxiv.org/abs/2212.10403 项目地址: https://github.com/jeffhj/LM-reason…

Android Studio | 修改镜像地址为阿里云镜像地址,启动App

在项目文件的目录下的 settings.gradle.kts 中修改配置&#xff0c;配置中包含插件和依赖项 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https://maven.aliyun.com/repository/releases")}maven { urlu…

Python | Leetcode Python题解之第564题数组嵌套

题目&#xff1a; 题解&#xff1a; class Solution:def arrayNesting(self, nums: List[int]) -> int:ans, n 0, len(nums)for i in range(n):cnt 0while nums[i] < n:num nums[i]nums[i] ni numcnt 1ans max(ans, cnt)return ans

2024-11-17 -MATLAB三维绘图简单实例

1. x -1:0.05:1; y x; [X, Y] meshgrid(x, y); f (X, Y) (sin(pi * X) .* sin(pi * Y)) .^ 2.*sin(2.*X2.*Y); mesh(X, Y, f(X, Y)); % 调用函数f并传递X和Y xlabel(X-axis); ylabel(Y-axis); zlabel(Z-axis); title(Surface Plot of (sin(pi * X) .* sin(pi * Y)) .^ 2.*…

网络层9——虚拟专用网VPN和网络地址转换NAT

目录 一、为什么有虚拟专用网&#xff1f; 二、如何理解“虚拟专用网”&#xff1f; 三、IP隧道技术实现虚拟专用网 四、网络地址变换 一、为什么有虚拟专用网&#xff1f; 第一&#xff0c;IPv4只有32位&#xff0c;最多有40亿个全球唯一的IP地址数量不够&#xff0c;无法…