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
1214

被折叠的 条评论
为什么被折叠?



