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

变相提高大模型上下文长度-RAG文档压缩-3.优化map-reduce(reranker过滤+社区聚类)

我遇到的业务问题实际上是RAG需要处理很多同一对象的日常报告,不像常识类问题,它的相关Document更多而且更分散,日常报告代表数据库里有很多它的内容,而且对象可能只在段落中的几句话提及到。top-k数量受限于大模型长度,目前是top-10/15,明显一个月的情况都没法正常枚举,而且上下文中也有很多无关内容,既会干扰大模型又会占着token,所以必需对上下文进行过滤,到这一步后再压缩下文本。

流程图

我的方法主要灵感来自于map-reduce总结方法,主要由于它可以并行处理的优点,利用小模型做简单任务。

  • Inner-chunk 过滤

    • 将块拆分为更小的单元,通过语义分块,
    • 使用重排序器过滤掉不相关的部分,
    • 将剩余的句子合并为较小的块或片段。
  • Outer-chunk 重合成

    • 对片段执行社区检测,并将同一聚类中的片段在块长度限制内合并成新的块。社区检测的主要目的是将语义上相近或重复的内容保持在同一块中,以便我们能够很好地合并它们或去除冗余。
    • 合成上下文内容,确保保留相关和有用的信息,以便为后续的 QA 阶段提供合理的内容,同时防止丢失潜在有价值的上下文。
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
import asyncio
import nest_asyncio# 应用 nest_asyncio 以支持 Jupyter 笔记本中的异步操作
nest_asyncio.apply()

Inner-chunk 过滤

原始代码

from meta_chunking import meta_chunking_, sentences_doc = meta_chunking(a_docs[0].page_content, 'PPL Chunking', 'zh', 0.5, 256)
print(*sentences_doc, sep='\n====\n')
。据路透社6月17日报道,在华盛顿对中国在太平洋地区不断扩大的影响力感到担忧之际,路透社记者17日看到的一份声明显示,美国和马绍尔群岛同意努力在今年就美国对后者的经济援助达成协议。报道称,美国《自由联系协定》谈判特使尹汝尚本周前往马绍尔群岛,与这个具有战略意义的太平洋岛国的相关部门举行会谈。根据一份联合声明,双方希望在9月前签署一项谅解备忘录,“目的是在秋末或初冬之前完成《自由联系协定》谈判”。声明称,双方阐明了在2023年《自由联系协定》到期后美国继续向马绍尔群岛提供经济援助的重要性。
====
报道还说,长期以来,华盛顿与马绍尔群岛、帕劳和密克罗尼西亚联邦保持着特殊关系,这使得美军能够进入太平洋地区的广阔战略区域。但这三个太平洋岛国抱怨说,美方的援助没有跟上。尹汝尚还负责与密克罗尼西亚联邦和帕劳就延长《自由联系协定》进行谈判。
====
报道说,中国加强了与太平洋岛国的经济、军事和警务联系,并在商业和旅游方面向马绍尔群岛、帕劳和密克罗尼西亚联邦示好。前不久,中国与所罗门群岛签署安全协议,凸显了北京在该地区日益增强的影响力。此举引发了澳大利亚、新西兰和美国的关切。战略与国际问题研究中心的专家哈里森·普雷拉表示:“该地区国家更感兴趣的可能是轮流吸引中国和西方的投资,而不是作出加入北京阵营的承诺。”声明还说,尹汝尚和马绍尔群岛外长基特兰·卡布阿还讨论了美国在马绍尔群岛进行核试验的遗留问题。
====
在尹汝尚今年3月上任之前,这个问题一直是双方关系的症结所在。报道写道,1946年至1958年期间,美国在马绍尔群岛进行了67次核试验——其中包括1954年在比基尼环礁进行的“喝彩城堡”氢弹试验。这些核试验对健康和环境造成的影响迄今仍然令岛国居民感到困扰。另据路透社6月17日报道,在所罗门群岛与中国的安全协议引发地区关切之际,澳大利亚外长黄英贤周五造访所罗门群岛一个骚乱频发的社区,以强调澳大利亚警方的能力。黄英贤表示,在访问期间,她与所罗门群岛总理索加瓦雷举行了“建设性”会谈。
====
报道称,黄英贤的访问强调了澳大利亚对所罗门群岛的教育和医疗援助,以及在当地去年发生骚乱后澳大利亚警方为恢复稳定作出的努力。黄英贤对媒体称,索加瓦雷重申了他的公开保证,即根据与中方的协议,所罗门群岛不会有军事基地,也不会有持续的外国驻军。黄英贤周五说:“澳大利亚仍然认为,应该由太平洋大家庭来负责我们的安全问题。”黄英贤访问了所罗门群岛首都霍尼亚拉以东的伯恩斯克里克定居点,那里的房屋在去年11月的骚乱中被烧毁。澳大利亚、斐济和新西兰的警察以及当地年轻人参与了重建工作,在那里修建了一个诊所。
from langchain_community.cross_encoders import HuggingFaceCrossEncoder# Initialize the model
reranker = HuggingFaceCrossEncoder(model_name="../../DataCollection/officials/bge-reranker-v2-m3",model_kwargs = {'device': 'cuda:6'})reranker.score([('今天是星期几?', '今天是星期二。')])
array([0.8927492], dtype=float32)
fragment_maxlen = 256
reranker_score_threshold = 0.1_, doc_fragments = meta_chunking(a_docs[0].page_content, 'PPL Chunking', 'zh', 0.5, fragment_maxlen)fragment_scores = reranker.score([(a_query, frag) for frag in doc_fragments])filtered_fragments = [fragfor frag, score in zip(doc_fragments, fragment_scores)if score > reranker_score_threshold
]new_chunk = Document(''.join(filtered_fragments), metadata=a_docs[0].metadata)print(f'过滤前文本长度: {len(a_docs[0].page_content)}')
print(f'过滤后文本长度: {len(new_chunk.page_content)}')
过滤前文本长度: 1077
过滤后文本长度: 485

