RAG 效果比对-

RAG 前

由于这个知识人物比较新,模型还没有学习,所以可以看出RAG的效果。

我们把如下知识灌输进模型的脑袋中(来自百度百科):

郑钦文,女,2002年10月8日出生于湖北省十堰市 ,国际级运动健将,中国网球运动员。

2014年,郑钦文参加湖北省第十四届运动会摘得两金。2020年8月29日,郑钦文在国际网联巡回赛科尔德农斯站夺得成人赛首个冠军。2022年1月14日,郑钦文闯入澳大利亚网球公开赛女单正赛;1月17日,澳大利亚网球公开赛女单首轮,生涯首次亮相大满贯正赛取得开门红;5月28日,2022年法国网球公开赛女单第三轮,郑钦文成为继郑洁、李娜和张帅之后第四位闯入到法网16强的中国金花 ;并斩获WTA2022赛季年度最佳新人奖。2023年5月15日,WTA1000罗马站女单第四轮,郑钦文成为自2014年的李娜、张帅之后,首位在罗马晋级八强的中国金花;6月21日,以国际级运动健将身份保送华中科技大学7月24日,2023年WTA250巴勒莫站女单决赛,郑钦文拿下职业生涯首个巡回赛冠军;9月5日,在美国网球公开赛女单1/8决赛中,郑钦文直落两盘战胜赛会5号种子突尼斯选手贾巴尔,首次打进大满贯女单8强 ;9月29日,郑钦文获得杭州第19届亚运会女单冠军,并收获2024年巴黎奥运会参赛资格;10月15日,郑钦文在2023年WTA500郑州网球公开赛女单决赛中获胜,夺得职业生涯首个WTA500赛冠军。]2024年1月27日,2024年澳大利亚网球公开赛女单决赛,郑钦文获得亚军,创造个人大满贯最佳战绩,继李娜之后中国选手在大满贯的最佳战绩;北京时间8月3日晚,巴黎奥运会网球女单决赛,郑钦文夺冠,她也创造历史成为了中国首位奥运网球单打冠军。 

然后可以看得出回答是基于新的知识了:

然后我们调整了一下文档,去掉了其他不相干的信息,就看到回复是:

如果在目标文件夹中新建一个文件存储这个信息,可以看到她的确是可以找到:

就是里面回复的细节还是不太清楚,比如为什么第一个图回复好多次,后面重发了三遍json等等,不过也不强求了,也许以后会知道吧 maybe

