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大模型?
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
四、AI大模型商业化落地方案
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。