加载数据,并切分

# 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,一经查实,立即删除!

相关文章

解锁豆瓣高清海报(二) 使用 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/…

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

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

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

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

XCCL、NCCL、HCCL通信库

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

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)参考模型,是一种概念模型,用于描述网络通信的架构。它将计算机网络从下到上分为七层,各层的功能和作用如下: 物理层:物理层是计算机网络的最底层,主要负责传输比特流…

IM 即时通讯系统-51-MPush开源实时消息推送系统

IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术,提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…

AlexNet论文代码阅读

论文标题: ImageNet Classification with Deep Convolutional Neural Networks 论文链接: https://volctracer.com/w/BX18q92F 代码链接: https://github.com/dansuh17/alexnet-pytorch 内容概述 训练了一个大型的深度卷积神经网络&#xf…

扩散模型(三)

相关阅读: 扩散模型(一) 扩散模型(二) Latent Variable Space 潜在扩散模型(LDM;龙巴赫、布拉特曼等人,2022 年)在潜在空间而非像素空间中运行扩散过程,这…

git基础使用--4---git分支和使用

文章目录 git基础使用--4---git分支和使用1. 按顺序看2. 什么是分支3. 分支的基本操作4. 分支的基本操作4.1 查看分支4.2 创建分支4.3 切换分支4.4 合并冲突 git基础使用–4—git分支和使用 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念…

8.攻防世界Web_php_wrong_nginx_config

进入题目页面如下 尝试弱口令密码登录 一直显示网站建设中,尝试无果,查看源码也没有什么特别漏洞存在 用Kali中的dirsearch扫描根目录试试 命令: dirsearch -u http://61.147.171.105:53736/ -e* 登录文件便是刚才登录的界面打开robots.txt…

【漫话机器学习系列】076.合页损失函数(Hinge Loss)

Hinge Loss损失函数 Hinge Loss(合页损失),也叫做合页损失函数,广泛用于支持向量机(SVM)等分类模型的训练过程中。它主要用于二分类问题,尤其是支持向量机中的优化目标函数。 定义与公式 对于…

python算法和数据结构刷题[5]:动态规划

动态规划(Dynamic Programming, DP)是一种算法思想,用于解决具有最优子结构的问题。它通过将大问题分解为小问题,并找到这些小问题的最优解,从而得到整个问题的最优解。动态规划与分治法相似,但区别在于动态…