LangChain 学习(二)

server/2024/12/22 18:21:52/

将PDF文档中的内容嵌入到Milvus数据库中。具体步骤如下:

  1. 加载文档:使用PyPDFLoader从指定路径加载PDF文件。

  2. 拆分文档:使用CharacterTextSplitter将文档拆分成较小的文本块。

  3. 创建嵌入对象:使用BERT模型。

  4. 文本块嵌入:对文本块进行嵌入。

  5. 连接Milvus:通过提供连接信息连接到Milvus数据库。

  6. 定义集合模式:定义包含ID、嵌入向量和文本字段的集合模式。

  7. 创建集合:检查集合是否存在,如果不存在则创建。

  8. 准备数据:准备要插入的ID、嵌入向量和文本内容。

  9. 插入数据:将数据插入到Milvus中。

  10. 刷新集合:确保数据写入成功。

import osimport torch
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
from pymilvus import connections, utility, FieldSchema, CollectionSchema, DataType, Collection
from transformers import AutoTokenizer, AutoModel, BertTokenizer# Step 1: 加载文档目录中PDF文件
loader = PyPDFLoader("pdf/AI大模型.pdf")
documents = loader.load()# 查看加载的文档
# print(f"加载 {len(documents)} 页文档。")
# total_text_length = sum(len(doc.page_content) for doc in documents)
# print(f"文本总长度: {total_text_length} 字符。")# Step 2: 拆分文档
# 使用字符文本拆分器,将文档拆分成较小的块
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200) # 自定义块大小
spli_docx = text_splitter.split_documents(documents=documents)# Step 3: 创建 BERT模型 嵌入对象
# model_name = "sentence-transformers/all-MiniLM-L6-v2"  # 可以选择其他模型
# tokenizer = AutoTokenizer.from_pretrained(model_name)
model_name = "bert-base-chinese"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)# 警告是因为 Hugging Face 的 huggingface_hub 在 Windows 系统上无法使用符号链接(symlinks)进行缓存,导致使用缓存时效率较低,并且占用更多磁盘空间。
# 禁用该警告
os.environ["HF_HUB_DISABLE_SYMLINKS_WARNING"] = "1"
# Step 4: 对拆分的文本块进行嵌入
def get_embeddings(text):try:inputs = tokenizer(text, padding=True, truncation=True, return_tensors="pt")with torch.no_grad():embeddings = model(**inputs).last_hidden_state[:, 0, :] # 获取[CLS]标记的嵌入return embeddingsexcept Exception as e:print(f"错误处理文本信息: {text[:50]}...")  # 打印部分文本以便调试print(f"异常信息: {e}")return None  # 或者返回一个默认值# 对拆分的文本块进行嵌入
doc_embeddings = []
texts = []
ids = []  # ID 列表
for id, doc in enumerate(spli_docx):embedding = get_embeddings(doc.page_content)if embedding is not None: # 确保只有有效的嵌入被添加# 将嵌入向量展平为列表并确保是浮点数doc_embeddings.append(embedding.flatten().tolist())  # 将嵌入展平并转为列表texts.append(doc.page_content)  # 保存对应的文本ids.append(id) # 使用自增的整数作为 ID# 打印嵌入结果
# print(doc_embeddings)# Step 5: 连接到 Milvus 数据库
connections.connect(host="127.99.199.88", port="19530", alias="default", user="root", password="Milvus2020")# Step 6: 定义 Milvus 集合的 schema
fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False),  # 主键字段FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768),  # 假设嵌入向量维度为 768FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=5000)
]
schema = CollectionSchema(fields=fields, description="文档嵌入")# Step 7: 创建集合(如果不存在)
collection_name = "document_chinese_embeddings"
if not utility.has_collection(collection_name):collection = Collection(name=collection_name, schema=schema)
else:collection = Collection(name=collection_name)# Step 8: 准备数据
data = [ids,  # 主键IDdoc_embeddings,  # 确保每个嵌入都是浮点数texts # 文本内容
]# 打印嵌入结果以进行检查
for i, embed in enumerate(doc_embeddings):print(f"嵌入向量 {i} 的长度: {len(embed)}, 类型: {type(embed[0])}, 内容: {embed[:5]}")  # 打印前五个值# Step 9: 将数据插入到 Mivus
collection.insert(data)# Step 10: 刷新集合以确保数据写入
collection.flush()print("数据插入 Milvus 成功!")

http://www.ppmy.cn/server/129960.html

相关文章

蓝桥杯备赛---2.新建工程

推荐根据视频进行工程建立 开发板资源简介&工程模板建立_哔哩哔哩_bilibili 目录 推荐根据视频进行工程建立 1.点击"File"下的"New Project"新建一个工程 ​编辑 2. 查看官方给的数据手册,选择对于的单片机型号 3. 查看原理图&#…

解读飞创直线电机模组在工业自动化领域的应用价值

在自动化行业中,直线电机模组通常被用来移动整个系统或设备,或者用来控制零部件的准确位置,它们可以在非常短的时间内完成高精度的线性运动,具有高度的可靠性和稳定性。还可以与其他电气设备和传感器相连接,以实现复杂…

selenium获取cookie的方法

from selenium import webdriver# 使用Chrome浏览器驱动程序 driver webdriver.Chrome()# 打开网页 driver.get("https://example.com")# 第一种方法执行JavaScript代码获取Cookie cookie driver.execute_script("return document.cookie")# 输出Cookie …

JS | 如何解决ajax无法后退的问题?

Ajax请求通常不支持浏览器的后退按钮,因为它们是异步的,不会导致页面重新加载(刷新)。但如果你想要用户能够通过浏览器的后退按钮回到之前的页面状态,你可以通过几种方法来解决这个问题: 1、使用pushState和replaceState方法 hi…

[单master节点k8s部署]32.ceph分布式存储(三)

基于ceph rbd生成pv 在集群中认证ceph 用下面代码生成ceph的secret .创建 ceph 的 secret,在 k8s 的控制节点操作: 回到 ceph 管理节点创建 pool 池: [rootmaster1-admin ~]# ceph osd pool create k8stest 56 pool k8stest created [rootm…

【JS】微任务和宏任务执行顺序

JavaScript中的宏任务(Macro Task)和微任务(Micro Task)执行顺序遵循一个规则:先执行当前宏任务的所有微任务,然后再执行下一个宏任务。 常见的宏任务包括: 整体的脚本代码setTimeoutsetInter…

MVVM 架构模式:解耦、可测试与高效

在现代的前端开发中,MVVM(Model-View-ViewModel)已成为非常流行的设计模式,尤其是在单页面应用(SPA)开发中。它通过解耦视图和业务逻辑,提升了代码的可维护性和扩展性。今天我们来深入探讨MVVM …

【Vue】vue-admin-template项目搭建

准备 node环境 node:v16.12.0npm:8.1.0 vue-element-admin下载 官网:https://panjiachen.github.io/vue-element-admin-site/guide/ 我这边下载的是4.4.0版本的,使用其他版本可能会因为所需要的node和npm版本过低或过高导致异常…