至于为什么要组合回去:保持文档逻辑结构
原始文档被分割成多个chunk,每个chunk是根据文档内的逻辑顺序切分的。每个chunk内部的内容具有较强的上下文相关性,通常是围绕某个主题或段落展开。因此,组合回去可以最大限度地保留文档内部的逻辑顺序和连贯性。

封装为 Runnable

import asyncio
from typing import List, Dict
from langchain.schema import Document
from langchain.schema.runnable import Runnable
from langchain_community.cross_encoders import HuggingFaceCrossEncoderclass Fragment_Filter(Runnable):def __init__(self, reranker, fragment_maxlen=256, reranker_score_threshold=0.1):"""继承 Runnable,实现文档切片与筛选逻辑。:param model: 评分模型:param fragment_maxlen: 片段最大长度:param reranker_score_threshold: 重新排序得分阈值"""self.model = rerankerself.fragment_maxlen = fragment_maxlenself.reranker_score_threshold = reranker_score_thresholdasync def process_document(self, a_query: str, a_doc: Document) -> Document:"""异步处理单个文档的 fragment,并根据得分筛选。:param a_query: 查询字符串:param a_doc: Document 对象:return: 处理后的 Document 对象"""# 文档切片_, doc_fragments = meta_chunking(a_doc.page_content, 'PPL Chunking', 'zh', 0.5, self.fragment_maxlen)# 计算 fragment 的得分fragment_scores = self.model.score([(a_query, frag) for frag in doc_fragments])# 过滤符合条件的 fragmentsfiltered_fragments = [frag for frag, score in zip(doc_fragments, fragment_scores)if score > self.reranker_score_threshold]# 返回新的 Documentreturn Document(''.join(filtered_fragments), metadata=a_doc.metadata)def invoke(self, inputs: Dict[str, any]) -> List[Document]:"""同步调用,并通过 asyncio.run() 调用异步任务。:param inputs: 包含 `query` 和 `documents` 的字典:return: 过滤后的 List[Document]"""a_query = inputs["query"]documents = inputs["documents"]# 使用 asyncio.run 执行异步的并行任务return asyncio.run(self.ainvoke(a_query, documents))async def ainvoke(self, a_query: str, documents: List[Document]) -> List[Document]:"""异步处理多个文档的 fragment,并根据得分筛选。:param a_query: 查询字符串:param documents: 要处理的文档列表:return: 过滤后的 List[Document]"""# 使用 asyncio.gather 并行处理每个文档tasks = [self.process_document(a_query, a_doc) for a_doc in documents]return await asyncio.gather(*tasks)fragment_filter = Fragment_Filter(reranker=reranker)
# 示例用法
result_doc = fragment_filter.invoke({"query": a_query, "documents": a_docs})
print(f'过滤前文本长度: {sum([len(item.page_content) for item in a_docs])}')
print(f'过滤后文本长度: {sum([len(item.page_content) for item in result_doc])}')

Outer-chunk 重组织

原始代码

在做 query-focused summarization 时,出现了一个问题,summarization 始终会造成信息损失,在二次总结时最明显。

例如问题是泰坦尼克号是如何沉没的,原始的总结只会返回泰坦尼克号沉没的信息,但有其他信息虽然与问题不直接相关,但确实可以作为上下文来优化问答效果,例如泰坦尼克号的背景、远航的原因和宣传、航线路线、沉没的后续救援行动、对行业的影响等等。这些辅助信息都因为不直接下相关被去除。

我认为应该是任务定义错误,summarization一定是减少信息,因为他的定义本身就是总结。所以现在改为"上下文重新组织",强调必须保留辅助性的细节。

当然这估计只能缓解,所以我后期会再与query改写相结合,不管是改写为多轮query,还是单独改写为更丰富的query。

