加载数据,并切分

# Step 3 . WebBaseLoader 配置为专门从 Lilian Weng 的博客文章中抓取和加载内容。它仅针对网页的相关部分(例如帖子内容、标题和标头)进行处理。

加载信息

from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader(web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),bs_kwargs=dict(parse_only=bs4.SoupStrainer(class_=("post-content", "post-title", "post-header"))),
)
Step 4. 使用 RecursiveCharacterTextSplitter 将内容分割成更小的块,这有助于通过将长文本分解为可管理的大小并有一些重叠来保留上下文来管理长文本。
# LangChain 规范下统一的 Document 对象,需要封装成document对象
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
打印预览
# splits 是一个列表,其中每个元素也是一个列表,表示一个文档的分割结果
for doc_index, doc_splits in enumerate(splits):print(f"Document {doc_index + 1}:")  # 显示文档编号for split_index, split_text in enumerate(doc_splits):print(f"  Split {split_index + 1}: {split_text[:50]}...")  # 打印每个分段的前50个字符print("\n" + "-"*60 + "\n")  # 在每个文档之间加入分隔线,增加可读性

 

Step 4. 对每个块,构建Embeddings。 智谱的 GLM Embedding 在线模型:https://open.bigmodel.cn/dev/api#text_embedding

这只是一个例子,实际存储到向量数据库的时候不能直接这样用

embeddings = []from zhipuai import ZhipuAI#GLM 4 官方调用说明:https://open.bigmodel.cn/dev/api#vectorclient = ZhipuAI(api_key="a3e6e780f4be48b3adc831f4269d999b.V3ikmBpvQ06MQPgO")for doc_splits in splits:for split_type, split_content in doc_splits:if split_type == 'page_content' and split_content.strip():  # 确保处理的是 'page_content' 且内容不为空try:response = client.embeddings.create(model="embedding-2",input=split_content)if hasattr(response, 'data'):embeddings.append(response.data[0].embedding)else:print("未能成功获取嵌入向量")except Exception as e:print(f"请求失败,错误信息:{e}")# # 打印嵌入向量
for i, embedding in enumerate(embeddings):print(f"Embedding {i + 1}: {embedding[:3]}...")  # 仅展示前10个值以示例

 

step 5. Chroma 使用 GLM 4 的 Embedding 模型 提供的嵌入从这些块创建向量存储,从而促进高效检索。

到现在已经转化为了向量,然后就是

存储到向量数据库中

因为向量数据库在langchain中接受到的是一个对象,而不是一个列表,所以我们要对智普的模型做一个封装,需要重写两个方法

class EmbeddingGenerator:def __init__(self, model_name):self.model_name = model_nameself.client = ZhipuAI(api_key="a3e6e780f4be48b3adc831f4269d999b.V3ikmBpvQ06MQPgO")def embed_documents(self, texts):embeddings = []for text in texts:response = self.client.embeddings.create(model=self.model_name, input=text)# hasattr用来判断response是否有data属性if hasattr(response, 'data') and response.data:embeddings.append(response.data[0].embedding)else:# 如果获取嵌入失败,返回一个零向量embeddings.append([0] * 1024)  # 假设嵌入向量维度为 1024return embeddingsdef embed_query(self, query):# 使用相同的处理逻辑,只是这次只为单个查询处理response = self.client.embeddings.create(model=self.model_name, input=query)if hasattr(response, 'data') and response.data:return response.data[0].embeddingreturn [0] * 1024  # 如果获取嵌入失败,返回零向量embedding_generator = EmbeddingGenerator(model_name="embedding-2")

 创建向量数据库

# 拿到文本列表,和上面的打印出来遍历是一样的
texts = [content for document in splits for split_type, content in document if split_type == 'page_content']# Step 6. 创建 Chroma VectorStore, 并存入向量。
# 源码:https://api.python.langchain.com/en/latest/_modules/langchain_chroma/vectorstores.html#Chroma
chroma_store = Chroma(collection_name="example_collection",embedding_function=embedding_generator,  # 使用定义的嵌入生成器实例create_collection_if_not_exists=True
)# 添加文本到 Chroma VectorStore
IDs = chroma_store.add_texts(texts=texts)

 这个hub.pull 如果没翻墙的话可能有问题

