周杰伦《青花瓷》存到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系统如何结合检索到的相关信息和语言模型的理解能力,生成一个全面、相关且有洞察力的回答。它不仅回答了问题,还提供了额外的上下文和解释,使回答更加丰富和有意义。
那么,如何系统的去学习大模型LLM?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。
但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~
篇幅有限,部分资料如下:
👉LLM大模型学习指南+路线汇总👈
💥大模型入门要点,扫盲必看!
💥既然要系统的学习大模型,那么学习路线是必不可少的,这份路线能帮助你快速梳理知识,形成自己的体系。
路线图很大就不一一展示了 (文末领取)
👉大模型入门实战训练👈
💥光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉国内企业大模型落地应用案例👈
💥两本《中国大模型落地应用案例集》 收录了近两年151个优秀的大模型落地应用案例,这些案例覆盖了金融、医疗、教育、交通、制造等众多领域,无论是对于大模型技术的研究者,还是对于希望了解大模型技术在实际业务中如何应用的业内人士,都具有很高的参考价值。 (文末领取)
👉GitHub海量高星开源项目👈
💥收集整理了海量的开源项目,地址、代码、文档等等全都下载共享给大家一起学习!
👉LLM大模型学习视频👈
💥观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。 (文末领取)
👉640份大模型行业报告(持续更新)👈
💥包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
👉获取方式:
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