RAG知识增强系统3 -检索器上下文压缩和调优

1.检索器上下文压缩

此处我们会引入组件 LLMChainExtractor

LLMChainExtractor 是 LangChain 框架中用于文档压缩与关键信息提取的组件,主要功能是从大量文本中智能提取与查询关键词相关的核心内容。 ‌

核心用途

LLMChainExtractor通过大语言模型(LLM)的语义理解能力,自动筛选并提取文本中的关键信息片段。例如,在法律领域可快速定位合同中的违约金条款、赔偿条款等关键内容;在知识问答场景中,能提炼出与企业业务相关的有效信息。

然后组合到上下文中去,提问大模型,从而得出优质的答案

1.1 没优化前

from langchain_community.document_loaders import TextLoader

from langchain_community.vectorstores import FAISS

from langchain_openai import OpenAIEmbeddings

from langchain_text_splitters import CharacterTextSplitter



documents = TextLoader("test.txt",encoding="utf-8").load()

text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)

texts = text_splitter.split_documents(documents)

retriever = FAISS.from_documents(texts, embeddings_model).as_retriever()



docs = retriever.invoke("如何进行模型部署")

pretty_print_docs(docs)

输出:

Document 1:



结论、局限性和未来方向

DeepSeek-V3 是一款性能强大且成本效益高的开源大型语言模型,它在推理和生成任务中都取得了显著的成果。DeepSeek-V3 的训练成本非常低,只需 2.788M H800 GPU 小时即可完成其全部训练,包括预训练、上下文长度扩展和后训练。



尽管 DeepSeek-V3 在性能和效率方面取得了显著成果,但它仍然存在一些局限性,尤其是在部署方面。DeepSeek-V3 的推荐部署单元相对较大,这可能对小型团队构成负担。此外,尽管 DeepSeek-V3 的部署策略已经实现了比 DeepSeek-V2 高两倍的端到端生成速度,但仍然存在进一步提升的空间。



DeepSeek-V3 开发了创新的负载平衡策略和训练目标,以实现高效训练。它还引入了 FP8 训练和一系列高效的工程优化措施,以进一步降低训练成本。

DeepSeek-V3 还在后训练阶段取得了成功,通过知识蒸馏和强化学习技术,显著提高了其在数学和代码基准测试中的性能。

DeepSeek-V3 在一系列基准测试中取得了最强大的性能,尤其是在数学、代码和长上下文理解任务上。

DeepSeek-V3 的局限性主要在于部署方面,包括较大的部署单元和潜在的性能提升空间。

DeepSeek-V3 采用了宪法 AI (constitutional AI) 方法,利用 DeepSeek-V3 自身的投票评估结果作为反馈来源,进一步提高了其在主观评估中的性能。

DeepSeek-V3 中的多 token 预测技术可以显著加速模型的解码速度,而额外的预测 token 的接受率在 85% 到 90% 之间,这表明其具有高度的可靠性。

DeepSeek 持续致力于开源模型的道路,并计划在未来进行以下方面的研究:

----------------------------------------------------------------------------------------------------

Document 2:



数据构建

预训练语料库经过优化,数学和编程样本的比例更高,并扩展了多语言覆盖范围,包括英语和中文。数据处理流程也得到了改进,以减少冗余并保持语料库的多样性。



超参数设置

DeepSeek-V3 的超参数包括 Transformer 层数、隐藏维度、注意力头数、每头维度、KV 压缩维度、查询压缩维度、RoPE 维度、MoE 层数、共享专家数量、路由专家数量、中间隐藏维度、激活专家数量、节点限制路由数量、多 token 预测深度、学习率、批大小等。





长上下文扩展

...



论文地址:https://github.com/deepseek-ai/DeepSeek-V3/blob/main/DeepSeek_V3.pdf



以下为技术解读:

Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...

1.2 优化后

from langchain.retrievers import ContextualCompressionRetriever

from langchain.retrievers.document_compressors import LLMChainExtractor



compressor = LLMChainExtractor.from_llm(llm)

compression_retriever = ContextualCompressionRetriever(

    base_compressor=compressor, base_retriever=retriever

)



compressed_docs = compression_retriever.invoke(

   "如何进行部署"

)

pretty_print_docs(compressed_docs)

输出:

Document 1:

针对金融、法律等高合规需求场景,Dify 提供 本地私有化部署 DeepSeek + Dify,支持 DeepSeek 模型与 Dify 平台同步部署至内网

若提示链接无法访问,你也可以考虑在本地部署 DeepSeek 模型。详细说明请参考 本地部署指南
----------------------------------------------------------------------------------------------------
Document 2:

