周杰伦《青花瓷》存到Langchain向量数据库,该怎么做?
1. 准备歌词文本
首先,我们需要准备歌词文本。这里是《青花瓷》的部分歌词:
lyrics = """
素胚勾勒出青花笔锋浓转淡
瓶身描绘的牡丹一如你初妆
冉冉檀香透过窗心事我了然
宣纸上走笔至此搁一半
釉色渲染仕女图韵味被私藏
而你嫣然的一笑如含苞待放
你的美一缕飘散
去到我去不了的地方
天青色等烟雨 而我在等你
炊烟袅袅升起 隔江千万里
在瓶底书汉隶仿前朝的飘逸
就当我为遇见你伏笔
天青色等烟雨 而我在等你
月色被打捞起 晕开了结局
如传世的青花瓷自顾自美丽
你眼带笑意
"""
2. 创建文本分割器和嵌入模型
我们将使用CharacterTextSplitter
来分割文本,并使用OpenAIEmbeddings
来创建嵌入。
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 创建文本分割器
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=100,
chunk_overlap=20,
length_function=len
)
# 分割文本
chunks = text_splitter.split_text(lyrics)
# 创建嵌入模型
embeddings = OpenAIEmbeddings()
3. 解释chunk的结果
让我们看看分割后的chunks:
for i, chunk in enumerate(chunks):
print(f"Chunk {i+1}:")
print(chunk)
print("---")
输出可能类似于:
Chunk 1:
素胚勾勒出青花笔锋浓转淡
瓶身描绘的牡丹一如你初妆
冉冉檀香透过窗心事我了然
宣纸上走笔至此搁一半
---
Chunk 2:
宣纸上走笔至此搁一半
釉色渲染仕女图韵味被私藏
而你嫣然的一笑如含苞待放
你的美一缕飘散
去到我去不了的地方
---
Chunk 3:
天青色等烟雨 而我在等你
炊烟袅袅升起 隔江千万里
在瓶底书汉隶仿前朝的飘逸
就当我为遇见你伏笔
---
Chunk 4:
天青色等烟雨 而我在等你
月色被打捞起 晕开了结局
如传世的青花瓷自顾自美丽
你眼带笑意
每个chunk包含了大约100个字符,并且有20个字符的重叠,以保持上下文的连贯性。
4. 存储到向量数据库
现在,我们将这些chunks存储到Chroma向量数据库中:
vectorstore = Chroma.from_texts(chunks, embeddings)
5. 查看VectorStoreIndex
Chroma没有直接的方法来查看完整的索引,但我们可以通过执行一些查询来了解索引的内容:
# 执行相似性搜索
query = "青花瓷的颜色"
docs = vectorstore.similarity_search(query, k=2)
print(f"查询: '{query}'")
for i, doc in enumerate(docs):
print(f"\n结果 {i+1}:")
print(doc.page_content)
这将返回与查询最相关的两个文本块。
6. 使用RAG系统回答问题
最后,让我们创建一个简单的RAG系统来回答关于歌词的问题:
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 创建检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
# 设置语言模型
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# 创建QA链
qa_chain = RetrievalQA.from_chain_type(
llm,
retriever=retriever,
return_source_documents=True
)
# 提问
question = "这首歌中描述了什么颜色?"
result = qa_chain({"query": question})
print("问题:", question)
print("\n回答:", result["result"])
print("\n使用的源文档:")
for doc in result["source_documents"]:
print(doc.page_content)
7. 大致的执行结果:
查询: '青花瓷的颜色'
结果 1:
素胚勾勒出青花笔锋浓转淡
瓶身描绘的牡丹一如你初妆
冉冉檀香透过窗心事我了然
宣纸上走笔至此搁一半
结果 2:
天青色等烟雨 而我在等你
炊烟袅袅升起 隔江千万里
在瓶底书汉隶仿前朝的飘逸
就当我为遇见你伏笔
这个结果告诉我们几点信息:
-
相关性: 向量数据库成功找到了与"青花瓷的颜色"相关的文本块。第一个结果直接提到了"青花",第二个结果提到了"天青色",这两个都与青花瓷的颜色有关。
-
上下文: 每个结果都包含了完整的文本块,而不仅仅是单个句子,这有助于保持上下文的完整性。
-
排序: 结果是按相关性排序的。第一个结果直接提到"青花",因此可能被认为比第二个结果更相关。
-
检索数量: 我们设置了
k=2
,所以返回了两个最相关的文本块。 -
语义理解: 即使第二个结果没有直接提到"青花瓷",但它提到了"天青色",这表明向量搜索能够捕捉到一定程度的语义相关性。
这个例子展示了向量数据库如何有效地检索相关信息。它不仅仅是基于简单的关键词匹配,而是能够理解查询的语义,并返回相关的上下文信息。
8. 进阶:VectorStoreIndex的取值
直接查看 VectorStoreIndex 的内部结构通常比较困难,因为大多数向量数据库(包括 Chroma)并没有提供直接访问其内部索引的方法。然而,我们可以通过一些间接的方法来了解 VectorStoreIndex 的内容和结构。以下是几种可能的方法:
8.1 使用 Chroma 的内部方法(不推荐用于生产环境):
# 注意:这种方法依赖于 Chroma 的内部实现,可能随版本变化而改变
collection = vectorstore._collection
print("Collection name:", collection.name)
print("Number of documents:", collection.count())
# 获取所有文档的 ID
ids = collection.get(include=['documents'])['ids']
print("Document IDs:", ids)
# 获取所有嵌入向量
embeddings = collection.get(include=['embeddings'])['embeddings']
print("Number of embeddings:", len(embeddings))
print("Dimension of embeddings:", len(embeddings[0]))
8.2 使用 Chroma 的 API 方法:
# 获取集合中的所有元素
results = vectorstore.get()
print("Number of documents:", len(results['ids']))
print("Document IDs:", results['ids'])
print("Metadata:", results['metadatas'])
print("Documents:", results['documents'])
8.3 遍历所有文档:
# 获取所有文档
all_docs = vectorstore.similarity_search("", k=vectorstore._collection.count())
for i, doc in enumerate(all_docs):
print(f"Document {i+1}:")
print("Content:", doc.page_content)
print("Metadata:", doc.metadata)
print("---")
8.4 查看向量的统计信息:
import numpy as np
# 获取所有嵌入向量
embeddings = vectorstore._collection.get(include=['embeddings'])['embeddings']
# 计算统计信息
mean_vector = np.mean(embeddings, axis=0)
std_vector = np.std(embeddings, axis=0)
print("Number of vectors:", len(embeddings))
print("Vector dimension:", len(embeddings[0]))
print("Mean of vectors:", mean_vector[:5], "...") # 只显示前5个元素
print("Standard deviation of vectors:", std_vector[:5], "...")
8.5 可视化向量分布(需要安装 matplotlib):
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 使用 PCA 将高维向量降到 2D 进行可视化
pca = PCA(n_components=2)
embeddings_2d = pca.fit_transform(embeddings)
plt.figure(figsize=(10, 8))
plt.scatter(embeddings_2d[:, 0], embeddings_2d[:, 1])
plt.title("2D Visualization of Document Embeddings")
plt.xlabel("First Principal Component")
plt.ylabel("Second Principal Component")
plt.show()
8.6 执行结果展示:
好的,让我为您展示一下执行这些方法的可能结果。我会为每种方法提供一个示例输出。
1)使用 Chroma 的内部方法:
Collection name: langchain
Number of documents: 4
Document IDs: ['1', '2', '3', '4']
Number of embeddings: 4
Dimension of embeddings: 1536
2)使用 Chroma 的 API 方法:
Number of documents: 4
Document IDs: ['1', '2', '3', '4']
Metadata: [{'source': 'chunk1'}, {'source': 'chunk2'}, {'source': 'chunk3'}, {'source': 'chunk4'}]
Documents: [
'素胚勾勒出青花笔锋浓转淡\n瓶身描绘的牡丹一如你初妆\n冉冉檀香透过窗心事我了然\n宣纸上走笔至此搁一半',
'宣纸上走笔至此搁一半\n釉色渲染仕女图韵味被私藏\n而你嫣然的一笑如含苞待放\n你的美一缕飘散\n去到我去不了的地方',
'天青色等烟雨 而我在等你\n炊烟袅袅升起 隔江千万里\n在瓶底书汉隶仿前朝的飘逸\n就当我为遇见你伏笔',
'天青色等烟雨 而我在等你\n月色被打捞起 晕开了结局\n如传世的青花瓷自顾自美丽\n你眼带笑意'
]
3)遍历所有文档:
Document 1:
Content: 素胚勾勒出青花笔锋浓转淡
瓶身描绘的牡丹一如你初妆
冉冉檀香透过窗心事我了然
宣纸上走笔至此搁一半
Metadata: {'source': 'chunk1'}
---
Document 2:
Content: 宣纸上走笔至此搁一半
釉色渲染仕女图韵味被私藏
而你嫣然的一笑如含苞待放
你的美一缕飘散
去到我去不了的地方
Metadata: {'source': 'chunk2'}
---
(... 其他文档省略 ...)
4)查看向量的统计信息:
Number of vectors: 4
Vector dimension: 1536
Mean of vectors: [-0.00234, 0.00789, -0.00123, 0.00456, -0.00987, ...]
Standard deviation of vectors: [0.02345, 0.01987, 0.03456, 0.02789, 0.03123, ...]
5)可视化向量分布:
这个方法会生成一个散点图,显示文档嵌入在二维空间中的分布。图形可能看起来像这样:
[一个散点图,x轴是"First Principal Component",y轴是"Second Principal Component",
图中有4个点,代表4个文档的嵌入向量在二维空间的投影]
9. 再次基于该增强型的RAG系统来回答问题
当然,我很乐意为您展示第6步使用RAG系统回答问题的执行结果。以下是一个可能的输出示例:
问题: 这首歌中描述了什么颜色?
回答: 根据歌词,这首歌中描述了几种颜色:
1. 青色: 歌词中多次提到"青花"和"天青色"。青花瓷的主要颜色就是青色。
2. 白色: 虽然没有直接提到,但"素胚"暗示了瓷器的白色底色。
3. 粉色: 歌词中提到"牡丹"和"含苞待放",暗示了粉色调。
4. 灰色: "烟雨"和"炊烟"可能暗示了灰色调。
主要强调的是青色,特别是"天青色",这是青花瓷的标志性颜色。
使用的源文档:
1. 素胚勾勒出青花笔锋浓转淡
瓶身描绘的牡丹一如你初妆
冉冉檀香透过窗心事我了然
宣纸上走笔至此搁一半
2. 天青色等烟雨 而我在等你
炊烟袅袅升起 隔江千万里
在瓶底书汉隶仿前朝的飘逸
就当我为遇见你伏笔
这个输出展示了RAG系统的几个关键特点:
-
问题重述: 系统首先重复了用户的问题,确保回答的针对性。
-
综合回答: 回答不仅仅列出了颜色,还提供了上下文和解释。它综合了从检索到的文档中获得的信息。
-
多个颜色的识别: 系统不仅识别出直接提到的颜色(如青色),还推断出了隐含的颜色(如白色和粉色)。
-
重点强调: 回答指出了青色,特别是"天青色"是最突出的颜色,这与青花瓷的特征相符。
-
源文档引用: 系统显示了用于生成回答的原始文档片段。这些文档确实包含了与颜色相关的关键信息。
-
上下文理解: 系统不仅仅是机械地提取颜色词,还理解了一些隐喻和暗示(如"素胚"暗示白色,"牡丹"暗示粉色)。
这个例子展示了RAG系统如何结合检索到的相关信息和语言模型的理解能力,生成一个全面、相关且有洞察力的回答。它不仅回答了问题,还提供了额外的上下文和解释,使回答更加丰富和有意义。
最后的最后
感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。
因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
大模型知识脑图
为了成为更好的 AI大模型 开发者,这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
经典书籍阅读
阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。
实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
面试资料
我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下
640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】