当前位置: 首页 > article >正文

变相提高大模型上下文长度-RAG文档压缩-1.常识

前言

之前遇到一个问题,公司大模型的长度不长,而且业务需要RAG返回不少的相关内容。通常RAG都是取top-10/15,文档由于长度限制不能太多,加上embedding效果不佳,返回的文档不多也不能保证都相关。

我们考虑到返回的文档中真正能被用于求解的文本可能只占总文本的一部分,其他无关部分只会影响大模型,而且会占用上下文长度。

因此我们对RAG文档进行问题相关的总计/query-focused summarization,一方面可以过滤无关内容,另一方面让文本更助于大模型回答问题。此外,同样的top-k设置下,过滤压缩后上下文长度变短了,可以倍数增长top-k,即使总结会有些信息损失,更多的文档可以弥补这方面。

这个文章只介绍基础的总结技术,代码基于langchain实现。

文档摘要的核心原则

在构建摘要生成器时,一个核心问题是:如何将文档呈现给 LLM 的上下文窗口?

主要方法包括:

  1. Stuff(完整输入)
    直接将整个文档一次性放入上下文窗口。方法简单,但在处理长文档时受限。

  2. Map-Reduce(分块合并)
    将文档拆分为多个小块,分别对每个部分进行摘要,然后合并各部分摘要得到最终结果。适用于处理大规模数据集。

  3. Refine(逐步优化)
    按顺序处理文档,并在摘要过程中不断融合先前的摘要和新内容,从而逐步优化总结结果。适用于需要更精细摘要的场景。

import os
import json
from langchain_core.documents import Documentdata = []
file_path = './data/data_100.json'
with open(file_path) as f:for line in f:a_record = json.loads(line)data.append(a_record)print(len(data))data_indice = 0
a_query = data[data_indice]['query']
a_docs = data[data_indice]['pos']
a_docs = [Document(item) for item in a_docs]
100

Stuff

它将一组文档直接插入提示(prompt),然后将该提示发送给 LLM。
该方法适用于文档较小、且每次调用仅需处理少量文档的应用场景。

from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParserprompt = PromptTemplate(input_variables=["context", "query"],template=("请清晰简明地总结以下文本以回答问题。\n\n"  "在总结时,请注意以下几点:\n"  "- 包含关键事件、重要事实和核心信息。\n"  "- 省略不必要的细节。\n\n"  "[问题-开始]:\n{query}\n[问题-结束]\n\n""[需要总结的文本-开始]:\n{context}\n[需要总结的文本-结束]\n"  "摘要:"))llm = ChatOpenAI(base_url='http://localhost:5551/v1',api_key='EMPTY',model_name='Qwen2.5-7B-Instruct',temperature=0.2,
)output_parser = StrOutputParser()map_chain = prompt | llm | output_parser
result = map_chain.invoke({"query":a_query,"context":'\n'.join([item.page_content for item in a_docs])}
)print(a_query)
print(20*'=')
print(result)
澳大利亚新任外长黄英贤近日访问了哪个国家,他的目的是什么?
====================
澳大利亚新任外长黄英贤访问了所罗门群岛,目的是加强澳大利亚与太平洋国家的安全合作,并强调澳大利亚在该地区的存在感。黄英贤与所罗门群岛总理索加瓦雷进行了会谈,强调了澳大利亚警方在该国骚乱后的援助,并表示澳大利亚不会在所罗门群岛建立军事基地。黄英贤的访问正值中国与所罗门群岛签署安全协议引发地区关切之际,澳大利亚、新西兰和美国等国也在该地区采取行动,试图抗衡中国在太平洋地区的影响力。

事实上既然直接 stuff 的话, 不一点需要先总结再回答, 可以直接回答问题。
在我看来, stuff 可以算作一个 CoT 环节, 先显示找出相关内容, 再求解问题

Map-Reduce

Map-Reduce 摘要是一种有效的长文档压缩技术,主要包含两个阶段:

  1. Map 阶段:将文档拆分为多个小块,并对每个部分独立生成摘要。
  2. Reduce 阶段:将各个部分的摘要合并,形成连贯的最终摘要。

该方法在处理超长文档时尤为有用,因为它允许在 Map 阶段对各个块并行处理,从而提高效率。此外,它还能有效规避语言模型的 token 限制,确保每个文本块都能适应模型的上下文窗口。

Map 阶段

在 Map 阶段,通常对每个文本块进行摘要生成。

标准方法是对每个块的内容进行总结,但另一种替代方式是提取关键信息。
由于 Reduce 阶段最终会将所有输出合并为最终摘要,因此这两种方法通常都能有效完成任务,并且对最终结果的影响较小。

在 Map 阶段选择摘要生成还是关键信息提取,可以根据具体任务的目标和需求进行调整。

