VoyageAI 嵌入¶
新的 VoyageAI 嵌入模型原生支持 float、int8、binary 和 ubinary 嵌入。请在此处查看 output_dtype
的描述了解更多详情。
在本 Notebook 中,我们将演示如何使用不同的 models
、input_types
和 embedding_types
来使用 VoyageAI Embeddings
。
如果你在 Colab 中打开此 Notebook,你可能需要安装 LlamaIndex 🦙。
%pip install llama-index-llms-openai
%pip install llama-index-embeddings-voyageai
!pip install llama-index
使用最新的 voyage-3
嵌入。¶
默认的 embedding_type
是 float
。
from llama_index.embeddings.voyageai import VoyageEmbedding
# with input_typ='search_query'
embed_model = VoyageEmbedding(
voyage_api_key="<YOUR_VOYAGE_API_KEY>",
model_name="voyage-3",
)
embeddings = embed_model.get_text_embedding("Hello VoyageAI!")
print(len(embeddings))
print(embeddings[:5])
1024 [-0.010165567509829998, -0.0588739775121212, 0.007418953347951174, 0.004723705351352692, 0.0029206324834376574]
让我们使用 voyage-3-large
模型检查 int8
嵌入类型¶
embed_model = VoyageEmbedding(
voyage_api_key="<YOUR_VOYAGE_API_KEY>",
model_name="voyage-3-large",
output_dtype="int8",
truncation=False,
)
embeddings = embed_model.get_text_embedding("Hello VoyageAI!")
print(len(embeddings))
print(embeddings[:5])
1024 [-37, 41, 5, -1, 10]
深入检查 voyage-3-large
嵌入¶
我们将实验 int8
嵌入类型。
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
from llama_index.core.response.notebook_utils import display_source_node
from IPython.display import Markdown, display
下载数据¶
!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'
--2024-12-21 19:28:14-- https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 2606:50c0:8003::154, 2606:50c0:8000::154, 2606:50c0:8001::154, ... connected. to raw.githubusercontent.com (raw.githubusercontent.com)|2606:50c0:8003::154|:443... 200 OKequest sent, awaiting response... Length: 75042 (73K) [text/plain] Saving to: ‘data/paul_graham/paul_graham_essay.txt’ data/paul_graham/pa 100%[===================>] 73.28K --.-KB/s in 0.02s 2024-12-21 19:28:14 (3.55 MB/s) - ‘data/paul_graham/paul_graham_essay.txt’ saved [75042/75042]
加载数据¶
documents = SimpleDirectoryReader("./data/paul_graham/").load_data()
使用 int8
嵌入类型¶
构建索引¶
llm = OpenAI(
model="command-nightly",
api_key="<YOUR_OPENAI_API_KEY>",
)
embed_model = VoyageEmbedding(
voyage_api_key="<YOUR_VOYAGE_API_KEY>",
model_name="voyage-3-large",
embedding_type="int8",
)
index = VectorStoreIndex.from_documents(
documents=documents, embed_model=embed_model
)
构建检索器¶
search_query_retriever = index.as_retriever()
search_query_retrieved_nodes = search_query_retriever.retrieve(
"What happened in the summer of 1995?"
)
for n in search_query_retrieved_nodes:
display_source_node(n, source_length=2000)
节点 ID: 1c052573-9fef-4f1b-9882-e69db8b7d62a
相似度 0.23402080114051563
文本: 用户只需要一个浏览器即可。
这类软件,被称为网页应用,现在很常见,但当时还不清楚它是否可行。为了弄清这一点,我们决定尝试制作一个可以通过浏览器控制的商店构建器版本。几天后,在 8 月 12 日,我们完成了一个可用的版本。用户界面很糟糕,但它证明了可以通过浏览器构建一个完整的商店,而无需任何客户端软件或在服务器命令行中输入任何内容。
现在我们感觉真的抓住了一些东西。我看到了全新一代软件以这种方式工作的愿景。你不再需要版本、端口或那些麻烦的东西。在 Interleaf,有一个叫做发布工程的整个团队,规模似乎至少和实际编写软件的团队一样大。现在你只需要直接在服务器上更新软件即可。
我们成立了一家新公司,叫做 Viaweb,因为它可以通过网页工作,并从 Idelle 的丈夫 Julian 那里获得了 10,000 美元的种子资金。作为回报,以及他进行的初步法律工作和提供的商业建议,我们给了他公司 10% 的股份。十年后,这笔交易成为了 Y Combinator 的模式。我们知道创始人需要这样的东西,因为我们自己当时就需要。
在这个阶段,我的净资产是负的,因为我银行里那大概一千美元被我欠政府的税款完全抵消了(我是否勤奋地把我为 Interleaf 做咨询赚来的钱按适当比例留出来了?没有,我没有这样做)。所以虽然 Robert 有他的研究生津贴,但我需要那笔种子资金来生活。
我们最初希望在九月推出,但随着工作的深入,我们对软件的野心越来越大。最终,我们成功构建了一个 WYSIWYG(所见即所得)的站点构建器,意思是你在创建页面时,它们看起来和之后生成的静态页面完全一样,只不过不是 le...
节点 ID: 43747196-8c04-4b9a-86dc-94f15e310988
相似度 0.22620195227632825
文本: 不快,但足以测试。
在此期间的大部分时间里,我不得不禁止自己写文章,否则我永远也写不完 Bel。2015 年末,我花了 3 个月写文章,当我回去继续写 Bel 时,我几乎看不懂代码了。倒不是因为写得不好,而是因为问题太错综复杂了。当你在一个用自身编写的解释器上工作时,很难跟踪每个层次发生的事情,而且错误在你得到它们时几乎像被加密了一样。
所以我说,在 Bel 完成之前不再写文章了。但在我写 Bel 的时候,我几乎没告诉别人我在做什么。所以多年来,我看起来好像什么都没做,而实际上我比以往任何时候都工作得更努力。偶尔,在与某个令人厌烦的 bug 搏斗了几个小时后,我会去 Twitter 或 HN 上看看,发现有人问“Paul Graham 还在写代码吗?”
写 Bel 很辛苦,但也很有成就感。我如此投入地工作,以至于在任何时候,我脑子里都有相当一部分代码,并且可以在脑子里继续写。我记得 2015 年一个阳光明媚的日子,带孩子们去海边,看着他们在潮汐池里玩耍,同时想办法处理一些涉及续延的问题。感觉我的人生做得对了。我记得是因为当时对自己觉得如此新奇有点沮丧。好消息是,在接下来的几年里,我有了更多这样的时刻。
2016 年夏天,我们搬到了英格兰。我们想让孩子们看看在另一个国家生活是什么样的,而且由于我是英国公民(出生),这似乎是显而易见的选择。我们本来只打算待一年,但我们太喜欢那里了,以至于现在仍然住在那里。所以 Bel 的大部分是在英格兰写的。
2019 年秋天,Bel 终于完成了。就像 McCarthy 最初的 Lisp 一样,它是一个规范,而不是一个实现,尽管就像 McCarthy 的 Lisp 一样,它是一个用代码表达的规范。
现在我又可以写文章了,我写了一堆关于我积攒下来的主题的文章。...
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open("./data/images/prometheus_paper_card.png")
plt.imshow(img)
<matplotlib.image.AxesImage at 0x33e730550>
embed_model = VoyageEmbedding(
voyage_api_key="<YOUR_VOYAGE_API_KEY>",
model_name="voyage-multimodal-3",
truncation=False,
)
图像嵌入¶
embeddings = embed_model.get_image_embedding(
"./data/images/prometheus_paper_card.png"
)
print(len(embeddings))
print(embeddings[:5])
1024 [0.06298828125, -0.0206298828125, 0.01055908203125, 0.0072021484375, 0.0269775390625]
文本嵌入¶
embeddings = embed_model.get_text_embedding("prometheus evaluation model")
print(len(embeddings))
print(embeddings[:5])
1024 [0.12255859375, -0.0277099609375, 0.028076171875, 0.035888671875, 0.0262451171875]