# 这里从 'hub.pull' 是从某处获取提示的方法,就相当于拉去了一个提示末班
prompt = hub.pull("rlm/rag-prompt")# prompt = """You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.
# Question: {question} 
# Context: {context} 
# Answer:
# """
# ChatPromptTemplate
# # 自定义函数 format_docs 用于适当地格式化这些片段。
def format_docs(docs):return "\n\n".join(doc.page_content for doc in docs)# vectorstore 被转换为一个检索器,能够根据查询获取最相关的文本片段。# Step 7. RAG 链集成了检索、提示工程(通过 hub.pull )和初始化语言模型 ( llm ) 来处理查询并生成响应,最后使用 StrOutputParser 。
"""
其过程如下:
1. 查询输入:字符串“什么是任务分解?”作为输入传递给 rag_chain 。
2. 上下文检索:链的 retriever 组件链接到矢量存储,激活以从索引的博客内容中查找并获取最相关的文本片段。这些片段是根据与问题的语义相似性与查询最匹配的片段。
3. 格式化检索的内容:然后, format_docs 函数获取这些检索到的文档,并将它们格式化为单个字符串,每个文档内容由双换行符分隔。此格式化字符串提供了一个连贯的上下文,其中封装了回答查询所需的所有相关信息。
4. 生成答案:此格式化上下文字符串与查询一起被输入到 glm-4 模型中。该模型使用提供的上下文和查询的细节,根据检索到的信息生成上下文相关且准确的响应。
5. 输出解析:最后, ChatZhipu 模型生成的响应由 StrOutputParser 进行解析,将模型的输出转换为干净的、用户可读的格式。RunnableParallel 可以并发执行多个任务,而 RunnablePassthrough 用于需要顺序执行而不需修改的任务。
"""#
rag_chain = ({"context": retriever | format_docs, "question": RunnablePassthrough()}| prompt| chat| StrOutputParser()
)# Step 8. 进行提问
"""
1. 查询处理:该命令接受查询“什么是任务分解?”并将其传递给 retriever 组件。检索器本质上是系统中的搜索功能,设置为在预先索引的数据集中查找信息 - 这里是根据博客内容创建的矢量存储。
2. 语义搜索:检索器使用向量存储中存储的文本片段的嵌入(向量表示)来执行语义搜索。它将查询的向量表示与存储的片段的向量进行比较,以识别在语义上与查询最相似的片段。
3. 检索相关文本片段:根据相似度分数,检索器从博客中选择并返回与查询最匹配的文本片段。这些片段包含被认为与回答任务分解问题最相关的信息。
"""rag_res = rag_chain.invoke("What is Task Decomposition?")
print(rag_res)# Step 9. 此命令指示 vectorstore 删除其保存的整个数据集合。这里的集合是指所有文档(文本片段)及其相应的已被索引并存储在向量存储中的向量表示的集合。
chroma_store.delete_collection()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI(计算机视觉)自学路线

