2.5 数据集构建最佳实践 数据集构建是RAG系统的基础工程。科学的数据集构建方法能够显著提升系统的检索效果和生成质量。 数据集构建概述 构建原则 业务导向:基于实际业务需求构建 质量优先:确保数据质量和准确性 规模适中:平衡数据量和质量 持续优化:基于反馈持续改进 构建流程 数据收集策略 多源数据收集 内部数据源 企业文档:技术文档、产品手册、操作指南 业务数据:客户记录、交易数据、日志文件 知识库:FAQ库、问题库、解决方案库 外部数据源 公开文档:行业标准、技术规范、研究报告 网络资源:技术博客、学术论文、开源文档 第三方数据:合作伙伴数据、行业报告 数据收集方法 爬虫收集 API数据获取 数据标注与分类 自动标注 基于规则的标注 基于机器学习的标注 人工标注 标注规范 数据预处理
数据集构建是RAG系统的基础工程。科学的数据集构建方法能够显著提升系统的检索效果和生成质量。
import requests from bs4 import BeautifulSoup import os def collect_web_data(urls: list, save_path: str): """收集网络数据""" for url in urls: try: response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') content = soup.get_text() # 保存数据 filename = url.split('/')[-1] or 'document' with open(os.path.join(save_path, f"{filename}.txt"), 'w', encoding='utf-8') as f: f.write(content) except Exception as e: print(f"收集数据失败 {url}: {str(e)}")
import json def collect_api_data(api_url: str, headers: dict = None): """通过API获取数据""" response = requests.get(api_url, headers=headers) if response.status_code == 200: return response.json() else: raise Exception(f"API调用失败: {response.status_code}")
def rule_based_annotation(text: str) -> dict: """基于规则的自动标注""" annotation = { 'document_type': 'unknown', 'language': 'unknown', 'topic': 'unknown', 'priority': 'normal' } # 文档类型识别 if '.pdf' in text.lower(): annotation['document_type'] = 'pdf' elif '.doc' in text.lower(): annotation['document_type'] = 'word' elif '.html' in text.lower(): annotation['document_type'] = 'html' # 语言识别 if re.search(r'[\u4e00-\u9fa5]', text): annotation['language'] = 'chinese' else: annotation['language'] = 'english' # 主题识别(简化版) keywords = ['技术', '产品', '服务', '解决方案'] if any(keyword in text for keyword in keywords): annotation['topic'] = 'business' return annotation
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.cluster import KMeans def ml_based_annotation(documents: list, n_clusters: int = 5) -> list: """基于机器学习的自动标注""" # 文本向量化 vectorizer = TfidfVectorizer(max_features=1000) X = vectorizer.fit_transform([doc.page_content for doc in documents]) # 聚类分析 kmeans = KMeans(n_clusters=n_clusters, random_state=42) clusters = kmeans.fit_predict(X) # 添加标注信息 annotated_docs = [] for i, doc in enumerate(documents): doc.metadata['cluster'] = clusters[i] annotated_docs.append(doc) return annotated_docs
标注规范: 文档类型: - 技术文档: API文档、技术规范、开发指南 - 产品文档: 产品手册、用户指南、功能说明 - 业务文档: 流程说明、操作手册、管理制度 - 营销文档: 产品介绍、市场分析、营销方案 优先级: - 高: 核心业务文档、关键技术文档 - 中: 一般业务文档、辅助技术文档 - 低: 历史文档、参考文档 质量等级: - A: 优秀(完整、准确、及时) - B: 良好(基本完整、基本准确) - C: 一般(存在缺陷但不影响使用) - D: 较差(存在严重问题)
def standardize_format(text: str) -> str: """统一文本格式""" # 统一编码 text = text.encode('utf-8').decode('utf-8') # 统一标点符号 text = text.replace(',', ',').replace('。', '.').replace('!', '!') text = text.replace('?', '?').replace(':', ':').replace(';', ';') # 统一空白字符 text = ' '.join(text.split()) return text
def standardize_language(text: str, target_lang: str = 'zh') -> str: """标准化语言""" if target_lang == 'zh': # 中文繁简转换 from opencc import OpenCC converter = OpenCC('t2s') text = converter.convert(text) elif target_lang == 'en': # 英文大小写标准化 text = text.lower() return text
def extract_document_structure(text: str) -> dict: """提取文档结构""" structure = { 'title': '', 'sections': [], 'tables': [], 'code_blocks': [] } # 提取标题 title_pattern = r'#\s+(.+)' title_match = re.search(title_pattern, text) if title_match: structure['title'] = title_match.group(1) # 提取章节 section_pattern = r'##\s+(.+)' sections = re.findall(section_pattern, text) structure['sections'] = sections # 提取表格 table_pattern = r'\|\s*([^|]+)\s*\|' tables = re.findall(table_pattern, text) structure['tables'] = tables # 提取代码块 code_pattern = r'```(?:\w+)?\n(.*?)\n```' code_blocks = re.findall(code_pattern, text, re.DOTALL) structure['code_blocks'] = code_blocks return structure
def validate_completeness(data: dict) -> bool: """验证数据完整性""" required_fields = ['title', 'content', 'source', 'metadata'] return all(field in data for field in required_fields)
def validate_consistency(data: dict) -> bool: """验证数据一致性""" # 检查字段值的一致性 if 'title' in data and 'content' in data: title_length = len(data['title']) content_length = len(data['content']) return content_length > title_length * 10 # 内容长度应大于标题长度的10倍 return True
def test_retrieval_effectiveness(test_data: list, retriever) -> dict: """测试检索效果""" results = { 'precision': 0.0, 'recall': 0.0, 'f1_score': 0.0, 'average_response_time': 0.0 } # 实现具体的检索测试逻辑 # 这里需要根据实际需求实现测试方法 return results
def augment_dataset(original_data: list, augmentation_factor: int = 2) -> list: """数据增强""" augmented_data = original_data.copy() # 通过多种方式增强数据 for doc in original_data: # 生成相关问题 questions = generate_related_questions(doc.page_content) for question in questions: augmented_data.append(create_q_document(question, doc)) # 生成总结 summary = generate_summary(doc.page_content) augmented_data.append(create_summary_document(summary, doc)) return augmented_data
def filter_by_quality(documents: list, quality_threshold: float = 0.8) -> list: """根据质量筛选数据""" filtered_docs = [] for doc in documents: quality_score = calculate_quality_score(doc) if quality_score >= quality_threshold: filtered_docs.append(doc) return filtered_docs
def filter_by_relevance(documents: list, topics: list) -> list: """根据相关性筛选数据""" from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity vectorizer = TfidfVectorizer() topic_vectors = vectorizer.fit_transform(topics) doc_vectors = vectorizer.transform([doc.page_content for doc in documents]) similarities = cosine_similarity(doc_vectors, topic_vectors) avg_similarities = similarities.mean(axis=1) filtered_docs = [ doc for doc, score in zip(documents, avg_similarities) if score > 0.5 # 设置相关度阈值 ] return filtered_docs
class EnterpriseDataCollector: """企业数据采集系统""" def __init__(self, config: dict): self.config = config self.sources = config['sources'] self.output_dir = config['output_dir'] def collect_all_data(self): """收集所有数据源的数据""" all_data = [] for source in self.sources: if source['type'] == 'local': data = self.collect_local_data(source) elif source['type'] == 'web': data = self.collect_web_data(source) elif source['type'] == 'api': data = self.collect_api_data(source) all_data.extend(data) return all_data def collect_local_data(self, source: dict) -> list: """收集本地数据""" # 实现本地数据收集逻辑 return [] def collect_web_data(self, source: dict) -> list: """收集网络数据""" # 实现网络数据收集逻辑 return [] def collect_api_data(self, source: dict) -> list: """收集API数据""" # 实现API数据收集逻辑 return []
class DataProcessingPipeline: """数据处理流水线""" def __init__(self): self.cleaner = DataCleaner() self.validator = DataValidator() self.annotator = DataAnnotator() def process_documents(self, documents: list) -> list: """处理文档流水线""" processed_docs = [] for doc in documents: # 1. 数据清洗 cleaned_doc = self.cleaner.clean(doc) # 2. 数据验证 if self.validator.validate(cleaned_doc): # 3. 数据标注 annotated_doc = self.annotator.annotate(cleaned_doc) processed_docs.append(annotated_doc) return processed_docs
数据集构建是RAG系统成功的基础。通过科学的构建方法、严格的质量控制和持续的优化改进,可以构建出高质量的数据集,为RAG系统提供坚实的数据基础。在实际应用中,建议根据具体业务需求调整构建策略,并结合自动化工具和人工审核确保数据质量。高质量的构建将为后续的系统应用提供有力支撑。