《基于检索增强生成(RAG)的多场景问答系统》 一、项目背景 针对目标公司业务,设计一个融合传统检索技术与大模型生成能力的问答系统,重点解决以下问题: 简单问题:通过高效检索快速返回标准答案(如产品FAQ) 复杂问题:调用大模型生成解释性答案,并利用检索结果约束生成内容可信度 内容安全:通过相似度检测拦截重复/低质用户提问,降低服务器负载 二、技术架构 mermaid graph TD A[用户提问] --> B{问题类型判断} B -->|简单问题| C[检索式问答] B -->|复杂问题| D[生成式问答] C --> E[返回结构化答案] D --> E E --> F[答案去重与缓存] F --> G[用户反馈] G --> H[模型迭代] subgraph 检索式问答 C1[(知识库)] --> C2[BM25/Jaccard检索] C2 --> C3[相似度排序] end subgraph 生成式问答 D1[微调大模型] --> D2[Prompt工程] D2 --> D3[检索增强生成] end 三、核心模块与代码关联 原代码模块 迁移应用场景 升级策略 情感分析代码 用户意图分类 将情感标签替换为问题类型(简单/复杂) LSTM模型代码 微调轻量化大模型(如T5-small) 将LSTM替换为Transformer架构 相似度检测代码 答案去重与缓存 Jaccard→余弦相似度+Sentence-BERT 四、关键技术实现 1. 混合问答路由(复用情感分析逻辑) def route_question(question): # 使用预训练模型判断问题复杂度 inputs = tokenizer(question, return_tensors="pt") outputs = classifier_model(**inputs) prob_complex = torch.softmax(outputs.logits, dim=1)[0][1] return "生成式" if prob_complex > 0.7 else "检索式" 2. 检索增强生成(融合代码2/3)from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration # 初始化RAG模型 tokenizer = RagTokenizer.from_pretrained("facebook/rag-sequence-nq") retriever = RagRetriever.from_pretrained("facebook/rag-sequence-nq", index_name="exact") model = RagSequenceForGeneration.from_pretrained("facebook/rag-sequence-nq") def answer_with_rag(question): inputs = tokenizer(question, return_tensors="pt") outputs = model.generate(input_ids=inputs["input_ids"]) return tokenizer.decode(outputs[0], skip_special_tokens=True) 3. 动态知识更新(复用相似度检测) python 复制 class KnowledgeManager: def __init__(self): self.knowledge_base = [] def add_document(self, doc): # 去重检查(复用代码3的Jaccard逻辑) segments = segment(doc) for existing in self.knowledge_base: if jaccard_similarity(segments, existing['segments']) > 0.8: return False self.knowledge_base.append({'text': doc, 'segments': segments}) return True 五、面试展示策略 1. 技术深度表达 检索优化: “我将电影评论分析中的词频统计升级为BM25算法,解决TF-IDF对长文档不敏感的问题,在开放域问答任务中检索准确率提升18%” 生成控制: “复用LSTM训练经验,使用LoRA技术对Llama-2进行高效微调,在保持90%性能的同时减少70%训练成本” 2. 业务思维体现 成本控制: “通过问题分类路由,对80%的简单问题使用检索式回答,相比全量调用大模型,API成本降低65%” 效果验证: “在500条测试数据上,混合系统的回答准确率达到92%,纯生成方案为85%,响应时间从3.2s降至1.4s” 3. 难点突破 冷启动问题: “初期缺乏标注数据时,使用SimCSE无监督训练相似度模型,实现检索模块的零样本启动” 生成幻觉抑制: “通过检索结果约束生成空间,加入惩罚项使模型更关注知识库内容,虚构回答比例从23%降至7%” 六、延伸建议 部署演示:用Gradio搭建Web Demo,展示实时问答流程 性能对比:提供不同方案(纯检索/纯生成/混合)的准确率-耗时曲线图 优化路线:提出引入强化学习实现自动路由策略的下一步计划 帮我完善以上文档提供的代码
03-08
<think>嗯,用户让我帮忙完善基于RAG的多场景问答系统的代码。首先,我需要仔细看一下用户提供的文档和现有的代码结构。用户已经给出了一些核心模块的代码片段,比如混合问答路由、检索增强生成和动态知识更新,但可能这些代码还不够完整或者需要优化。 首先,混合问答路由部分,用户用了预训练模型来判断问题类型,返回生成式或检索式。但这里可能需要更详细的处理,比如处理CUDA设备、错误处理,以及添加日志记录,这样在实际部署时会更加可靠。另外,路由的阈值0.7是硬编码,或许可以改成可配置的参数,方便后续调整。 接下来是检索增强生成的部分,用户使用了Facebook的RAG模型,但代码示例中没有考虑输入长度限制,也没有处理可能出现的异常。此外,生成的参数比如max_length和num_beams可以调整,以平衡生成速度和质量。需要添加这些参数,并且确保模型在GPU上运行(如果有的话)。 动态知识更新的部分,用户提到了去重检查,但Jaccard相似度的具体实现没有给出。可能需要补充相似度计算的函数,以及文档分段的逻辑。另外,去重的阈值0.8也是硬编码,应该作为参数传入。同时,文档分段的方法需要具体实现,比如按句子或段落分割,这里可能需要调用现有的分词工具或库。 然后,用户可能希望代码更模块化,比如将知识管理器封装成类,并添加必要的辅助函数。比如,文档分段可以使用nltk的句子分割,但需要处理可能的安装和导入问题。另外,去重检查不仅要考虑Jaccard,还可以结合余弦相似度,使用Sentence-BERT等更先进的模型,但用户提到复用现有代码,所以可能先实现Jaccard,后续再升级。 还要考虑代码的健壮性,比如异常处理。例如,在路由问题类型时,模型可能抛出异常,需要捕获并处理。同样,在生成答案时,可能需要限制输入长度,避免模型处理过长的文本。 另外,用户提到的相似度检测代码升级,从Jaccard到余弦相似度+Sentence-BERT,可能在动态知识更新部分需要实现这两种方法,但根据当前代码,可能先完成Jaccard,后续再扩展。需要确保代码结构允许灵活替换相似度计算方法。 最后,代码的示例可能需要更完整,包括必要的导入语句和依赖库的说明,比如安装transformers、nltk等。同时,添加注释和文档字符串,方便其他人理解和维护。 总结下来,我需要完善各个模块的代码,补充缺失的部分,处理设备分配、错误处理、参数配置,以及模块之间的衔接。同时,确保代码符合最佳实践,比如模块化、可配置性、日志记录等,这样用户在实际部署时会更加顺利。</think>我将从代码健壮性、模块化和业务适配三个角度对现有代码进行完善,并添加关键的中文注释: 一、混合问答路由增强版(新增设备管理/配置注入) ```python import torch from transformers import AutoTokenizer, AutoModelForSequenceClassification class QuestionRouter: def __init__(self, model_name="bert-base-uncased", threshold=0.7, device="cuda"): self.device = device if torch.cuda.is_available() else "cpu" self.tokenizer = AutoTokenizer.from_pretrained(model_name) self.classifier = AutoModelForSequenceClassification.from_pretrained(model_name).to(self.device) self.threshold = threshold # 可配置决策阈值 def route_question(self, question: str) -> str: """问题路由逻辑(支持批量处理)""" try: inputs = self.tokenizer( question, padding=True, truncation=True, max_length=512, # 防止长文本溢出 return_tensors="pt" ).to(self.device) with torch.no_grad(): outputs = self.classifier(**inputs) probs = torch.softmax(outputs.logits, dim=1) return "生成式" if probs[0][1] > self.threshold else "检索式" except Exception as e: print(f"路由异常: {str(e)}") return "检索式" # 降级处理 ``` 二、增强版检索增强生成(优化生成控制) ```python from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration class RAGGenerator: def __init__(self, model_name="facebook/rag-sequence-nq"): self.tokenizer = RagTokenizer.from_pretrained(model_name) self.retriever = RagRetriever.from_pretrained( model_name, index_name="exact", passages_path="path_to_your_knowledge" # 需替换为实际知识库路径 ) self.model = RagSequenceForGeneration.from_pretrained(model_name) def generate_answer(self, question: str, max_length=200) -> str: """带生成控制的RAG回答""" try: inputs = self.tokenizer( question, return_tensors="pt", max_length=256, # 输入截断 truncation=True ) outputs = self.model.generate( input_ids=inputs["input_ids"], max_length=max_length, num_beams=4, # 平衡生成速度与质量 no_repeat_ngram_size=3 # 减少重复 ) return self.tokenizer.decode( outputs[0], skip_special_tokens=True, clean_up_tokenization_spaces=True ) except Exception as e: print(f"生成异常: {str(e)}") return "暂时无法回答该问题" ``` 三、动态知识管理系统(含相似度检测) ```python from nltk import sent_tokenize import numpy as np class KnowledgeManager: def __init__(self, similarity_threshold=0.8): self.knowledge_base = [] self.similarity_threshold = similarity_threshold @staticmethod def jaccard_similarity(text1: str, text2: str) -> float: """改进版Jaccard相似度计算""" set1 = set(text1.lower().split()) set2 = set(text2.lower().split()) intersection = len(set1 & set2) union = len(set1 | set2) return intersection / union if union != 0 else 0 def segment_document(self, doc: str) -> list: """文档分句处理""" return sent_tokenize(doc) # 使用nltk分句 def add_document(self, doc: str) -> bool: """带去重的知识入库""" new_segments = self.segment_document(doc) for existing in self.knowledge_base: existing_segments = existing['segments'] # 段落级相似度比对 sim_scores = [ self.jaccard_similarity(s1, s2) for s1 in new_segments for s2 in existing_segments ] if np.max(sim_scores) > self.similarity_threshold: return False self.knowledge_base.append({ 'text': doc, 'segments': new_segments, 'timestamp': datetime.now() # 添加时间戳 }) return True ``` 四、系统集成示例 ```python class QASystem: def __init__(self): self.router = QuestionRouter() self.retriever = BM25Retriever() # 需实现检索模块 self.generator = RAGGenerator() self.knowledge_mgr = KnowledgeManager() def process_query(self, question: str) -> dict: # 动态更新知识库 self._update_knowledge() # 路由决策 mode = self.router.route_question(question) if mode == "检索式": answer = self.retriever.search(question) else: answer = self.generator.generate_answer(question) return { "mode": mode, "answer": answer, "source": "knowledge_base" if mode == "检索式" else "generated" } def _update_knowledge(self): # 从外部源获取新知识 new_docs = fetch_latest_documents() # 需实现文档获取 for doc in new_docs: self.knowledge_mgr.add_document(doc) ``` 代码优化亮点: 1. 异常处理:所有关键操作添加try-catch块,保障系统稳定性 2. 配置注入:阈值参数通过构造函数注入,提高系统灵活性 3. 生成控制:添加num_beams/no_repeat_ngram_size等参数抑制低质量生成 4. 知识追溯:在返回结果中添加source字段,满足可解释性需求 5. 动态更新:定时检查新知识文档,保持系统时效性 6. 性能优化:添加CUDA设备管理,支持GPU加速 建议后续扩展: 1. 添加缓存层(Redis)存储高频问题答案 2. 实现混合检索策略(BM25 + 向量检索) 3. 添加生成结果的事实性校验模块 4. 集成prompt模板管理系统 5. 添加API调用速率限制和负载监控
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值