简单向量存储 - 最大边缘相关性检索¶
本 Notebook 探索了 MMR 检索的使用 [1]。通过使用最大边缘相关性,可以迭代地找到与先前结果不同的文档。事实证明,这可以提高 LLM 检索的性能 [2]。
最大边缘相关性算法如下:$$ \text{{MMR}} = \arg\max_{d_i \in D \setminus R} [ \lambda \cdot Sim_1(d_i, q) - (1 - \lambda) \cdot \max_{d_j \in R} Sim_2(d_i, d_j) ] $$
这里,D 是所有候选文档的集合,R 是已选文档的集合,q 是查询,$Sim_1$ 是文档与查询之间的相似性函数,$Sim_2$ 是两个文档之间的相似性函数。$d_i$ 和 $d_j$ 分别是 D 和 R 中的文档。
参数 λ (mmr_threshold) 控制相关性(第一项)和多样性(第二项)之间的权衡。如果 mmr_threshold 接近 1,则更强调相关性,而 mmr_threshold 接近 0 则更强调多样性。
下载数据
%pip install llama-index-embeddings-openai
%pip install llama-index-llms-openai
!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
import os
os.environ["OPENAI_API_KEY"] = "sk-..."
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.core import Settings
Settings.llm = OpenAI(model="gpt-3.5-turbo", temperature=0.2)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# llama_index/docs/examples/data/paul_graham
documents = SimpleDirectoryReader("./data/paul_graham/").load_data()
index = VectorStoreIndex.from_documents(documents)
# To use mmr, set it as a vector_store_query_mode
query_engine = index.as_query_engine(vector_store_query_mode="mmr")
response = query_engine.query("What did the author do growing up?")
print(response)
The author wrote short stories and also worked on programming, specifically on an IBM 1401 computer in 9th grade.
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("./data/paul_graham/").load_data()
index = VectorStoreIndex.from_documents(documents)
# To set the threshold, set it in vector_store_kwargs
query_engine_with_threshold = index.as_query_engine(
vector_store_query_mode="mmr", vector_store_kwargs={"mmr_threshold": 0.2}
)
response = query_engine_with_threshold.query(
"What did the author do growing up?"
)
print(response)
The author wrote short stories and also worked on programming, specifically on an IBM 1401 computer in 9th grade. They later got a microcomputer, a TRS-80, and started programming more extensively, including writing simple games and a word processor.
注意,节点得分将根据阈值进行缩放,并且还会因与先前节点的相似性而受到惩罚。当阈值接近 1 时,得分将变得相等,并且将忽略与先前节点的相似性,从而关闭 MMR 的影响。通过降低阈值,算法将更倾向于更多样化的文档。
index1 = VectorStoreIndex.from_documents(documents)
query_engine_no_mrr = index1.as_query_engine()
response_no_mmr = query_engine_no_mrr.query(
"What did the author do growing up?"
)
index2 = VectorStoreIndex.from_documents(documents)
query_engine_with_high_threshold = index2.as_query_engine(
vector_store_query_mode="mmr", vector_store_kwargs={"mmr_threshold": 0.8}
)
response_low_threshold = query_engine_with_high_threshold.query(
"What did the author do growing up?"
)
index3 = VectorStoreIndex.from_documents(documents)
query_engine_with_low_threshold = index3.as_query_engine(
vector_store_query_mode="mmr", vector_store_kwargs={"mmr_threshold": 0.2}
)
response_high_threshold = query_engine_with_low_threshold.query(
"What did the author do growing up?"
)
print(
"Scores without MMR ",
[node.score for node in response_no_mmr.source_nodes],
)
print(
"Scores with MMR and a threshold of 0.8 ",
[node.score for node in response_high_threshold.source_nodes],
)
print(
"Scores with MMR and a threshold of 0.2 ",
[node.score for node in response_low_threshold.source_nodes],
)
Scores without MMR [0.38770109812709, 0.38159007522004046] Scores with MMR and a threshold of 0.8 [0.07754021962541802, -0.31606868760500917] Scores with MMR and a threshold of 0.2 [0.31016236260600616, 0.1845257045929435]
仅检索演示¶
通过设置较小的块大小并调整“mmr_threshold”参数,我们可以看到检索结果如何从高度多样化(且不太相关)变为多样性较低(且更相关/冗余)。
我们尝试以下值:0.1, 0.5, 0.8, 1.0
# llama_index/docs/examples/data/paul_graham
documents = SimpleDirectoryReader("../data/paul_graham/").load_data()
index = VectorStoreIndex.from_documents(
documents,
)
retriever = index.as_retriever(
vector_store_query_mode="mmr",
similarity_top_k=3,
vector_store_kwargs={"mmr_threshold": 0.1},
)
nodes = retriever.retrieve(
"What did the author do during his time in Y Combinator?"
)
from llama_index.core.response.notebook_utils import display_source_node
for n in nodes:
display_source_node(n, source_length=1000)
节点 ID: 72313b35-f0dc-4abb-919c-a440aebf0398
相似性 0.05985031885642464
文本: 3月11日,杰西卡和我从晚餐后走回家,在花园街和沃克街的拐角处,这三条思路汇聚了。去他的那些犹豫不决的风险投资人吧。我们自己创办一家投资公司,并真正实施我们一直在谈论的想法。我来出资,杰西卡可以辞掉工作,来为它工作,我们还会让罗伯特和特雷弗也成为合伙人。[13]\n\n无知再一次对我们有利。我们不知道如何做天使投资人,而且在2005年的波士顿也没有像Ron Conways那样的人可以学习。所以我们只是做了看起来显而易见的选择,我们做的一些事情结果是新颖的。\n\nY Combinator有多个组成部分,我们并非一下子就全部弄明白。我们最先弄清楚的部分是成为一家天使公司。在那些日子里,“天使”和“公司”这两个词并不常放在一起。有风险投资公司,它们是组织化的公司,有专门负责投资的人,但它们只做大的、百万美元的投资...
节点 ID: d18deb5b-7d2a-4d3d-a30f-a180a1cb7015
文本: 我不想退学,但还有什么办法可以出去呢?我记得我的朋友罗伯特·莫里斯(Robert Morris)因为写了1988年的互联网蠕虫而被康奈尔大学开除时,我很羡慕他找到了这样一个引人注目的方式来摆脱研究生院。\n\n然后,在1990年4月的一天,墙上出现了一道裂缝。我碰到了Cheatham教授,他问我是否可以赶在六月毕业。我当时一个论文的字都没写,但那肯定是我一生中最快的思考,我决定在截止日期前剩余的5周左右的时间里尝试写一篇,尽可能重复利用《On Lisp》中的部分内容,然后我能够毫不迟疑地回答:“是的,我想可以。几天后我会给你一些东西看。”\n\n我选择了续延的应用作为主题。回想起来,我应该写宏和嵌入式语言。那里有一个几乎未被探索的完整世界。但我想要的只是出去...
节点 ID: 13c6f611-ac9f-47af-b76d-7e40ea16f7ed
相似性 -0.38235343418846846
文本: [18] 离开 YC 最糟糕的事情就是不能再和杰西卡一起工作了。我们认识的大部分时间里都在一起做 YC,而且我们既没有尝试也没有想把它与我们的个人生活分开,所以离开就像拔掉一棵根深蒂固的树。\n\n[19] 要更精确地描述“发明”与“发现”的概念,一种方法是谈论外星人。例如,任何足够先进的外星文明肯定会知道勾股定理。我相信,尽管没那么确定,他们也会知道麦卡锡 1960 年论文中的 Lisp。\n\n但如果真是这样,也没有理由认为这就是他们可能知道的语言的极限。大概外星人也需要数字、错误和 I/O。所以很可能存在至少一条从麦卡锡的 Lisp 出发,沿途保留“发现”性的路径。\n\n感谢 Trevor Blackwell, John Collison, Patrick Collison, Daniel Gackle, Ralph Hazell, Jessica Livingston, Robert Mor...
然后,在1990年4月的一天,墙上出现了一道裂缝。我遇到了Cheatham教授,他问我是否进展顺利,足以在当年六月毕业。我的学位论文一个字都还没写,但在我一生中最快的思考过程中,我决定利用剩下的大约五周时间尝试写一篇论文,尽可能重用我在《论Lisp》中的内容。我随即毫不迟疑地回答道:“是的,我想可以。过几天我就给您一些东西看。”
我选择了Continuations的应用作为主题。回想起来,我本应该写关于宏和嵌入式语言的内容。那是一个几乎尚未被探索的完整世界。但我当时只想着完成...
节点 ID: 13c6f611-ac9f-47af-b76d-7e40ea16f7ed
相似性 -0.3384054315291212
文本: [18] 离开YC最糟糕的事情就是不能再和Jessica一起工作了。我们认识的大部分时间里都在一起做YC,我们既没有试图也没有想过要把工作和个人生活分开,所以离开就像拔起一棵根深蒂固的大树。
[19] 要更精确地描述“发明”与“发现”的概念,可以谈论外星人。例如,任何足够先进的外星文明肯定会知道勾股定理。我相信,尽管不太确定,他们也会知道McCarthy在1960年论文中提出的Lisp。
但如果是这样,就没有理由认为这就是他们可能知道的语言的极限。想必外星人也需要数字、错误和输入/输出。因此,从McCarthy的Lisp中至少存在一条路径,沿着这条路径“发现性”得以保留,这似乎是可能的。
感谢 Trevor Blackwell, John Collison, Patrick Collison, Daniel Gackle, Ralph Hazell, Jessica Livingston, Robert Mor...
retriever = index.as_retriever(
vector_store_query_mode="mmr",
similarity_top_k=3,
vector_store_kwargs={"mmr_threshold": 0.5},
)
nodes = retriever.retrieve(
"What did the author do during his time in Y Combinator?"
)
for n in nodes:
display_source_node(n, source_length=1000)
节点 ID: 72313b35-f0dc-4abb-919c-a440aebf0398
相似性 0.29925159428212317
文本: 3月11日,杰西卡和我从晚餐后走回家,在花园街和沃克街的拐角处,这三条思路汇聚了。去他的那些犹豫不决的风险投资人吧。我们自己创办一家投资公司,并真正实施我们一直在谈论的想法。我来出资,杰西卡可以辞掉工作,来为它工作,我们还会让罗伯特和特雷弗也成为合伙人。[13]\n\n无知再一次对我们有利。我们不知道如何做天使投资人,而且在2005年的波士顿也没有像Ron Conways那样的人可以学习。所以我们只是做了看起来显而易见的选择,我们做的一些事情结果是新颖的。\n\nY Combinator有多个组成部分,我们并非一下子就全部弄明白。我们最先弄清楚的部分是成为一家天使公司。在那些日子里,“天使”和“公司”这两个词并不常放在一起。有风险投资公司,它们是组织化的公司,有专门负责投资的人,但它们只做大的、百万美元的投资...
节点 ID: d18deb5b-7d2a-4d3d-a30f-a180a1cb7015
文本: 我不想退学,但还有什么办法可以出去呢?我记得我的朋友罗伯特·莫里斯(Robert Morris)因为写了1988年的互联网蠕虫而被康奈尔大学开除时,我很羡慕他找到了这样一个引人注目的方式来摆脱研究生院。\n\n然后,在1990年4月的一天,墙上出现了一道裂缝。我碰到了Cheatham教授,他问我是否可以赶在六月毕业。我当时一个论文的字都没写,但那肯定是我一生中最快的思考,我决定在截止日期前剩余的5周左右的时间里尝试写一篇,尽可能重复利用《On Lisp》中的部分内容,然后我能够毫不迟疑地回答:“是的,我想可以。几天后我会给你一些东西看。”\n\n我选择了续延的应用作为主题。回想起来,我应该写宏和嵌入式语言。那里有一个几乎未被探索的完整世界。但我想要的只是出去...
节点 ID: 13c6f611-ac9f-47af-b76d-7e40ea16f7ed
相似性 -0.06720844682537574
文本: [18] 离开YC最糟糕的事情就是不能再和Jessica一起工作了。我们认识的大部分时间里都在一起做YC,我们既没有试图也没有想过要把工作和个人生活分开,所以离开就像拔起一棵根深蒂固的大树。
[19] 要更精确地描述“发明”与“发现”的概念,可以谈论外星人。例如,任何足够先进的外星文明肯定会知道勾股定理。我相信,尽管不太确定,他们也会知道McCarthy在1960年论文中提出的Lisp。
但如果是这样,就没有理由认为这就是他们可能知道的语言的极限。想必外星人也需要数字、错误和输入/输出。因此,从McCarthy的Lisp中至少存在一条路径,沿着这条路径“发现性”得以保留,这似乎是可能的。
感谢 Trevor Blackwell, John Collison, Patrick Collison, Daniel Gackle, Ralph Hazell, Jessica Livingston, Robert Mor...
节点 ID: 6a638da9-f42f-4be6-a415-9698fd9636f9
相似性 0.036928354116716855
文本: 同时,我一直在越来越多地听说这个叫做万维网的新事物。我在剑桥拜访罗伯特·莫里斯时,他向我展示了它,他当时正在哈佛读研究生。在我看来,万维网将会是件大事。我看到图形用户界面如何提高了微型计算机的普及度。看起来网络也会对互联网产生同样的效果。\n\n如果我想致富,这就是下一趟即将发车的列车。关于这一点我是对的。但我错的是那个想法。我决定我们应该创办一家公司,把艺术画廊搬到线上。坦白说,读了这么多 Y Combinator 的申请后,我不能说这是有史以来最糟糕的创业想法,但它确实很糟糕。艺术画廊不想上网,现在也不想,尤其是那些高端的。他们不是这样卖东西的。我写了一些软件来为画廊生成网站,罗伯特写了一些来调整图片大小并设置一个 http 服务器来提供页面。然后我们尝试签下画廊...
如果我想致富,这里就是下一班即将出发的列车。这一点我判断对了。我判断错的是想法。我决定我们应该创办一家公司,将美术馆搬到网上。坦白地说,读了这么多Y Combinator的申请书后,我不能说这是有史以来最糟糕的创业想法,但它也位列其中。美术馆不想上网,现在也不想,尤其是那些高档美术馆。那不是他们销售的方式。我写了一些软件来为美术馆生成网站,Robert写了一些软件来调整图片大小并设置HTTP服务器来提供页面。然后我们试图签下美术馆...
retriever = index.as_retriever(
vector_store_query_mode="mmr",
similarity_top_k=3,
vector_store_kwargs={"mmr_threshold": 0.8},
)
nodes = retriever.retrieve(
"What did the author do during his time in Y Combinator?"
)
for n in nodes:
display_source_node(n, source_length=1000)
节点 ID: 72313b35-f0dc-4abb-919c-a440aebf0398
相似性 0.4788025508513971
文本: 3月11日,杰西卡和我从晚餐后走回家,在花园街和沃克街的拐角处,这三条思路汇聚了。去他的那些犹豫不决的风险投资人吧。我们自己创办一家投资公司,并真正实施我们一直在谈论的想法。我来出资,杰西卡可以辞掉工作,来为它工作,我们还会让罗伯特和特雷弗也成为合伙人。[13]\n\n无知再一次对我们有利。我们不知道如何做天使投资人,而且在2005年的波士顿也没有像Ron Conways那样的人可以学习。所以我们只是做了看起来显而易见的选择,我们做的一些事情结果是新颖的。\n\nY Combinator有多个组成部分,我们并非一下子就全部弄明白。我们最先弄清楚的部分是成为一家天使公司。在那些日子里,“天使”和“公司”这两个词并不常放在一起。有风险投资公司,它们是组织化的公司,有专门负责投资的人,但它们只做大的、百万美元的投资...
节点 ID: d18deb5b-7d2a-4d3d-a30f-a180a1cb7015
文本: 我不想退学,但还有什么办法可以出去呢?我记得我的朋友罗伯特·莫里斯(Robert Morris)因为写了1988年的互联网蠕虫而被康奈尔大学开除时,我很羡慕他找到了这样一个引人注目的方式来摆脱研究生院。\n\n然后,在1990年4月的一天,墙上出现了一道裂缝。我碰到了Cheatham教授,他问我是否可以赶在六月毕业。我当时一个论文的字都没写,但那肯定是我一生中最快的思考,我决定在截止日期前剩余的5周左右的时间里尝试写一篇,尽可能重复利用《On Lisp》中的部分内容,然后我能够毫不迟疑地回答:“是的,我想可以。几天后我会给你一些东西看。”\n\n我选择了续延的应用作为主题。回想起来,我应该写宏和嵌入式语言。那里有一个几乎未被探索的完整世界。但我想要的只是出去...
节点 ID: 555f8603-79f5-424c-bfef-b7a8d9523d4c
相似性 0.30086405397508975
文本: [15] 我们收到了225份夏季创始人计划的申请,惊讶地发现其中很多申请者已经毕业,或者即将在那个春天毕业。这个SFP项目已经开始让我们觉得比原计划要更认真了。
我们邀请了这225个团队中的大约20个进行现场面试,并从中挑选了8个进行资助。他们是一群令人印象深刻的人。第一批团队包括reddit,后来创立Twitch的Justin Kan和Emmett Shear,已经帮助撰写RSS规范并几年后成为开放获取烈士的Aaron Swartz,以及后来成为YC第二任总裁的Sam Altman。我认为第一批如此优秀并非完全靠运气。你必须足够大胆才能报名参加夏季创始人计划这样古怪的项目,而不是去微软或高盛这样正规的地方找暑期工作。
针对初创公司的协议基于我们与Julian达成的协议(1万美元换10%)和...
节点 ID: d1a19a77-93e2-4f5b-8eb2-b7f265f15ec2
相似性 0.29257547208236784
文本: 低声望的工作本身并非就好。但当你发现自己尽管当前缺乏声望却仍然被某种工作吸引时,这既是一个迹象表明其中有真实的发现空间,也表明你的动机是正确的。不纯粹的动机是雄心勃勃者的巨大危险。如果说有什么会让你误入歧途,那就是想要打动别人的渴望。因此,虽然从事没有声望的事情并不能保证你走在正确的轨道上,但至少可以保证你没有走在最常见的那条错误轨道上。
接下来的几年里,我写了很多关于各种不同主题的文章。O'Reilly将其中一些文章结集出版了一本书,名为《黑客与画家》,书名取自其中的一篇文章。我还研究了垃圾邮件过滤器,并又画了一些画。我过去每周四晚上都会为一群朋友举办晚宴,这教会了我如何为群体烹饪。我还买下了剑桥的另一栋建筑,一座前糖果厂...
retriever = index.as_retriever(
vector_store_query_mode="mmr",
similarity_top_k=3,
vector_store_kwargs={"mmr_threshold": 1.0},
)
nodes = retriever.retrieve(
"What did the author do during his time in Y Combinator?"
)
for n in nodes:
display_source_node(n, source_length=1000)
节点 ID: 72313b35-f0dc-4abb-919c-a440aebf0398
相似性 0.5985031885642463
文本: 3月11日,杰西卡和我从晚餐后走回家,在花园街和沃克街的拐角处,这三条思路汇聚了。去他的那些犹豫不决的风险投资人吧。我们自己创办一家投资公司,并真正实施我们一直在谈论的想法。我来出资,杰西卡可以辞掉工作,来为它工作,我们还会让罗伯特和特雷弗也成为合伙人。[13]\n\n无知再一次对我们有利。我们不知道如何做天使投资人,而且在2005年的波士顿也没有像Ron Conways那样的人可以学习。所以我们只是做了看起来显而易见的选择,我们做的一些事情结果是新颖的。\n\nY Combinator有多个组成部分,我们并非一下子就全部弄明白。我们最先弄清楚的部分是成为一家天使公司。在那些日子里,“天使”和“公司”这两个词并不常放在一起。有风险投资公司,它们是组织化的公司,有专门负责投资的人,但它们只做大的、百万美元的投资...
节点 ID: d18deb5b-7d2a-4d3d-a30f-a180a1cb7015
文本: 我不想退学,但还有什么办法可以出去呢?我记得我的朋友罗伯特·莫里斯(Robert Morris)因为写了1988年的互联网蠕虫而被康奈尔大学开除时,我很羡慕他找到了这样一个引人注目的方式来摆脱研究生院。\n\n然后,在1990年4月的一天,墙上出现了一道裂缝。我碰到了Cheatham教授,他问我是否可以赶在六月毕业。我当时一个论文的字都没写,但那肯定是我一生中最快的思考,我决定在截止日期前剩余的5周左右的时间里尝试写一篇,尽可能重复利用《On Lisp》中的部分内容,然后我能够毫不迟疑地回答:“是的,我想可以。几天后我会给你一些东西看。”\n\n我选择了续延的应用作为主题。回想起来,我应该写宏和嵌入式语言。那里有一个几乎未被探索的完整世界。但我想要的只是出去...
节点 ID: 555f8603-79f5-424c-bfef-b7a8d9523d4c
相似性 0.5814802966348447
文本: [15] 我们收到了225份夏季创始人计划的申请,惊讶地发现其中很多申请者已经毕业,或者即将在那个春天毕业。这个SFP项目已经开始让我们觉得比原计划要更认真了。
我们邀请了这225个团队中的大约20个进行现场面试,并从中挑选了8个进行资助。他们是一群令人印象深刻的人。第一批团队包括reddit,后来创立Twitch的Justin Kan和Emmett Shear,已经帮助撰写RSS规范并几年后成为开放获取烈士的Aaron Swartz,以及后来成为YC第二任总裁的Sam Altman。我认为第一批如此优秀并非完全靠运气。你必须足够大胆才能报名参加夏季创始人计划这样古怪的项目,而不是去微软或高盛这样正规的地方找暑期工作。
针对初创公司的协议基于我们与Julian达成的协议(1万美元换10%)和...
节点 ID: 23010353-0f2b-4c4f-9ff0-7c1f1201edac
相似性 0.562748668285032
文本: 当我在YC处理一些紧急问题时,大约有60%的可能性与HN有关,而40%的可能性与所有其他事情加起来有关。[17]
除了HN,我用Arc编写了YC所有的内部软件。但当我继续在Arc中进行大量工作时,我逐渐停止了对Arc本身的开发,部分原因是我没有时间,部分原因是现在所有的基础设施都依赖于它,再修改语言变得吸引力小了很多。所以现在我的三个项目减少到了两个:写文章和做YC。
YC与我做过的其他类型的工作不同。我不再自己决定做什么,而是问题主动找上我。每隔六个月就有一批新的初创公司,他们的问题,无论是什么,都变成了我们的问题。这是非常有吸引力的工作,因为他们的问题非常多样,而且好的创始人非常有效率。如果你想在短期内学到关于初创公司尽可能多的东西...