import asyncio
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate# 定义输出格式
class MapSummary(BaseModel):reasoning: str = Field(description="关于问题、文本内容、两者之间关联性的思考")summary: str = Field(description="对文本中与问题相关片段的内容总结")# 创建解析器
map_parser = PydanticOutputParser(pydantic_object=MapSummary)# 创建模板
map_prompt = ChatPromptTemplate.from_messages([# role, message("system", "你是一名专业的内容提取和总结专家。"),("human", ("请清晰简明地总结以下文本以回答问题。\n\n"  "在总结时,请注意以下几点:\n" "- 你的任务是总结问题相关的文本,而不是回答问题。" "- 包含关键事件、重要事实和核心信息。\n"  "- 省略不必要的细节。\n\n"  "按以下格式要求输出:\n{format_instructions}\n\n""[问题-开始]:\n{query}\n[问题-结束]\n\n""[需要总结的文本-开始]:\n{context}\n[需要总结的文本-结束]\n"  )),]
)# 固定输出格式指令
map_prompt = map_prompt.partial(format_instructions=map_parser.get_format_instructions())llm = ChatOpenAI(base_url='http://localhost:5551/v1',api_key='EMPTY',model_name='Qwen2.5-7B-Instruct',temperature=0.2,
)map_chain = map_prompt | llm | map_parsermap_prompt.pretty_print()
================================[1m System Message [0m================================你是一名专业的内容提取和总结专家。================================[1m Human Message [0m=================================请清晰简明地总结以下文本以回答问题。在总结时,请注意以下几点:
- 你的任务是总结问题相关的文本,而不是回答问题。- 包含关键事件、重要事实和核心信息。
- 省略不必要的细节。按以下格式要求输出:
[33;1m[1;3m{format_instructions}[0m[问题-开始]:
[33;1m[1;3m{query}[0m
[问题-结束][需要总结的文本-开始]:
[33;1m[1;3m{context}[0m
[需要总结的文本-结束]
摘要:
# 并行运行所有任务
tasks = [map_chain.ainvoke({"query":a_query,"context":doc.page_content,})for doc in a_docs
]map_results = await asyncio.gather(*tasks)
map_results
[MapSummary(think='文本主要讨论了澳大利亚外长黄英贤访问所罗门群岛的背景和目的,以及美国与马绍尔群岛的经济援助谈判,但未直接回答黄英贤访问的具体国家和目的。', summary='澳大利亚外长黄英贤访问了所罗门群岛,强调了澳大利亚对所罗门群岛的援助,并与总理讨论了安全问题。美国与马绍尔群岛就经济援助进行谈判,以应对中国在太平洋地区的影响力增强。'),MapSummary(think='文本主要描述了澳大利亚新任外长黄英贤访问萨摩亚和汤加的目的,以及美日等国在南太平洋的动作,意图抗衡中国的影响力。', summary='澳大利亚新任外长黄英贤访问萨摩亚和汤加,旨在加强与太平洋国家的安全合作。此前,美日等国也在南太平洋频繁活动,意图抗衡中国在该地区的影响力。'),MapSummary(think='文本主要报道了澳大利亚外长黄英贤访问中国的背景、目的以及外界对此的评价。', summary='澳大利亚外长黄英贤于12月20日至21日对中国进行访问,这是澳中建交50周年之际,黄英贤四年多来首次访华。多家外媒认为此访标志着中澳关系迈出重要一步,有助于推进共同利益和管控分歧。'),MapSummary(think='文本主要讲述了澳大利亚新任外长黄英贤访问中国的目的和背景,以及专家对此的解读。', summary='澳大利亚外长黄英贤访问中国,旨在推动贸易限制措施的取消,并寻求与中国的稳定平等伙伴关系。澳专家认为,这是澳大利亚抓住与中国关系解冻的机会,但中澳关系回暖仍面临美国的影响。')]

Reduce 阶段

Reduce Chain 中,对 Map 阶段生成的结果进行进一步处理,以合并和优化内容,最终生成连贯的摘要。

class ReduceSummary(BaseModel):reasoning: str = Field(description="关于问题与局部内容总结的思考")summary: str = Field(description="整合局部内容总结的全局总结")reduce_parser = PydanticOutputParser(pydantic_object=ReduceSummary)reduce_prompt = ChatPromptTemplate.from_messages([# role, message("system", "你是一名专业的摘要专家。你将收到一组文档摘要,并需要将其整合为一个完整的摘要。"),("human", ("请将以下局部的总结内容整合,形成一个完整的内容摘要,以作为参考材料回答问题。\n\n"  "在总结时,请注意以下几点:\n" "- 你的任务是总结问题相关的文本,而不是回答问题。" "- 包含关键事件、重要事实和核心信息。\n"  "- 省略不必要的细节。\n"  "- 去除重复冗余内容,使语言更加简洁和凝练。\n\n""按以下格式要求输出:\n{format_instructions}\n\n"# "[问题-开始]:\n{query}\n[问题-结束]\n\n""[局部内容总结-开始]:\n{map_summary}\n[局部内容总结-结束]\n"  )),]
)reduce_prompt = reduce_prompt.partial(format_instructions=reduce_parser.get_format_instructions())llm = ChatOpenAI(base_url='http://localhost:5551/v1',api_key='EMPTY',model_name='Qwen2.5-7B-Instruct',temperature=0.2,
)reduce_chain = reduce_prompt | llm | reduce_parser
reduce_prompt.pretty_print()
reduce_result = reduce_chain.invoke({"query":a_query,"map_summary": '\n'.join([f'- {item.summary}' for item in map_results])}
)
print(reduce_result.summary)
澳大利亚外长黄英贤频繁访问太平洋国家,强调安全合作并应对中国影响力。同时,黄英贤访问中国,推动贸易限制措施取消,寻求稳定平等的伙伴关系,但美国的影响仍存。
print(reduce_prompt.invoke({"query":a_query,"map_summary": '\n'.join([f'- {item.summary}' for item in map_results])}
).to_messages()[-1].content)
请将以下局部的总结内容整合,形成一个完整的内容摘要,以作为参考材料回答问题。在总结时,请注意以下几点:
- 你的任务是总结问题相关的文本,而不是回答问题。- 包含关键事件、重要事实和核心信息。
- 省略不必要的细节。
- 去除重复冗余内容,使语言更加简洁和凝练。按以下格式要求输出:
The output should be formatted as a JSON instance that conforms to the JSON schema below.As an example, for the schema {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]}
the object {"foo": ["bar", "baz"]} is a well-formatted instance of the schema. The object {"properties": {"foo": ["bar", "baz"]}} is not well-formatted.Here is the output schema:
```
{"properties": {"think": {"description": "关于问题与局部内容总结的思考", "title": "Think", "type": "string"}, "summary": {"description": "整合局部内容总结的全局总结", "title": "Summary", "type": "string"}}, "required": ["think", "summary"]}
```[局部内容总结-开始]:
- 澳大利亚外长黄英贤访问了所罗门群岛,强调了澳大利亚对所罗门群岛的援助,并与总理讨论了安全问题。美国与马绍尔群岛就经济援助进行谈判,以应对中国在太平洋地区的影响力增强。
- 澳大利亚新任外长黄英贤访问萨摩亚和汤加,旨在加强与太平洋国家的安全合作。此前,美日等国也在南太平洋频繁活动,意图抗衡中国在该地区的影响力。
- 澳大利亚外长黄英贤于12月20日至21日对中国进行访问,这是澳中建交50周年之际,黄英贤四年多来首次访华。多家外媒认为此访标志着中澳关系迈出重要一步,有助于推进共同利益和管控分歧。
- 澳大利亚外长黄英贤访问中国,旨在推动贸易限制措施的取消,并寻求与中国的稳定平等伙伴关系。澳专家认为,这是澳大利亚抓住与中国关系解冻的机会,但中澳关系回暖仍面临美国的影响。
[局部内容总结-结束]
摘要:

关于是否在reduce阶段附加query的思考


在这个阶段里, prompt里可以不附加query, 因为map阶段已经过滤内容了, 此阶段只需要整合。
但最好附上query, 不然可能会出现把需要的内容给整合漏了的情况。
以下是一个例子,map阶段内容还很具体,但reduce过于简洁,以致于如果换了具体的问题,就可能无法求解了。

query

澳大利亚新任外长黄英贤近日访问了哪个国家,他的目的是什么?

map结果

- 澳大利亚外长黄英贤访问了所罗门群岛,强调了澳大利亚对所罗门群岛的援助,并与总理讨论了安全问题。美国与马绍尔群岛就经济援助进行谈判,以应对中国在太平洋地区的影响力增强。
- 澳大利亚新任外长黄英贤访问萨摩亚和汤加,旨在加强与太平洋国家的安全合作。此前,美日等国也在南太平洋频繁活动,意图抗衡中国在该地区的影响力。
- 澳大利亚外长黄英贤于12月20日至21日对中国进行访问,这是澳中建交50周年之际,黄英贤四年多来首次访华。多家外媒认为此访标志着中澳关系迈出重要一步,有助于推进共同利益和管控分歧。
- 澳大利亚外长黄英贤访问中国,旨在推动贸易限制措施的取消,并寻求与中国的稳定平等伙伴关系。澳专家认为,这是澳大利亚抓住与中国关系解冻的机会,但中澳关系回暖仍面临美国的影响。

reduce结果

澳大利亚外长黄英贤频繁访问太平洋国家,强调安全合作并应对中国影响力。同时,黄英贤访问中国,推动贸易限制措施取消,寻求稳定平等的伙伴关系,但美国的影响仍存。

Map-Reduce Chain 的完整流程

import asyncio
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate# ===== map =====class MapSummary(BaseModel):reasoning: str = Field(description="关于问题、文本内容、两者之间关联性的思考")summary: str = Field(description="对文本中与问题相关片段的内容总结")map_parser = PydanticOutputParser(pydantic_object=MapSummary)map_prompt = ChatPromptTemplate.from_messages([# role, message("system", "你是一名专业的内容提取和总结专家。"),("human", ("请清晰简明地总结以下文本以回答问题。\n\n"  "在总结时,请注意以下几点:\n" "- 你的任务是总结问题相关的文本,而不是回答问题。" "- 包含关键事件、重要事实和核心信息。\n"  "- 省略不必要的细节。\n\n"  "按以下格式要求输出:\n{format_instructions}\n\n""[问题-开始]:\n{query}\n[问题-结束]\n\n""[需要总结的文本-开始]:\n{context}\n[需要总结的文本-结束]\n" )),]
)map_prompt = map_prompt.partial(format_instructions=map_parser.get_format_instructions())llm = ChatOpenAI(base_url='http://localhost:5551/v1',api_key='EMPTY',model_name='Qwen2.5-7B-Instruct',temperature=0.2,
)map_chain = map_prompt | llm | map_parser# ===== reduce =====class ReduceSummary(BaseModel):reasoning: str = Field(description="关于问题与局部内容总结的思考")summary: str = Field(description="整合局部内容总结的全局总结")reduce_parser = PydanticOutputParser(pydantic_object=ReduceSummary)reduce_prompt = ChatPromptTemplate.from_messages([# role, message("system", "你是一名专业的摘要专家。你将收到一组文档摘要,并需要将其整合为一个完整的摘要。"),("human", ("请将以下局部的总结内容整合,形成一个完整的内容摘要,以作为参考材料回答问题。\n\n"  "在总结时,请注意以下几点:\n" "- 你的任务是总结问题相关的文本,而不是回答问题。" "- 包含关键事件、重要事实和核心信息。\n"  "- 省略不必要的细节。\n"  "- 去除重复冗余内容,使语言更加简洁和凝练。\n\n""按以下格式要求输出:\n{format_instructions}\n\n"# "[问题-开始]:\n{query}\n[问题-结束]\n\n""[局部内容总结-开始]:\n{map_summary}\n[局部内容总结-结束]\n" )),]
)reduce_prompt = reduce_prompt.partial(format_instructions=reduce_parser.get_format_instructions())llm = ChatOpenAI(base_url='http://localhost:5551/v1',api_key='EMPTY',model_name='Qwen2.5-7B-Instruct',temperature=0.2,
)reduce_chain = reduce_prompt | llm | reduce_parserasync def map_reduce_chain(query, docs):tasks = [map_chain.ainvoke({"query":a_query,"context":doc.page_content,})for doc in a_docs]map_results = await asyncio.gather(*tasks)reduce_result = reduce_chain.invoke({"query":a_query,"map_summary": '\n'.join([f'- {item.summary}' for item in map_results])})return reduce_resultresult = await map_reduce_chain(a_query, a_docs)
print(result.summary)
澳大利亚外长黄英贤访问所罗门群岛、萨摩亚、汤加及中国,旨在加强教育、医疗援助、安全合作,并推动贸易限制措施的取消,重建与中国的友好关系。此访问具有重大象征意义,标志着澳中关系改善的积极信号,但美国可能成为关系改善的障碍。

Map-Refine

Map-Refine 方法是一种文档摘要处理方式,类似于 Map-Reduce,但在摘要的处理和合并方式上有所不同。

  1. Map 阶段
  • 将文档拆分为多个小块。
  • 独立对每个块进行摘要。
  1. Refine 阶段
  • 生成的摘要按顺序进行处理。
  • 每次迭代时,将上一次的摘要与下一个文本块的信息结合,对摘要进行更新和优化。
  1. 迭代过程
  • Refine 阶段会持续迭代,直到所有文本块都处理完毕。
  • 每次迭代都会在保留已有信息的基础上,进一步完善摘要。
  1. 最终摘要
  • 所有文本块处理完成后,最终摘要将在最后一次优化步骤后生成。

主要优势:

  • 保持文档顺序:适用于需要保持原始内容顺序的情况,如叙述性或结构化文档。
  • 上下文优化:摘要在每个步骤都会逐步完善,适用于需要递进式构建背景信息的内容。

局限性:

  • 顺序处理:Refine 阶段需要按顺序执行,难以并行化。
  • 时间成本较高:相比 Map-Reduce,由于无法并行处理,大规模数据处理可能较慢。

Map 阶段

和 Map-Reduce 同样

import asyncio
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate# 定义输出格式
class MapSummary(BaseModel):reasoning: str = Field(description="关于问题、文本内容、两者之间关联性的思考")summary: str = Field(description="对文本中与问题相关片段的内容总结")# 创建解析器
map_parser = PydanticOutputParser(pydantic_object=MapSummary)# 创建模板
map_prompt = ChatPromptTemplate.from_messages([# role, message("system", "你是一名专业的内容提取和总结专家。"),("human", ("请清晰简明地总结以下文本以回答问题。\n\n"  "在总结时,请注意以下几点:\n" "- 你的任务是总结问题相关的文本,而不是回答问题。" "- 包含关键事件、重要事实和核心信息。\n"  "- 省略不必要的细节。\n\n"  "按以下格式要求输出:\n{format_instructions}\n\n""[问题-开始]:\n{query}\n[问题-结束]\n\n""[需要总结的文本-开始]:\n{context}\n[需要总结的文本-结束]\n"  )),]
)# 固定输出格式指令
map_prompt = map_prompt.partial(format_instructions=map_parser.get_format_instructions())llm = ChatOpenAI(base_url='http://localhost:5551/v1',api_key='EMPTY',model_name='Qwen2.5-7B-Instruct',temperature=0.2,
)map_chain = map_prompt | llm | map_parsermap_prompt.pretty_print()
================================[1m System Message [0m================================你是一名专业的内容提取和总结专家。================================[1m Human Message [0m=================================请清晰简明地总结以下文本以回答问题。在总结时,请注意以下几点:
- 你的任务是总结问题相关的文本,而不是回答问题。- 包含关键事件、重要事实和核心信息。
- 省略不必要的细节。按以下格式要求输出:
[33;1m[1;3m{format_instructions}[0m[问题-开始]:
[33;1m[1;3m{query}[0m
[问题-结束][需要总结的文本-开始]:
[33;1m[1;3m{context}[0m
[需要总结的文本-结束]
# 并行运行所有任务
tasks = [map_chain.ainvoke({"query":a_query,"context":doc.page_content,})for doc in a_docs
]map_results = await asyncio.gather(*tasks)
map_results
[MapSummary(reasoning='文本主要描述了澳大利亚外长黄英贤访问所罗门群岛的情况,以及访问的目的和背景。虽然文本中提到了澳大利亚对所罗门群岛的援助,但未明确提及黄英贤访问的具体目的。', summary='澳大利亚外长黄英贤访问了所罗门群岛,强调了澳大利亚对所罗门群岛的教育、医疗援助以及当地骚乱后的恢复工作。访问期间,黄英贤与所罗门群岛总理索加瓦雷进行了会谈,讨论了安全问题。'),MapSummary(reasoning='文本主要描述了澳大利亚新任外长黄英贤访问萨摩亚和汤加的目的,以及澳大利亚与其他国家在南太平洋地区的活动,旨在抗衡中国在该地区的影响力。', summary='澳大利亚新任外长黄英贤访问萨摩亚和汤加,目的是加强澳大利亚与太平洋国家的安全合作,抗衡中国在南太平洋的影响力。'),MapSummary(reasoning='文本主要报道了澳大利亚外长黄英贤访问中国的事件,包括访问的目的和背景,以及多家媒体对此的报道和评论。', summary='澳大利亚外长黄英贤于12月20日至21日对中国进行访问,这是澳中建交50周年之际,四年多来首次访华。多家媒体认为此访标志着中澳关系迈出重要一步,有助于推进共同利益和管控分歧。'),MapSummary(reasoning='文本主要介绍了澳大利亚外长黄英贤访华的目的和背景,以及此次访问的意义。文章提到了澳中关系的现状和未来可能的发展方向。', summary='澳大利亚外长黄英贤访问中国,旨在推动贸易限制措施的取消,并寻求与中国的稳定平等伙伴关系。此次访问被视为中澳关系解冻的重要时刻,但双方仍面临一些棘手问题,未来关系回暖仍面临美国的影响。')]

Refine 阶段

Refine 阶段,Map 阶段生成的文本块会按顺序依次处理,每次迭代都会逐步优化最终摘要。
摘要的更新方式是将上一轮的摘要与下一个文本块的信息结合,从而确保最终摘要更加全面且符合上下文逻辑。

class RefineSummary(BaseModel):reasoning: str = Field(description="关于问题与局部内容总结的思考")summary: str = Field(description="整合局部内容总结的全局总结")refine_parser = PydanticOutputParser(pydantic_object=RefineSummary)refine_prompt = ChatPromptTemplate.from_messages([# role, message("system", "你是一名专业的摘要专家。你的任务是生成一个最终的内容总结。"),("human", ("我提供你一份当前的总结,和一份新文本,你需要结合两者,精炼出一份新的总结,以作为参考材料回答问题。\n\n""在总结时,请注意以下几点:\n" "- 你的任务是总结问题相关的文本,而不是回答问题。" "- 包含关键事件、重要事实和核心信息。\n"  "- 省略不必要的细节。\n"  "- 去除重复冗余内容,使语言更加简洁和凝练。\n\n""按以下格式要求输出:\n{format_instructions}\n\n""[问题-开始]:\n{query}\n[问题-结束]\n\n""[当前内容总结-开始]:\n{previous_summary}\n[当前内容总结-结束]\n\n""[新文本-开始]:\n{current_summary}\n[新文本-结束]\n"  )),]
)refine_prompt = refine_prompt.partial(format_instructions=refine_parser.get_format_instructions())llm = ChatOpenAI(base_url='http://localhost:5551/v1',api_key='EMPTY',model_name='Qwen2.5-7B-Instruct',temperature=0.2,
)refine_chain = refine_prompt | llm | refine_parser
refine_prompt.pretty_print()
================================[1m System Message [0m================================你是一名专业的摘要专家。你的任务是生成一个最终的内容总结。================================[1m Human Message [0m=================================我提供你一份当前的总结,和一份新文本,你需要结合两者,精炼出一份新的总结,以作为参考材料回答问题。在总结时,请注意以下几点:
- 你的任务是总结问题相关的文本,而不是回答问题。- 包含关键事件、重要事实和核心信息。
- 省略不必要的细节。
- 去除重复冗余内容,使语言更加简洁和凝练。按以下格式要求输出:
[33;1m[1;3m{format_instructions}[0m[问题-开始]:
[33;1m[1;3m{query}[0m
[问题-结束][当前内容总结-开始]:
[33;1m[1;3m{previous_summary}[0m
[当前内容总结-结束][新文本-开始]:
[33;1m[1;3m{current_summary}[0m
[新文本-结束]
previous_summary = map_results[0].summaryfor item in map_results[1:]:refine_result = refine_chain.invoke({"query":a_query,"previous_summary":previous_summary,"current_summary":item.summary,})previous_summary = refine_result.summaryprint('='*20)print(previous_summary)
====================
澳大利亚新任外长黄英贤访问萨摩亚和汤加,旨在加强与太平洋国家的安全合作,抗衡中国在南太平洋的影响力。访问期间,黄英贤还与所罗门群岛总理讨论了安全问题并提供了援助。
====================
澳大利亚新任外长黄英贤分别访问了萨摩亚、汤加和中国。他对萨摩亚和汤加的访问旨在加强与太平洋国家的安全合作,抗衡中国在南太平洋的影响力。同时,黄英贤对中国进行访问,这是澳中建交50周年之际,四年多来首次访华,标志着中澳关系迈出重要一步。
====================
澳大利亚新任外长黄英贤访问了萨摩亚、汤加和中国。他对萨摩亚和汤加的访问旨在加强与太平洋国家的安全合作,抗衡中国在南太平洋的影响力。对中国访问则旨在推动贸易限制措施的取消,并寻求与中国的稳定平等伙伴关系。此次访问被视为中澳关系解冻的重要时刻,但未来关系回暖仍面临美国的影响。

具体 refine 的粒度还需要自己通过 prompt 调整, 但大多数下大模型都会简化内容, 因为"总结"就是简化。

相关文章:

变相提高大模型上下文长度-RAG文档压缩-1.常识

前言 之前遇到一个问题,公司大模型的长度不长,而且业务需要RAG返回不少的相关内容。通常RAG都是取top-10/15,文档由于长度限制不能太多,加上embedding效果不佳,返回的文档不多也不能保证都相关。 我们考虑到返回的文…...

人工智能浪潮下脑力劳动的变革与重塑:挑战、机遇与应对策略

一、引言 1.1 研究背景与意义 近年来,人工智能技术发展迅猛,已成为全球科技领域的焦点。从图像识别、语音识别到自然语言处理,从智能家居、智能交通到智能医疗,人工智能技术的应用几乎涵盖了我们生活的方方面面,给人…...

2025 年 2 月 TIOBE 指数

2025 年 2 月 TIOBE 指数 二月头条:快,更快,最快! 现在,世界需要每秒处理越来越多的数字,而硬件的发展速度却不够快,程序的速度变得越来越重要。话虽如此,快速编程语言在 TIOBE 指数中取得进展也就不足为奇了。编程语言 C++ 最近攀升至第 2 位,Go 已稳居前 10 名,Ru…...

防火墙是什么?详解网络安全的关键守护者

当今信息化时代,企业和个人在享受数字生活带来的便利时,也不可避免地面对各种潜在的风险。防火墙作为网络安全体系中的核心组件,就像一道牢不可破的防线,保护着我们的数据和隐私不受外界威胁的侵害。那么防火墙是什么?…...

【Elasticsearch】cumulative_cardinality

1.定义与用途 cumulative_cardinality是一种父级管道聚合(Parent Pipeline Aggregation),用于在父级直方图(histogram)或日期直方图(date_histogram)聚合中计算累计基数。它主要用于统计在某个…...

【LeetCode 刷题】贪心算法(2)-进阶

此博客为《代码随想录》贪心算法章节的学习笔记,主要内容为贪心算法进阶的相关题目解析。 文章目录 135. 分发糖果406. 根据身高重建队列134. 加油站968. 监控二叉树 135. 分发糖果 题目链接 class Solution:def candy(self, ratings: List[int]) -> int:n l…...

字体文件子集化(Font Subsetting)及实现代码

字体文件子集化(Font Subsetting)是指从一个完整的字体文件中提取出仅包含特定字符集的子集,以减小字体文件的大小。这在网页设计、移动应用开发和嵌入式系统中非常有用,可以显著减少加载时间和资源占用。 1. 字体子集化的基本原…...

第三篇:半导体“红蓝药丸“——IGBT/SiC器件如何重塑电驱系统

副标题:当黑客帝国遇见800V高压架构,第三代半导体开启能源革命 ▶ 开篇:红蓝药丸的终极抉择 黑客帝国隐喻 - 红色药丸(IGBT) :传统硅基器件构建的"真实世界"——成熟稳定但存在性能天花板…...

3.矩阵分解技术在推荐系统中的应用

接下来我们将深入探讨矩阵分解技术在推荐系统中的应用。矩阵分解是一种强大的技术,可以有效地处理数据稀疏性问题,并提高推荐系统的性能。在这一课中,我们将介绍以下内容: 矩阵分解的基本概念奇异值分解(SVD&#xff…...

VTK编程指南<十六>:VTK表面重建之Delaunay三角剖分

1、无边界限制 三角剖分是一种应用非常广泛的重建技术。三角剖分将一些散乱的点云数据划分为一系列的三角形网格。最常用的三角剖分技术是Delaunay三角剖分。Delaunay三角剖分具有许多优良的性质,即最大化最小角特性,即所有可能的三角形剖分中&#xff0…...

2.Excel:滨海市重点中学的物理统考考试情况❗(15)

目录 NO12​ 1.数据透视表​ 2. 3.sum函数 4.sumifs客观/主观平均分​ 5.sumifs得分率​ 6.数字格式修改​ NO3/4/5​ sumifs某一组数据相加,某一范围,某一范围的具体点向下拖拉,锁定列;向左右,锁定行F4&#x…...

leetcode day17 二分查找 34+367 移除元素27

34 在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为…...

ASP.NET Core SignalR的协议协商

SignalR支持多种服务器推送方式:Websocket、Server-Sent Events、长轮询。默认按顺序尝试。F12查看协商过程。websocket和HTTP是不同的协议,为什么能用同一个端口。在【开发人员工具】的【网络】页签中看WebSocket通信过程。 协议协商问题 集群中协议协…...

Hdoop之MapReduce的原理

简单版本 AppMaster: 整个Job任务的核心协调工具 MapTask: 主要用于Map任务的执行 ReduceTask: 主要用于Reduce任务的执行 一个任务提交Job --> AppMaster(项目经理)--> 根据切片的数量统计出需要多少个MapTask任务 --> 向ResourceManager(Yarn平台的老大)索要资源 --…...

JAVA并发编程3--多线程程序

​ 1.创建线程的方法: 案例:计算1-1000的整数和 实现Runnable接口 步骤: 1.创建一个实现了Runnable接口的类 2.实现类去实现Runnable中的抽象方法:run() 3.创建实现类的对象 4.将此对象作为参数传递到Thread类的构造器中&#…...

自主项目面试点总结

1、许苑–OJ判题系统 技术栈:Spring BootSpring Cloud AlibabaRedisMybatisMQDocker 项目地址: https://github.com/xuyuan-upward/xyoj-backend-microservice 1.1、项目介绍: 一个基于微服务的OJ系统,具备能够根据管理员预设的题目用例对用户提交的代…...

idea Ai工具通义灵码,Copilot我的使用方法以及比较

我用过多个idea Ai 编程工具,大约用了1年时间,来体会他们那个好用,以下只是针对我个人的一点分享,不一定对你适用 仅作参考。 介于篇幅原因我觉得能说上好用的 目前只有两个 一个是阿里的通义灵码和Copilot,我用它来干…...

4.python基础语法-下

文章目录 1.顺序语句2.条件语句 - if2.1什么是条件语句2.2语法格式2.2.1if2.2.2if - else2.2.3if - elif - else 2.3缩进和代码块2.4练习2.5空语句 pass 3.循环语句3.1while循环3.2for循环3.3continue3.4break 4.综合案例4.1设置初始属性4.2设置性别4.3设置出生点4.4针对每一岁…...

Java--集合(理论)

目录 一、collection collection常用方法 1.List(可以存在重复元素) 迭代器 迭代器的概念 注意事项 例子 1.ArrayList 特点 2.LinkedLIst 特点 3.Vector 特点 2.Set(无重复元素) 1.HashSet 特点 2.Linkedhashset&…...

3D图形学与可视化大屏: 3D 图形学的定义、应用领域和发展历程

一、3D 图形学的定义 3D 图形学是计算机科学的一个分支,主要研究如何在计算机上生成、处理和显示三维图形。它涉及到数学、物理学、计算机科学等多个学科领域,旨在通过计算机技术模拟真实世界中的三维物体和场景,为用户提供逼真的视觉体验。…...

Python 面向对象(类,对象,方法,属性,魔术方法)

前言:在讲面向对象之前,我们先将面向过程和面向对象进行一个简单的分析比较,这样我们可以更好的理解与区分,然后我们在详细的讲解面向对象的优势。 面向过程(Procedure-Oriented Programming,POP&#xff0…...

轮子项目--消息队列的实现(3)

上一篇文章中我把一些关键的类以及表示出来,如何对这些类对应的对象进行管理呢?管理分为硬盘和内存上,硬盘又分为数据库(管理交换机,队列和绑定)和文件(管理消息),本文就…...

5.7.1 软件项目管理范围、成本估算、风险分析

文章目录 管理范围成本估算风险分析 管理范围 软件项目管理范围包含4P,即人员、产品、过程、项目。人员管理通过人员能力成熟度模型PCMM进行管理。产品管理需要制定产品目标,识别产品的总体目标,而不涉及细枝末节。产品范围,识别产…...

Android新版高斯模糊(毛玻璃)官方实现,Kotlin

Android新版高斯模糊(毛玻璃)官方实现,Kotlin 从Android 12开始,Android官方API支持高斯模糊(毛玻璃)效果。关键是通过RenderEffect实现。 https://developer.android.com/reference/android/graphics/RenderEffecthttps://developer.android.com/refer…...

现代前端开发的演进与未来趋势:从工具革新到技术突破

在过去的十年中,前端开发经历了翻天覆地的变化。从最初的静态页面到如今复杂的单页应用(SPA),从手动操作 DOM 到基于虚拟 DOM 的高效渲染,从前端“三剑客”(HTML/CSS/JS)到全栈框架的兴起&#…...

数据结构与算法学习笔记----背包问题

数据结构与算法学习笔记----背包问题 author: 明月清了个风 first publish time: 2025.2.7 ps⭐️讲解了几种经典的背包问题:01背包,完全背包,多重背包及其变形,分组背包,讲解了他们的异同及对应的代码和优化方式&am…...

仿 RabbitMQ 实现的简易消息队列

文章目录 项目介绍开放环境第三⽅库介绍ProtobufMuduo库 需求分析核⼼概念实现内容 消息队列系统整体框架服务端模块数据管理模块虚拟机数据管理模块交换路由模块消费者管理模块信道(通信通道)管理模块连接管理模块 客户端模块 公共模块日志类其他工具类…...

吃瓜教程Day1笔记

主要内容: 1. 什么是机器学习以及 2. 机器学习的相关数学符号,为后续内容作铺垫,并未涉及复杂的算法理论, 因此阅读本章时只需耐心梳理清楚所有概念和数学符号即可。 3. “模型评估与选择” 是在模型产出以后进行的下游工作&…...

看盘细节系列 篇三:集合竞价的9点20分之前打到涨停/跌停,维持几分钟后,在9点20分之前撤单

文章目录 系列文章现象原因分析排除正常情况主力意图分析资金动向系列文章 看盘细节系列 篇一:集合竞价尾盘突变 看盘细节系列 篇二:集合竞价的9点18分大单打到3%以下或以上,9点19分撤单 现象 在股票交易的集合竞价阶段,在9点20分之前,股票的价格突然被大笔资金迅速拉高…...

实验9 基于WebGoat平台的SQL注入攻击

实验9 基于WebGoat平台的SQL注入攻击 1.实验目的 熟悉WebGoat平台,在该平台上实现SQL注入攻击。 2.实验内容 (1)下载webgoat-server-8.2.2.jar。 (2)搭建java环境。 (3)运行webgoat。 &#xf…...