本文仅用来记录一下自学路线方便日后复习,如果对你自学有帮助的话也很开心o(* ̄▽ ̄*)ブ B站吴恩达机器学习->B站小土堆pytorch基础学习->opencv相关知识(Halcon或者opencv库)->四类神经网络(这里跟…

计算机组成原理——存储系统(二)

🌱 "人生最深的裂痕,往往是光照进来的地方。 别怕脚下的荆棘,那是你与平庸划清界限的勋章;别惧眼前的迷雾,星辰永远藏在云层之上。真正的强者不是从未跌倒,而是把每一次踉跄都踏成攀登的阶梯。记住&am…

解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩

解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩 脚本地址: 项目地址: Gazer PixelWeaver.py pixel_squeezer_cv2.py 前瞻 继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后,本文将介绍如何使用 OpenCV 对这些海报进行智…

OSCP - Proving Grounds - Roquefort

主要知识点 githook 注入Linux path覆盖 具体步骤 依旧是nmap扫描开始,3000端口不是很熟悉,先看一下 Nmap scan report for 192.168.54.67 Host is up (0.00083s latency). Not shown: 65530 filtered tcp ports (no-response) PORT STATE SERV…

记忆化搜索和动态规划 --最长回文子串为例

记忆化搜索 记忆化搜索是一种优化递归算法的方法,通过将已经计算过的子问题的结果存储起来(通常使用哈希表或数组),避免重复计算相同的子问题。 本质上是通过缓存中间结果来减少计算的重复性。 动态规划 动态规划是通过将问题分…

最新功能发布!AllData数据中台核心菜单汇总

🔥🔥 AllData大数据产品是可定义数据中台,以数据平台为底座,以数据中台为桥梁,以机器学习平台为中层框架,以大模型应用为上游产品,提供全链路数字化解决方案。 ✨奥零数据科技官网:http://www.aolingdata.com ✨AllData开源项目:https://github.com/alldatacenter/…

Windows图形界面(GUI)-QT-C/C++ - QT Stacked Widget

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 多步表单 2. 选项卡界面 3. 状态机界面 三、常见样式 四、属性设置 1. 页面管理 2. 布局管理 3. 信号与槽 五、内容处理 1. 添加页面 2. 移除页面 3.…

TensorFlow 简单的二分类神经网络的训练和应用流程

展示了一个简单的二分类神经网络的训练和应用流程。主要步骤包括: 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与部署 加载和应用已训练的模型 1. 数据准备与预处理 在本例中,数据准备是通过两个 Numpy 数…

Compose笔记(三)--DisposableEffect

这一节了解一下DisposableEffect,它是一个可组合函数,主要用于在可组合项进入组合时执行初始化操作,并且在可组合项从组合中移除时执行相应的清理操作。其核心目的是管理与可组合项生命周期相关的资源,避免资源泄漏,比…

【PDF提取局部内容改名】批量获取PDF局部文字内容改名 基于QT和百度云api的完整实现方案

应用场景 1. 档案管理 在企业或机构的档案管理中,常常会有大量的 PDF 格式的文件,如合同、报告、发票等。这些文件的原始文件名可能没有明确的标识,不利于查找和管理。通过批量获取 PDF 局部文字内容并改名,可以根据文件中的关键…

无人机PX4飞控 | PX4源码添加自定义uORB消息并保存到日志

PX4源码添加自定义uORB消息并保存到日志 0 前言 PX4的内部通信机制主要依赖于uORB(Micro Object Request Broker),这是一种跨进程的通信机制,一种轻量级的中间件,用于在PX4飞控系统的各个模块之间进行高效的数据交换…

XCCL、NCCL、HCCL通信库

XCCL提供的基本能力 XCCL提供的基本能力 不同的XCCL 针对不同的网络拓扑,实现的是不同的优化算法的(不同CCL库最大的区别就是这) 不同CCL库还会根据自己的硬件、系统,在底层上面对一些相对应的改动; 但是对上的API接口…

AI大模型开发原理篇-5:循环神经网络RNN

神经概率语言模型NPLM也存在一些明显的不足之处:模型结构简单,窗口大小固定,缺乏长距离依赖捕捉,训练效率低,词汇表固定等。为了解决这些问题,研究人员提出了一些更先进的神经网络语言模型,如循环神经网络、…

Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册

文章目录 前言1.关于LibrePhotos2.本地部署LibrePhotos3.LibrePhotos简单使用4. 安装内网穿透5.配置LibrePhotos公网地址6. 配置固定公网地址 前言 想象一下这样的场景:你有一大堆珍贵的回忆照片,但又不想使用各种网盘来管理。怎么办?别担心…

【Java计算机毕业设计】基于Springboot的物业信息管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

深入解析Python机器学习库Scikit-Learn的应用实例

深入解析Python机器学习库Scikit-Learn的应用实例 随着人工智能和数据科学领域的迅速发展,机器学习成为了当下最炙手可热的技术之一。而在机器学习领域,Python作为一种功能强大且易于上手的编程语言,拥有庞大的生态系统和丰富的机器学习库。其…

高斯光束介绍及光斑处理

常规激光器的光斑为高斯光斑,即中心能量集中,边缘能量较低。一般定义光强的处为高斯光束的半径。高斯光斑的传输由光斑半径、远场发散角、波长等决定。 其中为位置z处的光斑半径,w(z), k2pi/λ为波矢,λ为光波长,R为高…

C++哈希(链地址法)(二)详解

文章目录 1.开放地址法1.1key不能取模的问题1.1.1将字符串转为整型1.1.2将日期类转为整型 2.哈希函数2.1乘法散列法(了解)2.2全域散列法(了解) 3.处理哈希冲突3.1线性探测(挨着找)3.2二次探测(跳…

【Redis】List 类型的介绍和常用命令

1. 介绍 Redis 中的 list 相当于顺序表,并且内部更接近于“双端队列”,所以也支持头插和尾插的操作,可以当做队列或者栈来使用,同时也存在下标的概念,不过和 Java 中的下标不同,Redis 支持负数下标&#x…

携程Java开发面试题及参考答案 (200道-上)

说说四层模型、七层模型。 七层模型(OSI 参考模型) 七层模型,即 OSI(Open System Interconnection)参考模型,是一种概念模型,用于描述网络通信的架构。它将计算机网络从下到上分为七层,各层的功能和作用如下: 物理层:物理层是计算机网络的最底层,主要负责传输比特流…