周杰伦《青花瓷》存到Langchain向量数据库,该怎么做?RAG增强后的回答居然如此智能了吗?

周杰伦《青花瓷》存到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:  
天青色等烟雨 而我在等你  
炊烟袅袅升起 隔江千万里  
在瓶底书汉隶仿前朝的飘逸  
就当我为遇见你伏笔  

这个结果告诉我们几点信息:

  1. 相关性: 向量数据库成功找到了与"青花瓷的颜色"相关的文本块。第一个结果直接提到了"青花",第二个结果提到了"天青色",这两个都与青花瓷的颜色有关。

  2. 上下文: 每个结果都包含了完整的文本块,而不仅仅是单个句子,这有助于保持上下文的完整性。

  3. 排序: 结果是按相关性排序的。第一个结果直接提到"青花",因此可能被认为比第二个结果更相关。

  4. 检索数量: 我们设置了 k=2,所以返回了两个最相关的文本块。

  5. 语义理解: 即使第二个结果没有直接提到"青花瓷",但它提到了"天青色",这表明向量搜索能够捕捉到一定程度的语义相关性。

这个例子展示了向量数据库如何有效地检索相关信息。它不仅仅是基于简单的关键词匹配,而是能够理解查询的语义,并返回相关的上下文信息。

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系统的几个关键特点:

  1. 问题重述: 系统首先重复了用户的问题,确保回答的针对性。

  2. 综合回答: 回答不仅仅列出了颜色,还提供了上下文和解释。它综合了从检索到的文档中获得的信息。

  3. 多个颜色的识别: 系统不仅识别出直接提到的颜色(如青色),还推断出了隐含的颜色(如白色和粉色)。

  4. 重点强调: 回答指出了青色,特别是"天青色"是最突出的颜色,这与青花瓷的特征相符。

  5. 源文档引用: 系统显示了用于生成回答的原始文档片段。这些文档确实包含了与颜色相关的关键信息。

  6. 上下文理解: 系统不仅仅是机械地提取颜色词,还理解了一些隐喻和暗示(如"素胚"暗示白色,"牡丹"暗示粉色)。

这个例子展示了RAG系统如何结合检索到的相关信息和语言模型的理解能力,生成一个全面、相关且有洞察力的回答。它不仅回答了问题,还提供了额外的上下文和解释,使回答更加丰富和有意义。

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

大模型知识脑图

为了成为更好的 AI大模型 开发者,这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

经典书籍阅读

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。

在这里插入图片描述

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下

在这里插入图片描述

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值