我遇到的业务问题实际上是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日对中国进行了访问,这是四年多来澳大利亚外长首次访华,标志着中澳关系迈出重要一步。黄英贤表示,她将在同王毅的会晤中推动贸易限制措施的取消,并称两国关系中有许多棘手问题,需要时间根据双方各自利益去解决。黄英贤此次访问也引起了媒体的广泛关注,被认为是中澳关系正在慢慢解冻的信号。