DeepSeek:R1本地RAG 问答: 功能新增,附 六大关键技术优化路径参考

前一阵介绍的使用 DeepSeek-R1 部署的 7b 模型,在电脑本地进行 RAG 问答的简单演示项目,目前收获了 72 个 star,下方视频演示了下升级后的支持多文档上传和多轮问答的功能特性。

参考文章:

无需联网!DeepSeek-R1+本地化RAG,打造私有智能文档助手

视频链接:https://mp.weixin.qq.com/s/QdVAJRsvnecbgzXYJ0tMOQ

需要说明是,因为只是一个演示项目,大家在测试不同领域的专属文档问答时,效果不一定符合预期。

当前核心代码流程

根据个人有限经验,提供以下六个关键的技术优化路径供参考,各位可以根据具体的应用场景和资源限制,选择合适的优化方向进行实施。

优化后代码逻辑(基于六点优化建议)

每个优化点都可以独立实现和评估,建议先从影响最大的方向开始:

首先,优化文本分块策略和实现混合检索;
然后,添加 Re-ranking 机制;
最后,考虑引入知识图谱等更复杂的优化。

1、 文本分块优化

现有问题:目前使用的是固定大小的分块策略(chunk_size=800),这可能会切分到语义完整的段落

优化建议:

实现语义感知的分块策略,基于段落、章节等自然边界进行分割可以使用基于滑动窗口的动态分块引入重叠度自适应调整,对于语义密集的部分增加重叠

python 复制代码
# 示例:基于语义的分块策略
from langchain.text_splitter import SpacyTextSplitter
# 或使用更轻量的
from nltk.tokenize import sent_tokenize

def semantic_chunk(text):
    sentences = sent_tokenize(text)
    chunks = []
    current_chunk = []
    current_length = 0
    
    for sentence in sentences:
        if current_length + len(sentence) > 800:
            chunks.append(" ".join(current_chunk))
            current_chunk = [sentence]
            current_length = len(sentence)
        else:
            current_chunk.append(sentence)
            current_length += len(sentence)
    
    if current_chunk:
        chunks.append(" ".join(current_chunk))
    return chunks

2、检索增强

现有问题:目前只使用向量相似度检索,可能会遗漏一些语义相关但表达不同的内容

优化建议:

实现混合检索:结合关键词检索(BM25)和向量检索添加 Re-ranking 层:使用交叉编码器对检索结果重新排序引入 MMR(Maximum Marginal Relevance)降低结果冗余度

python 复制代码
from rank_bm25 import BM25Okapi
from sentence_transformers import CrossEncoder

def hybrid_search(query, documents, top_k=5):
    # BM25检索
    bm25 = BM25Okapi(documents)
    bm25_scores = bm25.get_scores(query)
    
    # 向量检索(你现有的方案)
    vector_results = COLLECTION.query(...)
    
    # 结果融合
    combined_results = combine_scores(bm25_scores, vector_results)
    
    # Cross-Encoder重排序
    cross_encoder = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
    reranked_results = cross_encoder.predict([(query, doc) for doc in combined_results])
    
    return sorted(zip(combined_results, reranked_results), key=lambda x: x[1], reverse=True)[:top_k]

3、知识图谱增强

现有问题:缺乏文档间的结构化关联信息

优化建议:

构建文档级知识图谱,捕获文档间的关系提取实体和关系,建立三元组知识库在检索时结合图谱关系进行扩展查询

python 复制代码
from spacy import displacy
import networkx as nx

def build_knowledge_graph():
    # 实体提取
    entities = extract_entities(documents)
    
    # 关系抽取
    relationships = extract_relationships(documents)
    
    # 构建图谱
    G = nx.Graph()
    for entity in entities:
        G.add_node(entity)
    for rel in relationships:
        G.add_edge(rel[0], rel[2], relation=rel[1])
    
    return G

def graph_enhanced_search(query, graph):
    # 基于图谱进行查询扩展
    related_entities = get_related_entities(query, graph)
    expanded_query = expand_query(query, related_entities)
    return search(expanded_query)

4、上下文优化

现有问题:检索的上下文可能不完整或包含无关信息

优化建议:

实现动态上下文窗口添加上下文相关性打分引入文档结构感知的上下文选择

python 复制代码
def optimize_context(query, retrieved_chunks):
    # 计算每个chunk的相关性分数
    relevance_scores = calculate_relevance(query, retrieved_chunks)
    
    # 动态调整上下文窗口
    window_size = adaptive_window_size(relevance_scores)
    
    # 合并相邻的相关chunk
    merged_context = merge_relevant_chunks(retrieved_chunks, window_size)
    
    return merged_context

5、查询优化

现有问题:用户查询可能不够精确或存在歧义

优化建议:

实现查询改写和扩展添加查询意图识别引入查询建议机制

python 复制代码
def optimize_query(original_query):
    # 查询意图识别
    intent = classify_intent(original_query)
    
    # 查询改写
    rewritten_query = rewrite_query(original_query, intent)
    
    # 查询扩展
    expanded_query = expand_query(rewritten_query)
    
    return expanded_query

6、评估与监控

现有问题:缺乏系统性能的评估指标

优化建议:

建立检索质量评估指标(MRR, NDCG 等)实现答案质量评估添加用户反馈机制

python 复制代码
def evaluate_system(queries, ground_truth):
    metrics = {
        'mrr': calculate_mrr(queries, ground_truth),
        'ndcg': calculate_ndcg(queries, ground_truth),
        'precision': calculate_precision(queries, ground_truth)
    }
    return metrics

(完)

相关推荐
小马同学-9 小时前
mysql数据库原理
数据库·mysql
东方护航数据恢复(深圳)10 小时前
政务信创案例:达梦 DM8 数据库掉电页损坏,48 小时修复实录【东方护航数据恢复深圳店】
数据库·数据恢复·it运维·服务器数据恢复·二次开盘·硬盘开盘
AC赳赳老秦11 小时前
OpenClaw 数据引用规范自动生成:为公开数据构建可信来源标注与标准引用体系
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
小蒜学长11 小时前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站
布莱克60512 小时前
MySQL 增删改查(CRUD)语法详解
数据库·mysql·增删改查
Dovis(誓平步青云)12 小时前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化
2501_9336707913 小时前
2027届大数据管理与应用求职数字化转型顾问:项目、SQL、业务理解怎么排优先级
数据库·sql
东方护航数据恢复(深圳)14 小时前
物流案例:勒索病毒 Mallox 加密 ERP 数据库,旧备份 + 残留页重组实录【东方护航数据恢复深圳店】
数据库·数据恢复·勒索病毒·二次开盘·开盘·数据镜像
.Hypocritical.14 小时前
Redis从入门到实战:核心原理、场景落地与避坑指南
数据库·redis·缓存
梦想画家14 小时前
SQLMesh Python 模型入门(二):依赖管理、引擎实战与内存优化
数据库·python·sqlmesh