周杰伦《青花瓷》存到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系统如何结合检索到的相关信息和语言模型的理解能力,生成一个全面、相关且有洞察力的回答。它不仅回答了问题,还提供了额外的上下文和解释,使回答更加丰富和有意义。

那么,如何系统的去学习大模型LLM?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~

篇幅有限,部分资料如下:

👉LLM大模型学习指南+路线汇总👈

💥大模型入门要点,扫盲必看!
在这里插入图片描述
💥既然要系统的学习大模型,那么学习路线是必不可少的,这份路线能帮助你快速梳理知识,形成自己的体系。

路线图很大就不一一展示了 (文末领取)
在这里插入图片描述

👉大模型入门实战训练👈

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

👉国内企业大模型落地应用案例👈

💥两本《中国大模型落地应用案例集》 收录了近两年151个优秀的大模型落地应用案例,这些案例覆盖了金融、医疗、教育、交通、制造等众多领域,无论是对于大模型技术的研究者,还是对于希望了解大模型技术在实际业务中如何应用的业内人士,都具有很高的参考价值。 (文末领取)
在这里插入图片描述

👉GitHub海量高星开源项目👈

💥收集整理了海量的开源项目,地址、代码、文档等等全都下载共享给大家一起学习!
在这里插入图片描述

👉LLM大模型学习视频👈

💥观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。 (文末领取)
在这里插入图片描述

👉640份大模型行业报告(持续更新)👈

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

👉获取方式:

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

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

### DeepSeek RAG 模型中的向量数据存储位置 在配置DeepSeek RAG模型的过程中,向量数据的存储位置可以根据不同的应用场景和需求有所不同。对于较小规模的应用,可以选择本地文件系统来保存这些向量化后的数据[^2]。 当涉及到更大规模的数据集或是生产环境下的部署,则更倾向于采用专业的向量数据库来进行管理和优化访问效率。这类解决方案包括但不限于Milvus、Pinecone以及Weaviate等平台,它们能够提供高效的相似度搜索功能并支持分布式架构以应对海量级别的向量索引操作[^1]。 另外,在某些情况下为了充分利用云计算的优势,还可以考虑将生成好的向量上传至云服务商所提供的对象存储服务中去,比如AWS S3或Google Cloud Storage这样的第三方托管方案也十分常见。 综上所述,具体的存储方式需依据实际项目的特性而定: - **本地文件**:适用于小型项目,通常会把向量保存成`.npy`或者`.json`格式; - **向量数据库**:适合较大规模应用,推荐使用专门设计用来处理高维空间内点之间距离计算问题的产品; - **云存储**:如果希望借助公有云设施简化运维复杂度的话,这是个不错的选择。 ```python import numpy as np # 示例:保存为 .npy 文件 embeddings = np.random.rand(10, 5) # 假设这里有一个形状为 (10, 5) 的随机数组代表嵌入向量 np.save('./data/embeddings.npy', embeddings) # 加载已保存的 .npy 文件 loaded_embeddings = np.load('./data/embeddings.npy') print(f"Loaded Embeddings Shape: {loaded_embeddings.shape}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值