LangChain 学习(二)

devtools/2024/10/11 6:51:32/

将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/devtools/124036.html

相关文章

jmeter学习(7)beanshell

beanshell preprocessor 发送请求前执行 beanshell postprocessor 发送请求前执行 获取请求相关信息 String body sampler.getArguments().getArgument(0).getValue(); String url sampler.getPath(); 获取响应报文 String responseprev.getResponseDataAsString(); 获…

【uniapp小程序】使用cheerio去除字符串中的HTML标签并获取纯文本内容

【uniapp小程序】使用cheerio去除字符串中的HTML标签并获取纯文本内容 参考资料安装引入使用 参考资料 【博主:AIpoem】uniapp小程序 使用cheerio处理网络请求拿到的dom数据 cheerio文档:https://github.com/cheeriojs/cheerio/wiki/Chinese-README 安…

Python 如何使用 Redis 作为缓存

Python 如何使用 Redis 作为缓存 一、引言 在现代 Web 应用程序和数据密集型服务中,性能 和 响应速度 是至关重要的因素。而当应用需要频繁访问相同的数据时,直接从数据库获取数据会耗费大量的时间和资源。因此,缓存系统成为了提升性能的重…

ai智能电话机器人的核心技术有哪些?

ai智能电话机器人是一种高智能语音系统,它能够非常智能化的和用户进行畅通的交流,而不会存在任何的障碍问题,这个主要是由于它使用了很多的核心技术,我们一起来看看有哪些核心技术。 1.VAD 准确定位语音的开始点和结束点&#x…

YOLO11改进|注意力机制篇|引入全局上下文注意力机制GCA

目录 一、【】注意力机制1.1【GCA】注意力介绍1.2【GCA】核心代码 二、添加【GCA】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【】注意力机制 1.1【GCA】注意力介绍 下图是【GCA】的结构图,让我们简单分析一下…

基于RAMS的台风苏拉(Saola)模拟预报深入分析引言

台风苏拉(Saola)是近年来对我国沿海地区造成严重影响的热带气旋之一。准确模拟和预报苏拉的路径和强度,对于防灾减灾具有重要意义。区域大气模拟系统(RAMS)作为一款功能强大的数值天气预报模型,能够提供精细…

云原生化 - 工具镜像(简约版)

在微服务和云原生环境中,容器化的目标之一是尽可能保持镜像小型化以提高启动速度和减少安全风险。然而,在实际操作中,有时候需要临时引入一些工具来进行调试、监控或问题排查。Kubernetes提供了临时容器(ephemeral containers&…

智能听诊器:宠物健康管理的革命

智能听诊器不仅仅是一个简单的监测工具,它代表了宠物健康管理的一次革命。通过收集和分析宠物的生理数据,智能听诊器能够帮助宠物主人和医生更好地理解宠物的健康需求,从而提供更加个性化的护理方案。 智能听诊器通过高精度的传感器&#xf…