from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParserreorganzie_prompt = PromptTemplate(template=("Given the following set of document fragments and the query, filter out irrelevant content and reorganize the remaining fragments into a single, cohesive chunk.\n\n"  "The goal is to synthesize contextual content that will support a detailed and nuanced QA response, ensuring diverse perspectives are preserved while reducing redundancy. ""Retain important background information and supplementary details, even if they are less directly relevant to the query. ""Present the reorganized content in {language} language. \n""[query-START]:\n{query}\n[query-END]\n""[fragments-START]:\n{fragments}\n[fragments-END]\n"),partial_variables={"language":"Chinese" # "English" or "Chinese"}    
)llm = ChatOpenAI(base_url='http://localhost:5551/v1',api_key='EMPTY',model_name='Qwen2.5-14B-Instruct',temperature=0.2,
)output_parser = StrOutputParser()reorganzie_chain = reorganzie_prompt | llm | output_parser
query = a_query
fragments = a_docs[0].page_content
result = reorganzie_chain.invoke({"query":query,"fragments":fragments}
)print(query, fragments, result, sep='\n========\n')
澳大利亚新任外长黄英贤近日访问了哪个国家,他的目的是什么?
========。据路透社6月17日报道,在华盛顿对中国在太平洋地区不断扩大的影响力感到担忧之际,路透社记者17日看到的一份声明显示,美国和马绍尔群岛同意努力在今年就美国对后者的经济援助达成协议。报道称,美国《自由联系协定》谈判特使尹汝尚本周前往马绍尔群岛,与这个具有战略意义的太平洋岛国的相关部门举行会谈。根据一份联合声明,双方希望在9月前签署一项谅解备忘录,“目的是在秋末或初冬之前完成《自由联系协定》谈判”。声明称,双方阐明了在2023年《自由联系协定》到期后美国继续向马绍尔群岛提供经济援助的重要性。报道还说,长期以来,华盛顿与马绍尔群岛、帕劳和密克罗尼西亚联邦保持着特殊关系,这使得美军能够进入太平洋地区的广阔战略区域。但这三个太平洋岛国抱怨说,美方的援助没有跟上。尹汝尚还负责与密克罗尼西亚联邦和帕劳就延长《自由联系协定》进行谈判。报道说,中国加强了与太平洋岛国的经济、军事和警务联系,并在商业和旅游方面向马绍尔群岛、帕劳和密克罗尼西亚联邦示好。前不久,中国与所罗门群岛签署安全协议,凸显了北京在该地区日益增强的影响力。此举引发了澳大利亚、新西兰和美国的关切。战略与国际问题研究中心的专家哈里森·普雷拉表示:“该地区国家更感兴趣的可能是轮流吸引中国和西方的投资,而不是作出加入北京阵营的承诺。”声明还说,尹汝尚和马绍尔群岛外长基特兰·卡布阿还讨论了美国在马绍尔群岛进行核试验的遗留问题。在尹汝尚今年3月上任之前,这个问题一直是双方关系的症结所在。报道写道,1946年至1958年期间,美国在马绍尔群岛进行了67次核试验——其中包括1954年在比基尼环礁进行的“喝彩城堡”氢弹试验。这些核试验对健康和环境造成的影响迄今仍然令岛国居民感到困扰。另据路透社6月17日报道,在所罗门群岛与中国的安全协议引发地区关切之际,澳大利亚外长黄英贤周五造访所罗门群岛一个骚乱频发的社区,以强调澳大利亚警方的能力。黄英贤表示,在访问期间,她与所罗门群岛总理索加瓦雷举行了“建设性”会谈。报道称,黄英贤的访问强调了澳大利亚对所罗门群岛的教育和医疗援助,以及在当地去年发生骚乱后澳大利亚警方为恢复稳定作出的努力。黄英贤对媒体称,索加瓦雷重申了他的公开保证,即根据与中方的协议,所罗门群岛不会有军事基地,也不会有持续的外国驻军。黄英贤周五说:“澳大利亚仍然认为,应该由太平洋大家庭来负责我们的安全问题。”黄英贤访问了所罗门群岛首都霍尼亚拉以东的伯恩斯克里克定居点,那里的房屋在去年11月的骚乱中被烧毁。澳大利亚、斐济和新西兰的警察以及当地年轻人参与了重建工作,在那里修建了一个诊所。
========
澳大利亚新任外长黄英贤近日访问了所罗门群岛。据报道,黄英贤在访问期间与所罗门群岛总理索加瓦雷进行了“建设性”的会谈。黄英贤强调了澳大利亚对所罗门群岛的教育和医疗援助,以及在去年发生骚乱后澳大利亚警方为恢复稳定所作出的努力。黄英贤表示,索加瓦雷重申了他不会在所罗门群岛设立军事基地或持续驻扎外国军队的公开保证。黄英贤还访问了所罗门群岛首都霍尼亚拉以东的伯恩斯克里克定居点,该定居点在去年11月的骚乱中遭受了严重破坏。澳大利亚、斐济和新西兰的警察以及当地年轻人参与了重建工作,其中包括修建了一个诊所。黄英贤的访问正值中国与所罗门群岛签署安全协议,引发澳大利亚、新西兰和美国的关切之际。

封装

import asyncio
import numpy as np
from typing import List, Dict
from langchain_openai import ChatOpenAI
from langchain.schema.runnable import Runnable
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParserfrom sklearn.cluster import AgglomerativeClustering
from sklearn.metrics.pairwise import cosine_similarityclass Content_Reorganizer(Runnable):def __init__(self, llm, embedding_model, threshold:float=0.5, chunk_size:int=512):self.llm = llmself.embedding_model = embedding_modelself.threshold = thresholdself.chunk_size = chunk_sizeself.reorganzie_prompt = PromptTemplate(template=("Given the following set of document fragments and the query, filter out irrelevant content and reorganize the remaining fragments into a single, cohesive chunk.\n\n"  "The goal is to synthesize contextual content that will support a detailed and nuanced QA response, ensuring diverse perspectives are preserved while reducing redundancy. ""Retain important background information and supplementary details, even if they are less directly relevant to the query. ""Present the reorganized content in {language} language. \n""[query-START]:\n{query}\n[query-END]\n""[fragments-START]:\n{fragments}\n[fragments-END]\n"),partial_variables={"language":"Chinese" # "English" or "Chinese"}    )output_parser = StrOutputParser()self.reorganzie_chain = self.reorganzie_prompt | llm | output_parserdef compute_similarity_matrix(self, texts):embeddings = self.embedding_model.embed_documents(texts)embeddings = np.array(embeddings)similarity_matrix = cosine_similarity(embeddings)return similarity_matrixdef hierarchical_community_detection(self, texts):# 计算相似度矩阵similarity_matrix = self.compute_similarity_matrix(texts)distance_matrix = 1 - similarity_matrix# 以相似度为阈值来控制聚类clustering = AgglomerativeClustering(metric='precomputed',linkage='average',distance_threshold=self.threshold,n_clusters=None)# 聚类结果labels = clustering.fit_predict(distance_matrix)# 输出每个社区的文本communities = {}for idx, label in enumerate(labels):if label not in communities:communities[label] = []communities[label].append(texts[idx])return communitiesdef combine_texts_into_chunks(self, communities):chunks = []for community, texts_in_community in communities.items():current_chunk = []current_chunk_size = 0for text in texts_in_community:text_size = len(text.split())  # 计算文本大小(按单词数)# 如果当前文本大小超过chunk_size,则直接单独放入一个块if text_size > self.chunk_size:if current_chunk:  # 当前块不为空,则保存并开始新块chunks.append(" ".join(current_chunk))current_chunk = []current_chunk_size = 0chunks.append(text)  # 该文本单独作为一个块else:# 当前块 + 文本的大小是否超过chunk_sizeif current_chunk_size + text_size <= self.chunk_size:current_chunk.append(text)current_chunk_size += text_sizeelse:# 当前块满了,保存并开始新块chunks.append(" ".join(current_chunk))current_chunk = [text]current_chunk_size = text_size# 如果还有剩余的文本块,添加到chunks中if current_chunk:chunks.append(" ".join(current_chunk))return chunksdef invoke(self, inputs: Dict[str, any]):return asyncio.run(self.ainvoke(inputs))async def ainvoke(self, inputs: Dict[str, any]):query = inputs["query"]documents = inputs["documents"]texts = [doc.page_content for doc in documents]communities = self.hierarchical_community_detection(texts)chunks = self.combine_texts_into_chunks(communities)tasks = [self.process_document(query, content) for content in chunks]return await asyncio.gather(*tasks)reorganizer = Content_Reorganizer()
import asyncio
import numpy as np
from typing import List, Dict
from langchain_openai import ChatOpenAI
from langchain_openai import OpenAIEmbeddings
from langchain.schema.runnable import Runnable
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParserfrom sklearn.cluster import AgglomerativeClustering
from sklearn.metrics.pairwise import cosine_similarityclass Content_Reorganizer(Runnable):def __init__(self, llm, embedding_model, threshold: float = 0.5, chunk_size: int = 512):"""初始化 ContentReorganizer 类,接受大模型、嵌入模型、阈值和块大小等参数。:param llm: 用于生成重组内容的语言模型:param embedding_model: 用于生成文本嵌入的模型:param threshold: 社区检测时相似度的阈值:param chunk_size: 生成的每个块的最大大小(以单词为单位)"""self.llm = llmself.embedding_model = embedding_modelself.threshold = thresholdself.chunk_size = chunk_size# 用于内容重组的提示模板self.reorganzie_prompt = PromptTemplate(template=("Given the following set of document fragments and the query, filter out irrelevant content and reorganize the remaining fragments into a single, cohesive chunk.\n\n"  "The goal is to synthesize contextual content that will support a detailed and nuanced QA response, ensuring diverse perspectives are preserved while reducing redundancy. ""Retain important background information and supplementary details, even if they are less directly relevant to the query. ""Present the reorganized content in {language} language. \n""[query-START]:\n{query}\n[query-END]\n""[fragments-START]:\n{fragments}\n[fragments-END]\n"),partial_variables={"language": "Chinese"  # "English" 或 "Chinese"})# 输出解析器,将最终生成的文本从模型输出中提取出来output_parser = StrOutputParser()self.reorganzie_chain = self.reorganzie_prompt | llm | output_parserdef compute_similarity_matrix(self, texts: List[str]) -> np.ndarray:"""计算文本之间的相似度矩阵。:param texts: 输入的文本列表:return: 文本之间的相似度矩阵"""# 获取文本的嵌入表示embeddings = self.embedding_model.embed_documents(texts)embeddings = np.array(embeddings)# 计算余弦相似度矩阵similarity_matrix = cosine_similarity(embeddings)return similarity_matrixdef hierarchical_community_detection(self, texts: List[str]) -> Dict[int, List[str]]:"""基于文本的相似度矩阵进行层次社区检测。:param texts: 输入的文本列表:return: 返回每个社区的文本列表"""# 计算相似度矩阵并转换为距离矩阵similarity_matrix = self.compute_similarity_matrix(texts)distance_matrix = 1 - similarity_matrix# 层次聚类clustering = AgglomerativeClustering(metric='precomputed',  # 使用预计算的距离矩阵linkage='average',     # 使用平均链接法distance_threshold=self.threshold,n_clusters=None)# 获取聚类结果labels = clustering.fit_predict(distance_matrix)# 输出每个社区的文本communities = {}for idx, label in enumerate(labels):if label not in communities:communities[label] = []communities[label].append(texts[idx])return communitiesdef combine_texts_into_chunks(self, communities: Dict[int, List[str]]) -> List[str]:"""将社区内的文本重新组合成大小不超过 `chunk_size` 的块。:param communities: 每个社区及其对应文本的字典:return: 组合后的文本块列表"""chunks = []# 遍历每个社区的文本for community, texts_in_community in communities.items():current_chunk = []current_chunk_size = 0for text in texts_in_community:text_size = len(text.split())  # 计算文本的大小(按单词数)# 如果当前文本超过 chunk_size,直接单独作为一个块if text_size > self.chunk_size:if current_chunk:  # 当前块不为空,将其保存chunks.append(" ".join(current_chunk))current_chunk = []current_chunk_size = 0chunks.append(text)  # 单个文本单独作为一个块else:# 判断当前块 + 文本是否超过 chunk_sizeif current_chunk_size + text_size <= self.chunk_size:current_chunk.append(text)current_chunk_size += text_sizeelse:# 当前块满了,保存并开始新的块chunks.append(" ".join(current_chunk))current_chunk = [text]current_chunk_size = text_size# 如果最后还有剩余的文本块,添加到 chunks 中if current_chunk:chunks.append(" ".join(current_chunk))return chunksasync def process_document(self, query: str, fragment: str) -> str:"""使用 LLM 进行文档内容的重组。:param query: 输入查询:param fragment: 文本片段:return: 生成的重组文本"""# 组织提示并调用 LLM 进行内容重组result = await self.reorganzie_chain.ainvoke({"query": query, "fragments": fragment})return resultasync def ainvoke(self, inputs: Dict[str, any]) -> List[str]:"""异步方法,执行内容重组过程。:param inputs: 输入参数,包括查询和文档列表:return: 返回重组后的文本列表"""query = inputs["query"]documents = inputs["documents"]# 获取文档的文本内容texts = [doc.page_content for doc in documents]# 进行社区检测communities = self.hierarchical_community_detection(texts)# 将社区内部文本重新组合成块chunks = self.combine_texts_into_chunks(communities)# 并行处理每个块,调用 LLM 进行重组tasks = [self.process_document(query, content) for content in chunks]return await asyncio.gather(*tasks)def invoke(self, inputs: Dict[str, any]) -> List[str]:"""同步方法,调用异步的 `ainvoke` 方法。:param inputs: 输入参数,包括查询和文档列表:return: 返回重组后的文本列表"""return asyncio.run(self.ainvoke(inputs))openai_embedding = OpenAIEmbeddings(model="bge-m3",base_url='http://localhost:9997/v1',api_key='Empty',# dimensions=1024,
)
llm = ChatOpenAI(base_url='http://localhost:5551/v1',api_key='EMPTY',model_name='Qwen2.5-14B-Instruct',temperature=0.2,
)reorganizer = Content_Reorganizer(llm, openai_embedding)
results = reorganizer.invoke({"query":a_query,"documents":result_doc}
)
print(*results, sep='\n====\n')
澳大利亚新任外长黄英贤近日访问了所罗门群岛。据报道,黄英贤在6月17日访问了所罗门群岛一个骚乱频发的社区,以强调澳大利亚警方的能力。她与所罗门群岛总理索加瓦雷进行了“建设性”的会谈,并表示澳大利亚仍然认为,应该由太平洋大家庭来负责安全问题。黄英贤的访问强调了澳大利亚对所罗门群岛的教育和医疗援助,以及在去年发生骚乱后澳大利亚警方为恢复稳定所作的努力。此外,索加瓦雷重申了所罗门群岛不会根据与中国的安全协议设立军事基地或持续的外国驻军的公开保证。黄英贤还访问了所罗门群岛首都霍尼亚拉以东的伯恩斯克里克定居点,该定居点在去年11月的骚乱中遭受了破坏。澳大利亚、斐济和新西兰的警察以及当地年轻人参与了重建工作,修建了一个诊所。
====
澳大利亚新任外长黄英贤近日访问了萨摩亚和汤加这两个太平洋岛国。她表示,澳大利亚将加强与太平洋国家的安全合作,并强调与太平洋岛国之间的联系。黄英贤上任后尤其重视加强澳大利亚与太平洋岛国之间的关系,她认为澳大利亚需要表明自己是该地区国家可靠和值得信赖的伙伴,并且“决心弥补”在气候行动方面“失去的十年”。此外,黄英贤还于12月20日至21日对中国进行了访问,这是四年多来澳大利亚外长首次访华,标志着中澳关系迈出重要一步。黄英贤表示,她将在同王毅的会晤中推动贸易限制措施的取消,并称两国关系中有许多棘手问题,需要时间根据双方各自利益去解决。黄英贤此次访问也引起了媒体的广泛关注,被认为是中澳关系正在慢慢解冻的信号。

在这里插入图片描述

相关文章:

变相提高大模型上下文长度-RAG文档压缩-3.优化map-reduce(reranker过滤+社区聚类)

我遇到的业务问题实际上是RAG需要处理很多同一对象的日常报告&#xff0c;不像常识类问题&#xff0c;它的相关Document更多而且更分散&#xff0c;日常报告代表数据库里有很多它的内容&#xff0c;而且对象可能只在段落中的几句话提及到。top-k数量受限于大模型长度&#xff0…...

算法11-分治算法

一、分治算法概念 分治算法&#xff08;Divide and Conquer&#xff09;是一种重要的算法设计思想&#xff0c;通过将问题分解为多个子问题&#xff0c;分别解决后再合并结果&#xff0c;从而解决原问题。分治算法的核心思想是“分而治之”&#xff0c;通常包含三个步骤&#…...

Golang internals

To be continued... time.Time golang的时区和神奇的time.Parse context.Context Go Context的踩坑经历 sync.Pool sync.Pool workflow in Go 1.12 new shared pools in Go 1.13 什么是cpu cache理解 Go 1.13 中 sync.Pool 的设计与实现Go: Understand the Design of Sync.Pool…...

Flask中获取请求参数的一些方式总结

在 Flask 中&#xff0c;可以从 request 对象中获取各种类型的参数。以下是全面整理的获取参数的方式及示例代码。 1. 获取 URL 查询参数&#xff08;Query String Parameters&#xff09; URL 中的查询参数通过 ?keyvalue&key2value2 的形式传递&#xff0c;使用 reques…...

vscode/cursor 写注释时候出现框框解决办法

一、问题描述 用vscode/cursor写注释出现如图的框框&#xff0c;看着十分难受&#xff0c;用pycharm就没有 二、解决办法 以下两种&#xff0c;哪个好用改那个 &#xff08;1&#xff09;Unicode Highlight:Ambiguous Characters Unicode Highlight:Ambiguous Characters &a…...

11-跳跃游戏

给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 贪心算法思路分析 在遍…...

TestHubo基础教程-创建项目

TestHubo是一款国产开源一站式测试工具&#xff0c;涵盖功能测试、接口测试、性能测试&#xff0c;以及 Web 和 App 测试&#xff0c;可以满足不同类型项目的测试需求。本文将介绍如何快速创建第一个项目&#xff0c;以快速入门上手。 1、创建项目 在 TestHubo 中&#xff0c;…...

GHOST重装后DEF盘丢失的全面解析与数据恢复实战指南

GHOST作为一款经典的系统备份与还原工具&#xff0c;因其高效便捷的特性被广泛应用于系统重装和数据恢复场景。然而&#xff0c;许多用户在使用GHOST重装系统后&#xff0c;发现DEF盘&#xff08;即D盘、E盘、F盘等非系统盘&#xff09;突然丢失&#xff0c;导致重要数据无法访…...

soular基础教程-使用指南

soular是TikLab DevOps工具链的统一帐号中心&#xff0c;今天来介绍如何使用 soular 配置你的组织、工作台&#xff0c;快速入门上手。 &#xfeff; 1. 账号管理 可以对账号信息进行多方面管理&#xff0c;包括分配不同的部门、用户组等&#xff0c;从而确保账号权限和职责…...

刷题记录(回顾)HOT100 二叉树-10: ​199. 二叉树的右视图

题目&#xff1a;199. 二叉树的右视图 难度&#xff1a;中等 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左…...

【Java学习】类和对象

目录 一、选择取块解 二、类变量 三、似复刻变量 四、类变量的指向对象 五、变量的解引用访问 1.new 类变量(参) 2.this(参) 3.类变量/似复刻变量. 六、代码块 七、复制变量的赋值顺序 八、访问限定符 1.private 2.default 九、导类 一、选择取块解 解引用都有可以…...

安卓基础(Adapter)

想象一下&#xff0c;你有一堆玩具&#xff08;数据&#xff09;&#xff0c;这些玩具很特别&#xff0c;每个玩具都是不同的&#xff0c;可能有汽车、飞机、积木等。现在&#xff0c;你想把这些玩具摆放到一个展示柜&#xff08;显示的界面&#xff09;里&#xff0c;给大家看…...

mybatis-lombok工具包介绍

Lombok是一个实用的]ava类库&#xff0c;能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法&#xff0c;并可以自动化生成日志变量&#xff0c;简化java开发、提高效率。 使用前要加入Lombok依赖...

React - 高阶函数-函数柯里化

在 JavaScript 和 React 中&#xff0c;高阶函数是指能够接收其它函数作为参数&#xff0c;或者返回一个函数的函数。柯里化是一种将函数的多个参数转化为一系列嵌套函数的技术&#xff0c;通常用于简化函数的使用和提高其可组合性。 使用前&#xff1a; import React,{Compo…...

数据守护者:备份文件的重要性及自动化备份实践

在信息化社会&#xff0c;数据已成为企业运营和个人生活的重要组成部分。无论是企业的核心业务数据&#xff0c;还是个人的珍贵照片、重要文档&#xff0c;数据的丢失或损坏都可能带来无法估量的损失。因此&#xff0c;备份文件的重要性愈发凸显&#xff0c;它不仅是数据安全的…...

【kafka系列】消费者重平衡

目录 流程 1. 消费者组重平衡&#xff08;Rebalance&#xff09;的流程逻辑分析 阶段一&#xff1a;触发重平衡 阶段二&#xff1a;消费者组协调 阶段三&#xff1a;重平衡完成 关键设计思想 2. Mermaid 流程代码 关键点总结 重平衡的影响 1. 重平衡期间的消费行为 2…...

光谱相机在天文学领域的应用

天体成分分析 恒星成分研究&#xff1a;恒星的光谱包含了其大气中各种元素的吸收和发射线特征。通过光谱相机精确测量这些谱线&#xff0c;天文学家能确定恒星大气中氢、氦、碳、氮、氧等元素的含量。如对太阳的光谱分析发现&#xff0c;太阳大气中氢元素占比约 71%&#xff0…...

Java 基于 SpringBoot+Vue 的家政服务管理平台设计与实现

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…...

ABC393E/F简要题解

ABC393E 给定数组 A A A,求包含元素 A i A_i Ai​的大小为 k k k的子集中最大的最大公约数。 题解&#xff1a; 首先思考对于整个数组所有包含 k k k个元素的子集中最大的GCD是多少&#xff0c;可以怎么求。 我们发现&#xff0c;如果一个数 x x x,数组中如果存在至少 k k …...

什么是Mustache

Mustache 是一种轻量级模板引擎&#xff0c;用于将变量插入到模板中生成最终的文本输出。它的设计简单且易于使用&#xff0c;适用于多种编程语言&#xff0c;包括 JavaScript、Python、Ruby、Java 等。 Mustache 的模板语法使用双大括号 {{}} 包裹变量或表达式&#xff0c;用…...

GGUF格式的DeepSeek-R1-Distill-Qwen-1.5B模型的字段解析

在将GGUF文件转换为PyTorch格式之前&#xff0c;先要读取文件并了解模型中都有什么字段&#xff0c;会遇到了各种参数不匹配的问题。现在&#xff0c;我们先读取GGUF文件的元数据字段&#xff0c;并希望将这些字段中的内存映射&#xff08;mmap&#xff09;数据转换为字符串显示…...

Java和SQL测试、性能监控中常用工具

下面我会详细列举一些在Java和SQL测试、调试、性能监控中常用的工具&#xff0c;并结合项目中提到的各个技术点说明如何选择合适的工具和方法。 一、Java项目常用的测试、调试与性能监控工具 单元测试与集成测试&#xff1a; JUnit/TestNG&#xff1a; 用于编写单元测试和集成测…...

CAS单点登录(第7版)13.票务

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 票务 概述 票务 有两个核心的可配置工单组件&#xff1a; TicketRegistry - 提供持久票证存储。ExpirationPolicy - 提供票证过期语义的策略框架。 工单注册 部署环境和技术专业知识…...

大语言模型入门

大语言模型入门 1 大语言模型步骤1.1 pre-training 预训练1.1.1 从网上爬数据1.1.2 tokenization1.1.2.1 tokenization using byte pair encoding 1.3 预训练1.3.1 context1.3.2 training1.3.3 输出 1.2 post-training1.2.1 token 1.2 SFT监督微调1.3 人类反馈强化学习1.3.1 人…...

从ARM官方获取自己想要的gcc交叉编译工具链接(Arm GNU Toolchain),并在Ubuntu系统中进行配置

前言 本文是博文 https://blog.csdn.net/wenhao_ir/article/details/145547974 的分支博文。 在本博文中我们完成gcc交叉编译工具gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz的下载、配置、测试。 下载自己想要的gcc交叉编译工具的源码 目标文件的名字及说…...

LDR6500:重塑充电与数据传输的新篇章

在当今快速发展的数字时代&#xff0c;电子设备对充电速度、数据传输效率和兼容性提出了更高要求。LDR6500&#xff0c;作为一款专为USB Type-C Bridge设备设计的USB-C DRP&#xff08;Dual Role Port&#xff0c;双角色端口&#xff09;接口USB PD&#xff08;Power Delivery&…...

Matlab 机器人 雅可比矩阵

工业机器人运动学与Matlab正逆解算法学习笔记&#xff08;用心总结一文全会&#xff09;&#xff08;四&#xff09;——雅可比矩阵_staubli机器人正逆向运动学实例验证matlab-CSDN博客 matlab求雅可比矩阵_六轴机械臂 矢量积法求解雅可比矩阵-CSDN博客 (63 封私信 / 80 条消息…...

网络安全防护:开源WAF雷池SafeLine本地部署与配置全流程

文章目录 前言1.关于SafeLine2.安装Docker3.本地部署SafeLine4.使用SafeLine5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 对于建站新手来说&#xff0c;无论你选择创建的是个人博客、企业官网还是各类应用平台来推广自己的内容或是产品&am…...

vue框架生命周期详细解析

Vue.js 的生命周期钩子函数是理解 Vue 组件行为的关键。每个 Vue 实例在创建、更新和销毁过程中都会经历一系列的生命周期阶段&#xff0c;每个阶段都有对应的钩子函数&#xff0c;开发者可以在这些钩子函数中执行特定的操作。 Vue 生命周期概述 Vue 的生命周期可以分为以下几…...

Ollama 安装使用指南

rootdeepseek-1:/home/zgq/.ollama# lsof -i :11434 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ollama 29005 root 3u IPv4 47359 0t0 TCP localhost:11434 (LISTEN) 从以上提供的 lsof 输出来看&#xff0c;Ollama 服务正在监听 localhost:11434…...

力扣 38. 外观数列 打表 迭代 阅读理解

Problem: 38. 外观数列 &#x1f9d1;‍&#x1f3eb; 参考题目补充说明 &#x1f9d1;‍&#x1f3eb; 参考题解 迭代法 class Solution {public String countAndSay(int n) {String str "1";for (int i 2; i < n; i) {StringBuilder sb new StringBuild…...

文心一言4月起全面免费,6月底开源新模型:AI竞争进入新阶段?

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、文心一言免费化的背后&#xff1a;AI成本与应用的双重驱动1️⃣成本下降&#xff0c;推动文心一言普及2…...

基于LSTM+前向均值滤波后处理的癫痫发作检测(包含数据集)

引言 癫痫是一种常见的神经系统疾病&#xff0c;患者会经历反复的癫痫发作。早期检测和预警对于改善患者的生活质量至关重要。近年来&#xff0c;深度学习技术&#xff0c;尤其是长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;在时间序列数据分析中表现出色&#xf…...

Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)