>>>  
3.2 将知识库集成至 AI 应用  
在 AI 应用的"上下文"内添加知识库,在对话框内输入相关问题。LLM 将首先从知识库内获取与问题相关上下文,在此基础上进行总结并给出更高质量的回答。  

4. 分享 AI 应用  
构建完成后,你可以将该 AI 应用分享给他人使用或集成至其它网站内。  
>>>

可以看到这里精简了很多

2调休-排序

由于嵌入模型普遍存在  lost in middle的问题, 即最相关的文档碎片会排在头和尾。所以我们有必要把文档碎片重新排序。并设置到大模型中去提问。从而得出优质的答案

from langchain_core.vectorstores import InMemoryVectorStore



texts = [

   "西湖是杭州著名的旅游景点。",

   "我最喜欢的歌曲是《月亮代表我的心》。",

   "故宫是北京最著名的古迹之一。",

   "这是一篇关于北京故宫历史的文档。",

   "我非常喜欢去电影院看电影。",

   "北京故宫的藏品数量超过一百万件。",

   "这只是一段随机文本。",

   "《三国演义》是中国四大名著之一。",

   "紫禁城是故宫的别称,位于北京。",

   "故宫博物院每年接待游客数百万人次。",

]



# 创建检索器

retriever = InMemoryVectorStore.from_texts(texts, embedding=embeddings_model).as_retriever(

    search_kwargs={"k": 10}

)

query = "请告诉我关于故宫的信息?"



# 获取按相关性排序的文档

docs = retriever.invoke(query)

for doc in docs:

   print(f"- {doc.page_content}")

调优后:(加入下面这段代码)

# 重新排序文档:
# 相关性较低的文档将位于列表中间
# 相关性较高的文档将位于开头和结尾
reordering = LongContextReorder()
reordered_docs = reordering.transform_documents(docs)

# 确认相关性高的文档位于开头和结尾
for doc in reordered_docs:
    print(f"- {doc.page_content}")

输出:

- 故宫是北京最著名的古迹之一。

- 西湖是杭州著名的旅游景点。

- 故宫博物院每年接待游客数百万人次。

- 紫禁城是故宫的别称,位于北京。

- 我非常喜欢去电影院看电影。

- 《三国演义》是中国四大名著之一。

- 北京故宫的藏品数量超过一百万件。

- 我最喜欢的歌曲是《月亮代表我的心》。

- 这只是一段随机文本。

- 这是一篇关于北京故宫历史的文档。

整合到大模型中去提问

from langchain.chains.combine_documents import create_stuff_documents_chain

from langchain_core.prompts import PromptTemplate

from langchain_openai import ChatOpenAI



prompt_template = """

Given these texts:

-----

{context}

-----

Please answer the following question:

{query}

"""



prompt = PromptTemplate(

    template=prompt_template,

    input_variables=["context", "query"],

)



# Create and invoke the chain:

chain = create_stuff_documents_chain(llm, prompt)

response = chain.invoke({"context": reordered_docs, "query": query})

print(response)

输出:

故宫,又称紫禁城,位于北京,是中国最著名的古迹之一。以下是关于故宫的关键信息:



1. **历史地位**  

  故宫是明清两代的皇家宫殿(1420-1912年),现为故宫博物院,是中国古代宫廷建筑的杰出代表。



2. **规模与藏品**  

   - 占地面积约72万平方米,拥有大量珍贵文物。  

   - 藏品数量超过一百万件,涵盖书画、陶瓷、青铜器等类别。



3. **旅游热度**  

  每年接待游客数百万人次,是世界参观人数最多的博物馆之一。



4. **建筑特色**  

  以中轴线布局的宫殿群体现中国传统建筑美学,"紫禁城"之名源于古代天象崇拜。



5. **文化意义**  

  被联合国教科文组织列为世界文化遗产(1987年),是中国历史文化的重要象征。



如需更详细的历史或建筑细节,可进一步说明。

3 根据相似性分数检索

results = vector_store.similarity_search_with_score(
    "Will it be hot tomorrow?", k=1, filter={"source": "news"}
)
for res, score in results:
    print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")

输出:

* [SIM=0.837352] Robbers broke into the city bank and stole $1 million in cash. [{'source': 'news'}]

这里 1是最高评分。

当然了我们可以在文档碎片和向量化的时候,给文档评分

from typing import List

from langchain_core.documents import Document
from langchain_core.runnables import chain


@chain
def retriever(query: str) -> List[Document]:
    docs, scores = zip(*vector_store.similarity_search_with_score(query))
    for doc, score in zip(docs, scores):
        doc.metadata["score"] = score

    return docs

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿John

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值