微信扫码
添加专属顾问
在前面的课程中,我们已经介绍了关于文本数据如何被载入并进行切分,以及如何将这部分切分后的文本数据进行向量化后存储在我们的向量数据库当中。完成了以上的步骤其实就是意味着我们前期数据处理工作已经完成了,即便是我们需要载入更多的数据存储到向量数据库中,我们只需要重复上述的步骤即可。在上节课的末尾,我们简单尝试了一下在向量数据库中通过similarity_search的方式进行相关数据的检索,那这节课我们来更加深入的阐述一下这部分的内容。
那对于Retrival这个事情而言,除了最基本的similarity_search通过计算计算查询向量和所有候选文档向量之间的相似度以外,我们其实还有一些其他的方法,包括Maximum Marginal Relevance(MMR,最大边际相关性)、Metadata(元数据)以及LLM Aided Retrieval(大型语言模型辅助检索)等。那下面我们将逐一介绍一下这些方法。
Similarity Search(相似度搜索) 是向量数据库中最基础的检索方法之一。它通过计算查询向量与数据库中所有文档向量之间的相似度,来找到与查询最相关的文档。通常使用的相似度度量方法包括 余弦相似度、欧氏距离 等,这些方法能够有效衡量两个向量在高维空间中的接近程度。
在相似度搜索中,用户输入一个查询,系统会将这个查询转化为一个向量,然后与数据库中的向量进行比较,从而找到最相似的内容。这种方法的优点在于它的简单和直观,适合用于快速找到与查询内容高度相关的结果。例如,当用户查询“深度学习的基本概念”时,相似度搜索能够返回与“深度学习”内容最接近的文档片段。
相似度搜索提供了直接匹配用户查询的能力,是许多向量数据库的基础检索方式。然而,单纯依赖相似度搜索可能导致结果的多样性不足,因为它仅关注与查询的匹配程度,而忽略了内容之间的差异性。在一些应用场景下,特别是需要覆盖多个不同方面的信息时,Maximum Marginal Relevance (MMR) 这样的扩展方法可以更好地平衡相关性和多样性。
在信息检索和自然语言处理领域,检索最相似的信息并非总是最优的选择,特别是在用户需求涵盖多个不同方面时,仅选择与查询最相似的响应可能会造成信息重复,缺乏多样性。为了解决这一问题,Maximum Marginal Relevance (MMR) 方法应运而生。MMR 通过在相关性和多样性之间进行权衡,从而优化最终检索结果,使用户能够获得既相关又互补的信息。
如图所示,当用户提出查询(例如"Tell me about all-white mushrooms with large fruiting bodies")时,系统会尝试寻找与查询最相似的响应。然而,完全基于相关性的检索可能会忽略信息的多样性。例如,如果只选择最相似的响应,得到的结果可能会非常相似,甚至包含重复的内容。这时,虽然每个结果与查询的相似度都很高,但它们却未能提供全面且多样化的内容。
MMR 的核心思想是平衡相关性与多样性,即在选择与查询最相关的信息的同时,也要确保这些信息在内容上具有多样性。通过减少信息之间的重复性,MMR 能够帮助用户获得更加全面和丰富的知识视角,涵盖不同的细节和角度,而不仅仅是获取多个相似的答案。例如,在检索某一特定主题的文档时,MMR 不仅会选出与查询高度匹配的结果,还会确保所选文档在涵盖的内容和信息层次上存在差异,从而使得用户得到的结果既有深度又有广度。
MMR 算法的具体工作流程可以通过下图来理解,下面逐步分解介绍其主要步骤:
查询向量存储(Query the Vector Store)
选择最相似的响应(Choose the fetch_k most similar responses)
k 个响应(这些响应的相似性是基于余弦相似度等度量方法计算的)。这部分的结果确保了选出的内容是对查询最有意义、最相关的。在相似响应中选择最具多样性的结果(Within those responses choose the k most diverse)
k 个最相似响应中,MMR 方法会进一步选择出 k 个最具多样性的响应。通过计算每对响应之间的相似度,MMR 会偏好那些彼此差异较大的结果,以增加信息的覆盖面。这一过程确保了返回的结果不仅仅是“最相似”,更是“互补的”。MMR 的关键在于它通过一个权重参数(通常表示为 λ)来实现对相关性和多样性的平衡。当 λ 趋向于 1 时,MMR 更偏重选择与查询最相似的响应;而当 λ 接近于 0 时,MMR 更倾向于增加检索结果的多样性。通过调节这一权重,MMR 能够适应不同的检索场景。
MMR 方法在许多信息检索和推荐系统中得到了广泛应用。它在解决那些信息覆盖面广泛的问题上尤为有效,特别是用户的需求涉及多个不同方面时。比如在搜索与某一主题相关的文档时,MMR 可以帮助系统同时返回一些具体细节的内容,以及一些覆盖整个主题的概述性文档,从而让用户对所查询的主题有更完整的理解。但其实究其本质还是基于similarity_search的方法,但是就像大语言模型一样需要调整一下temperature的值使其随机性更高,更符合人类日常说话的状态。因为说话永远没有所谓的最优解,我们都会有一些灵光一闪的时候。
在信息检索过程中,如何提高检索的精度,特别是在面对大量、复杂的文档时,是一个非常重要的问题。在前面我们提到向量数据库中的similarity_search以及Maximum Marginal Relevance可以帮助我们找到与查询内容最相似的文档,但有时,仅依靠相似度还不够精确,尤其当用户的查询具有非常明确的限定条件时。为了解决这种情况,我们可以借助元数据(Metadata)来进一步提高检索的准确性。
元数据提供了与每个嵌入的文本片段相关的上下文信息,这些信息可以用来更好地限定检索的范围。例如,当用户询问特定课程的内容时,我们不希望返回其他课程的结果。为此,许多向量数据库都支持在检索时对元数据进行操作,这使得检索变得更加准确。
以如下查询为例:
问题:"第三讲中提到回归分析的内容是什么?"
在这个问题中,用户明确希望得到第三讲的内容。因此,如果我们不对查询进行任何过滤,那么可能会得到来自其他讲次的相关内容。为了解决这一问题,我们可以利用元数据中的信息,在similarity_search时加入过滤条件,例如指定源文件为"docs/cs229_lectures/MachineLearning-Lecture03.pdf",确保只从特定的文档中进行检索。这样做就能精确地找到用户想要的内容,而不会被其他不相关的讲次干扰。
元数据的使用不仅限于来源文档的过滤,还可以包括诸如页码、作者、时间戳等各种信息,这些信息都可以在检索时作为过滤条件,提高查询的精确性。
下面就让我们进入实战的环节来尝试一下如何实现向量数据库检索吧!主要包的环境版本如下所示:
langchain 0.3.0
langchain-community 0.3.0
pypdf 5.0.0
openai 1.47.0
beautifulsoup4 4.12.3
chromadb 0.5.15
首先我们要先运行一下上一期内容“吴恩达DeepLearning.AI课程系列 —— 大模型检索增强生成(三):向量数据库及嵌入”的代码,从而在指定的位置生成出相关的Chroma数据库后我们才能开始本次的操作。只要看到该文件生成即代表数据库创建完毕。
下面我们新建一个名为retrieval.py的文件来将测试数据库是否正确生成的代码写入并查看。假如能够正常打印出数值则代表没有问题。
from langchain_community.embeddings import BaichuanTextEmbeddings
from langchain_chroma import Chroma # 从 langchain_chroma 中引用 Chroma 类
persist_directory = r'D:\langchain'
# 初始化嵌入
embeddings = BaichuanTextEmbeddings(baichuan_api_key="sk-xxx") # 查看上期内容并填入对应的百川API Key
# 使用 embedding_function 参数初始化 Chroma
vectordb = Chroma(
persist_directory=persist_directory,
embedding_function=embeddings
)
# 打印集合中的文档数量
print(vectordb._collection.count())
那我们首先可以尝试一下最基础的方法,就是我们的Similarity Search。我们可以在上面代码的基础上添加以下内容。我们问一下大语言模型是怎么样推理的来从网页里(尤其是目录)中找到对应的内容。
# 定义问题,即要查询的内容
question = "大语言模型是怎么推理的?"
# 在向量数据库中进行相似性搜索,查找与给定问题最相似的 3 个文档
docs_ss = vectordb.similarity_search(question, k=2)
# 输出最相似的文档中前 100 个字符的内容
print(docs_ss[0].page_content[:100])
print(docs_ss[1].page_content[:100])
我们在终端的结果中可以看到输出的内容。这部分内容确实与推理息息相关。
# 第一部分
9. 现代循环神经网络
9.1. 门控循环单元(GRU)
9.2. 长短期记忆网络(LSTM)
9.3. 深度循环神经网络
9.4. 双向循环神经网络
9.5. 机器翻译与数据集
9.6. 编码器-解
# 第二部分
10. 注意力机制
10.1. 注意力提示
10.2. 注意力汇聚:Nadaraya-Watson 核回归
10.3. 注意力评分函数
10.4. Bahdanau 注意力
10.5. 多头注意力
我们也可以尝试一下使用MMR的方法进行检索看是否效果更好。
# 定义问题,即要查询的内容
question = "大语言模型是怎么推理的?"
docs_mmr = vectordb.max_marginal_relevance_search(question,k=2)
print(docs_mmr[0].page_content[:100])
print(docs_mmr[1].page_content[:100])
我们发现输出的内容有些许的问题。首先是终端先显示了一个警告说默认的返回内容为20个,比我们数据库里包含的18个内容要多。然后我们发现虽然第一部分内容是一致的,而这个第二部分的内容和之前有点不同,但是显然这部分内容的相近程度没有上面直接使用Similarity Search的接近。从这里我们也可以看出添加了随机性后模型的效果未必会好。
# 警告内容
Number of requested results 20 is greater than number of elements in index 18,
updating n_results = 18
# 第一部分内容
9. 现代循环神经网络
9.1. 门控循环单元(GRU)
9.2. 长短期记忆网络(LSTM)
9.3. 深度循环神经网络
9.4. 双向循环神经网络
9.5. 机器翻译与数据集
9.6. 编码器-解
# 第二部分内容
Vardhman Mahaveer Open University
Vietnamese-German University
Vignana Jyothi Institute
为了消除警告内容,我们就需要添加一个额外的参数fetch_k = 8。这个参数指在进行 最大边际相关性 搜索时,初始化从数据库中提取的 候选文档数量。也就是说,在做最终选择之前,docs_mmr会从数据库中取出与 question 最相似的 8 个文档,然后从这些候选文档中选出 k=2 个文档,来最大化它们之间的多样性。
docs_mmr = vectordb.max_marginal_relevance_search(question,k=2, fetch_k=8)
print(docs_mmr[0].page_content[:100])
print(docs_mmr[1].page_content[:100])
当我们再次运行程序时,警告就消失了。
9. 现代循环神经网络
9.1. 门控循环单元(GRU)
9.2. 长短期记忆网络(LSTM)
9.3. 深度循环神经网络
9.4. 双向循环神经网络
9.5. 机器翻译与数据集
9.6. 编码器-解
Vardhman Mahaveer Open University
Vietnamese-German University
Vignana Jyothi Institute
当然其实我们也可以通过调整fetch_k的值来控制随机答案的生成,比如我们可以尝试fetch = 2和fetch = 3。首先我们试试fetch_k=2的情况。
docs_mmr = vectordb.max_marginal_relevance_search(question,k=2, fetch_k=2)
print(docs_mmr[0].page_content[:100])
print(docs_mmr[1].page_content[:100])
所得的结果和前面Similarity Search是一模一样的。这是因为我们就从里面找到两个概率最高的内容,然后k=2的情况就把所有这两个都拿过来了,并没有能够随机的地方。
9. 现代循环神经网络
9.1. 门控循环单元(GRU)
9.2. 长短期记忆网络(LSTM)
9.3. 深度循环神经网络
9.4. 双向循环神经网络
9.5. 机器翻译与数据集
9.6. 编码器-解
10. 注意力机制
10.1. 注意力提示
10.2. 注意力汇聚:Nadaraya-Watson 核回归
10.3. 注意力评分函数
10.4. Bahdanau 注意力
10.5. 多头注意力
假如fetch = 3时。
docs_mmr = vectordb.max_marginal_relevance_search(question,k=2, fetch_k=3)
print(docs_mmr[0].page_content[:100])
print(docs_mmr[1].page_content[:100])
所得的结果就有所不同,这个时候由于找到另外一块内容,为了满足随机的要求,因此就必然会将这部分内容进行展示。
9. 现代循环神经网络
9.1. 门控循环单元(GRU)
9.2. 长短期记忆网络(LSTM)
9.3. 深度循环神经网络
9.4. 双向循环神经网络
9.5. 机器翻译与数据集
9.6. 编码器-解
参考文献
Table Of Contents
前言
安装
符号
1. 引言
2. 预备知识
2.1. 数据操作
2.2. 数据预处理
2.3. 线性代数
2.4.
所以我们可以看到在方法MMR中我们可以根据各种参数来对其进行调整从而能够输出更随机更多样的内容。
更进一步,我们也可以用检索特定元数据来进行更精确的搜索。我们可以先查查看我们的内容有哪些可能的元数据。
# 假设你有一个 vectordb 对象,并且可以获取所有文档
all_docs = vectordb.similarity_search("", k=18) # 可以使用一个空查询或任意查询返回多个文档
# 遍历文档并输出每个文档的元数据
for i, doc in enumerate(all_docs):
print(f"Document {i+1} metadata: {doc.metadata}")
我们可以在终端里看到,由于我们都是在一个链接里进行搜索的,所以所有的元数据都是一样的。
"metadata": {
"source": "<https://zh.d2l.ai/>",
"language": "en",
"title": "《动手学深度学习》 — 动手学深度学习 2.0.0 documentation",
}
那这个时候其实我们也可以尝试添加一些新的内容进去,大家可以在上期代码的基础上加上以下的代码(在运行前可以将原本数据库删除,不然会一直添加)。
# 添加新文档
new_loader = WebBaseLoader("<https://www.deeplearning.ai/>") # 新文档来源
new_docs = new_loader.load()
# 文本切分
new_splits = text_splitter.split_documents(new_docs)
# 添加到现有的向量库
vectordb.add_documents(new_splits)
# 输出更新后的文档数量
print(f"更新后的文档数量: {vectordb._collection.count()}")
运行后我们可以看到的结果为新的网址提供了额外了两份内容。
初始文档数量: 18
更新后的文档数量: 20
这个时候我们再查看里面的元数据会发现有额外两条新的内容。
Document 8 metadata: {'description': 'DeepLearning.AI | Andrew Ng | Join over 7 million people learning how to use and build AI through our online courses. Earn certifications, level up your skills, and stay ahead of the industry.', 'language': 'en', 'source': '<https://www.deeplearning.ai/>', 'title': 'DeepLearning.AI: Start or Advance Your Career in AI'}
Document 18 metadata: {'description': 'DeepLearning.AI | Andrew Ng | Join over 7 million people learning how to use and build AI through our online courses. Earn certifications, level up your skills, and stay ahead of the industry.', 'language': 'en', 'source': '<https://www.deeplearning.ai/>', 'title': 'DeepLearning.AI: Start or Advance Your Career in AI'}
这时候我们可以通过文章来源尝试一下在similarity searchsh上假如元数据的搜索。
question = "大语言模型是怎么推理的?"
docs_meta = vectordb.similarity_search(question, k=1, filter={"source": "<https://www.deeplearning.ai/>"})
print(docs_meta[0].page_content[:100])
这个时候我们发现结果就只会出现DeepLearning.AI网页里的内容了。
prevnextIn Collaboration WithprevnextThe largest weekly AI newsletterWhat matters in AI right nowOct
main.py[1] —— 前期准备
from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import BaichuanTextEmbeddings
from langchain_chroma import Chroma
# 文件导入
loader = WebBaseLoader("<https://zh.d2l.ai/>")
docs = loader.load()
# 文本切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 1500,
chunk_overlap = 150
)
splits = text_splitter.split_documents(docs)
print(len(splits))
# 文本嵌入
embeddings = BaichuanTextEmbeddings(baichuan_api_key="sk-83842453061e34d80b392edba11f62fe")
# 测试
# text_1 = "今天天气不错"
# query_result = embeddings.embed_query(text_1)
# print(query_result)
# 路径设置
persist_directory = r'D:\langchain'
# 向量库创建
vectordb = Chroma.from_documents(
documents=splits,
embedding=embeddings,
persist_directory=persist_directory
)
print(vectordb._collection.count())
# # 检索
# question = "图像识别"
# docs = vectordb.similarity_search(question,k=3)
# print(len(docs))
# print(docs[0].page_content)
# 添加新文档
new_loader = WebBaseLoader("<https://www.deeplearning.ai/>") # 新文档来源
new_docs = new_loader.load()
# 文本切分
new_splits = text_splitter.split_documents(new_docs)
# 添加到现有的向量库
vectordb.add_documents(new_splits)
# 输出更新后的文档数量
print(f"更新后的文档数量: {vectordb._collection.count()}")
retrieval.py[2] —— 检索方法
from langchain_community.embeddings import BaichuanTextEmbeddings
from langchain_chroma import Chroma # 从 langchain_chroma 中引用 Chroma 类
persist_directory = r'D:\langchain'
# 初始化嵌入
embeddings = BaichuanTextEmbeddings(baichuan_api_key="sk-83842453061e34d80b392edba11f62fe")
# 使用 embedding_function 参数初始化 Chroma
vectordb = Chroma(
persist_directory=persist_directory,
embedding_function=embeddings
)
# 打印集合中的文档数量
# print(vectordb._collection.count())
# question = "大语言模型是怎么推理的?"
# docs_ss = vectordb.similarity_search(question,k=2)
# print(docs_ss[0].page_content[:100])
# print(docs_ss[1].page_content[:100])
# docs_mmr = vectordb.max_marginal_relevance_search(question,k=2, fetch_k=3)
# print(docs_mmr[0].page_content[:100])
# print(docs_mmr[1].page_content[:100])
# 假设你有一个 vectordb 对象,并且可以获取所有文档
# all_docs = vectordb.similarity_search("", k=20) # 可以使用一个空查询或任意查询返回多个文档
# # 遍历文档并输出每个文档的元数据
# for i, doc in enumerate(all_docs):
# print(f"Document {i+1} metadata: {doc.metadata}")
question = "大语言模型是怎么推理的?"
docs_meta = vectordb.similarity_search(question, k=1, filter={"source": "<https://www.deeplearning.ai/>"})
print(docs_meta[0].page_content[:100])
总的来说,在这篇文章中,我们深入探讨了如何在向量数据库中进行更加精准的检索,从基础的相似度搜索到更高级的检索方法,例如 Maximum Marginal Relevance (MMR) 和 元数据辅助检索,并结合了 大型语言模型(LLM) 来提高检索的智能化水平。相似度搜索为我们提供了最直接的查询匹配,而 MMR 方法在相关性和多样性之间找到了平衡,使检索结果更全面。在元数据辅助检索中,我们可以利用元数据过滤条件进行精确搜索,避免无关内容的干扰。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-02
企业级知识图谱的实体架构治理实践
2026-07-02
一文讲清:“统一语义”、“构建本体”、“AI推理”这三者的关系
2026-07-02
graphify + claude 图谱关系
2026-07-01
把运维能力装进 Qoder,一句话就能定位根因
2026-07-01
Gbrain、GraphRAG、LLM Wiki、Graphify:4 种知识图谱方案怎么选
2026-07-01
一文讲清:本体(Ontology)与语义(Semantics)到底是什么关系?
2026-06-30
从 OOP 到本体:用形式语义支撑 AI 协作方法论
2026-06-29
从“领域描述”到“本体”——AI时代的系统设计模式探讨
2026-04-07
2026-04-19
2026-04-23
2026-04-22
2026-06-03
2026-04-23
2026-05-26
2026-05-07
2026-05-28
2026-05-23
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。