文章目录 Redis下载地址&#xff1a;一、zip压缩包方式下载安装 1、下载Redis压缩包2、解压到文件夹3、启动Redis服务4、打开Redis客户端进行连接5、使用一些基础操作来测试 二、msi安装包方式下载安装 1、下载Redis安装包2、进行安装3、进行配置4、启动服务5、测试能否正常工…...

什么是交叉熵

交叉熵 定义公式 针对离散变量x的概率分布 p ( x ) p(x) p(x) , q ( x ) q(x) q(x) x 1 x_1 x1​ x 2 x_2 x2​ x 3 x_3 x3​ x 4 x_4 x4​… x n x_n xn​p( x 1 x_1 x1​)p( x 2 x_2 x2​)p( x 3 x_3 x3​)p( x 4 x_4 x4​)…p( x n x_n xn​)q( x 1 x_1 x1​)q( x 2 x_2 …...

虚拟机安装k8s集群

环境准备 - 主节点&#xff08;Master Node&#xff09;: IP地址: 192.168.40.100主机名: k8s-master - 工作节点&#xff08;Worker Node&#xff09;: IP地址: 192.168.40.101主机名: k8s-node1 步骤 1: 配置虚拟机环境 1.1 设置主机名 在每台虚拟机上设置唯一的主机名…...

【mysql部署】在ubuntu22.04上安装和配置mysql教程

一.安装mysql 1. 更新软件包列表: sudo apt-get update2.安装 MySQL 服务器&#xff1a; sudo apt-get install mysql-server3.设置 MySQL 安全性&#xff1a; sudo mysql_secure_installation按照提示输入相关问题的回答&#xff0c;例如删除匿名用户、禁止 root 远程登录…...

机器学习实战(3):线性回归——预测连续变量

第3集&#xff1a;线性回归——预测连续变量 在机器学习的世界中&#xff0c;线性回归是最基础、最直观的算法之一。它用于解决回归问题&#xff0c;即预测连续变量&#xff08;如房价、销售额等&#xff09;。尽管简单&#xff0c;但线性回归却是许多复杂模型的基石。今天我们…...

烧结银在 DeepSeek 中的关键作用与应用前景

烧结银在 DeepSeek 中的关键作用与应用前景 在科技飞速发展的当下&#xff0c;DeepSeek 作为前沿科技领域的重要参与者&#xff0c;正以其独特的技术和创新的应用&#xff0c;在众多行业掀起变革的浪潮。而在 DeepSeek 的核心技术体系中&#xff0c;烧结银这一材料的应用&#…...

C++效率掌握之STL库:string底层剖析

文章目录 1.学习string底层的必要性2.string类对象基本函数实现3.string类对象的遍历4.string类对象的扩容追加5.string类对象的插入、删除6.string类对象的查找、提取、大小调整7.string类对象的流输出、流提取希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力…...

计算机组成原理—— 总线系统(十一)

在追求梦想的旅途中&#xff0c;我们常常会遇到崎岖的道路和难以预料的风暴。然而&#xff0c;正是这些挑战塑造了我们的坚韧和毅力&#xff0c;使我们能够超越自我&#xff0c;触及那些看似遥不可及的目标。不要因为一时的困境而气馁&#xff0c;也不要因为他人的质疑而动摇自…...

电子制造企业数字化转型实战:基于Odoo构建MES平台的深度解决方案

作者背景 拥有8年乙方项目经理经验、8年甲方信息化管理经验&#xff0c;主导过12个Odoo制造业项目落地&#xff0c;服务客户涵盖消费电子、汽车电子、工业设备等领域。本文基于华东某电子企业&#xff08;以下简称"A公司"&#xff09;的实战案例&#xff0c;解析行业…...

【Python爬虫(4)】揭开Python爬虫的神秘面纱:基础概念全解析

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

kafka为什么这么快?

前言 Kafka的高效有几个关键点&#xff0c;首先是顺序读写。磁盘的顺序访问速度其实很快&#xff0c;甚至比内存的随机访问还要快。Kafka在设计上利用了这一点&#xff0c;将消息顺序写入日志文件&#xff0c;这样减少了磁盘寻道的时间&#xff0c;提高了吞吐量。与传统数据库的…...

书籍推荐:《书法课》林曦

记得樊登老师说过&#xff0c;如果你想了解一个事物&#xff0c;就去读5本相关的书&#xff0c;你会比大部分人都更了解它。这是我读的第4本和“书法”有关的书&#xff0c;作为一个零基础的成年人&#xff0c;林曦这本《书法课》非常值得一读。&#xff08;无论你是否写字&…...

位图(C语言版)

文章目录 位图模型基本操作实现代码运行结果 应用存储只有两种状态的数据排序并去重 位图 模型 位图是“位”的数组。 为什么需要构建一个专门的数据结构来表示位的数组&#xff1f;&#xff1a;因为计算机最小的寻址单位是字节&#xff0c;而不是位。 位图是一种内存紧凑的…...

使用C#元组实现列表分组汇总拼接字段

文章目录 使用C#元组实现列表分组汇总拼接字段代码运行结果 使用C#元组实现列表分组汇总拼接字段 代码 string message string.empty; var tupleList new List<Tuple<string, string, string>>(); tupleList.Add(new Tuple<string, string, string>("…...

淘宝API数据采集接口||调用步骤详解

### 一、注册与认证 1. **注册淘宝开发者账号**&#xff1a; * 访问淘宝开放平台官网&#xff0c;点击“立即入驻”按钮&#xff0c;按照提示完成注册流程。注册过程中需要提供企业名称、联系人信息等基本信息。 2. **创建应用**&#xff1a; * 注册成功后&#xff0c;登录淘…...

C# 调用 C++ 动态库接口

在 C# 中调用 C 动态库接口&#xff0c;通常需要通过 P/Invoke (Platform Invocation Services) 来与 C 代码交互 1. 准备 C 动态库 假设你有一个 C 动态库&#xff0c;其中包含如下函数&#xff1a; extern "C" char* getLocationURL(const char* package_name, …...

fastadmin 接口请求提示跨域

问题描述 小程序项目&#xff0c;内嵌h5页面&#xff0c;在h5页面调用后端php接口&#xff0c;提示跨域。网上查找解决方案如下&#xff1a; 1&#xff0c;设置header // 在入口文件index.php直接写入直接写入 header("Access-Control-Allow-Origin:*"); header(&q…...