3.RAG召回不准怎么办?Chunk策略+Prompt工程+引入Rerank提升检索质量+Top_k策略

张开发
2026/4/10 5:23:24 15 分钟阅读

分享文章

3.RAG召回不准怎么办?Chunk策略+Prompt工程+引入Rerank提升检索质量+Top_k策略
Chunk策略前面已经讲过RAG系统是基于知识和问题词嵌入向量间距离进行检索的系统。同时为了便于知识存储我们也用到了知识切片等一系列操作。代码如下defsplit_text(text,chunk_size100):chunks[]foriinrange(0,len(text),chunk_size):chunks.append(text[i:ichunk_size])returnchunks但是这里一开始有个坑不知道你们发现了没有通过这种方式截断的句子是被截断的句子前后不搭嘎。知识之间没有相关性会影响最终效果。所以今天咱们需要对这里的代码进行一定优化让被截断的chunk句子前后有一定的关联性defsplit_text(text,chunk_size200,overlap50):chunks[]foriinrange(0,len(text),chunk_size-overlap):chunks.append(text[i:ichunk_size])returnchunksPrompt工程messages[{role:system,content:You are a professional research paper analysis assistant. Answer based only on the provided context.},{role:user,content:context_for_llm\n\nquestionquestion}]前面咱们的Message是这样写的虽然可以得到结果但是结果比较随意咱们可以进行Prompt工程给大模型增加更多的约束条件这样可以使得输出的结果更规范。messages[{role:system,content:(You are a professional research assistant. Answer the question ONLY based on the provided context. If the answer is not in the context, say Not enough information. Provide a clear and concise summary.)},{role:user,content:f Context:{context_for_llm}Question:{question}Answer: }]引入Re-rank模型提升检索质量今天我们将会用到一个方法增强我们检索相关知识的质量这种方法叫做Re-rank检索增强本质上是将前面咱们找到的相关知识按照相关程度排个序按照相关性排好序的知识结合问题又会被送入大模型模型结合知识的相关程度回答问题检索的质量将会进一步提高。首先定义rerank函数defrerank(query,chunks):promptf You are a ranking assistant. Query:{query}Rank the following passages from most relevant to least relevant. Passages: fori,cinenumerate(chunks):promptf\n[{i}]{c}\nprompt\nReturn ONLY the indices in sorted order, like [2, 0, 1].responseclient.chat.completions.create(modeldeepseek-chat,messages[{role:user,content:prompt}])returnresponse.choices[0].message.content然后对我们前面检索到的相关知识进行排序relevant_chunksretrieve(question,k5)# rerank rank_resultrerank(question,relevant_chunks)print(Rerank result:,rank_result)deepseek得到的结果相关度由高到低知识的索引文本字符串可能像这样[4,2,3,5]所以要用ast将他们转化成为列表。importasttry:sorted_indicesast.literal_eval(rank_result)except:print(Rerank parse failed, fallback to original order)sorted_indiceslist(range(len(relevant_chunks)))当有了相关知识排序的列表就可以从选择最优的Chunk了同时将结果输入大模型#选最优chunktop_k2# 可以调2 或 3best_chunks[relevant_chunks[i]foriinsorted_indices[:top_k]]# 构建询问大模型的相关知识#context_for_llm \n.join(relevant_chunks)替换为下面的内容context_for_llm\n.join(best_chunks)如果这篇文章对你有帮助可以点个赞完整代码地址https://github.com/1186141415/A-Paper-Rag-Agent

更多文章