加载数据,并切分

# 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#vector

client = 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_name
        self.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)  # 假设嵌入向量维度为 1024
        return embeddings


    def 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].embedding
        return [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()

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.5 高级索引应用:图像处理中的区域提取

2.5 高级索引应用:图像处理中的区域提取 目录/提纲 #mermaid-svg-BI09xc20YqcpUam7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BI09xc20YqcpUam7 .error-icon{fill:#552222;}#mermaid-svg-BI09xc20…

房屋中介管理系统的设计与实现

房屋中介管理系统的设计与实现 摘要:随着房地产市场的快速发展,房屋中介行业的信息管理需求日益增长。传统的管理方式已无法满足中介公司对房源信息、客户信息以及业务流程的高效管理需求。为此,本文设计并实现了一套房屋中介管理系统&#x…

Vue指令v-on

目录 一、Vue中的v-on指令是什么?二、v-on指令的简写三、v-on指令的使用 一、Vue中的v-on指令是什么? v-on指令的作用是:为元素绑定事件。 二、v-on指令的简写 “v-on:“指令可以简写为”” 三、v-on指令的使用 1、v-on指令绑…

力扣第435场周赛讲解

文章目录 题目总览题目详解3442.奇偶频次间的最大差值I3443.K次修改后的最大曼哈顿距离3444. 使数组包含目标值倍数的最少增量3445.奇偶频次间的最大差值 II 题目总览 奇偶频次间的最大差值I K次修改后的最大曼哈顿距离 使数组包含目标值倍数的最少增量 奇偶频次间的最大差值I…

编程AI深度实战:给vim装上AI

系列文章: 编程AI深度实战:私有模型deep seek r1,必会ollama-CSDN博客 编程AI深度实战:自己的AI,必会LangChain-CSDN博客 编程AI深度实战:给vim装上AI-CSDN博客 编程AI深度实战:火的编程AI&…

嵌入式知识点总结 操作系统 专题提升(四)-上下文

针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.上下文有哪些?怎么理解? 2.为什么会有上下文这种概念? 3.什么情况下进行用户态到内核态的切换? 4.中断上下文代码中有哪些注意事项? 5.请问线程需要保存哪些…

python算法和数据结构刷题[6]:二叉树、堆、BFS\DFS

遍历二叉树 前序遍历NLR:先访问根结点,再前序遍历左子树,最后前序遍历右子树。中序遍历LNR:先中序遍历左子树,再访问根结点,最后中序遍历右子树。后序遍历 LRN:先后序遍历左子树,再…

012-51单片机CLD1602显示万年历+闹钟+农历+整点报时

1. 硬件设计 硬件是我自己设计的一个通用的51单片机开发平台,可以根据需要自行焊接模块,这是用立创EDA画的一个双层PCB板,所以模块都是插针式,不是表贴的。电路原理图在文末的链接里,PCB图暂时不选择开源。 B站上传的…

w191教师工作量管理系统的设计与实现

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

Python 网络爬虫实战:从基础到高级爬取技术

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 网络爬虫(Web Scraping)是一种自动化技术,利用程序从网页中提取数据,广泛…

[漏洞篇]SQL注入漏洞详解

[漏洞篇]SQL注入漏洞详解 介绍 把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的。…

C#,shell32 + 调用控制面板项(.Cpl)实现“新建快捷方式对话框”(全网首发)

Made By 于子轩,2025.2.2 不管是使用System.IO命名空间下的File类来创建快捷方式文件,或是使用Windows Script Host对象创建快捷方式,亦或是使用Shell32对象创建快捷方式,都对用户很不友好,今天小编为大家带来一种全新…

DDD - 微服务架构模型_领域驱动设计(DDD)分层架构 vs 整洁架构(洋葱架构) vs 六边形架构(端口-适配器架构)

文章目录 引言1. 概述2. 领域驱动设计(DDD)分层架构模型2.1 DDD的核心概念2.2 DDD架构分层解析 3. 整洁架构:洋葱架构与依赖倒置3.1 整洁架构的核心思想3.2 整洁架构的层次结构 4. 六边形架构:解耦核心业务与外部系统4.1 六边形架…

基于SpringBoot的新闻资讯系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

xmind使用教程

xmind使用教程 前言xmind版本信息“xmind使用教程”的xmind思维导图 前言 首先xmind是什么?XMind 是一款思维导图和头脑风暴工具,用于帮助用户组织和可视化思维、创意和信息。它允许用户通过图形化的方式来创建、整理和分享思维导图,可以用于…

半导体器件与物理篇7 微波二极管、量子效应和热电子器件

基本微波技术 微波频率:微波频率涵盖约从0.1GHz到3000GHz,相当于波长从300cm到0.01cm。 分布效应:电子部件在微波频率,与其在较低频率的工作行为不同。 输运线:一个由电阻、电容、电感三种等效基本电路部件所组成的…

Java自定义IO密集型和CPU密集型线程池

文章目录 前言线程池各类场景描述常见场景案例设计思路公共类自定义工厂类-MyThreadFactory自定义拒绝策略-RejectedExecutionHandlerFactory自定义阻塞队列-TaskQueue(实现 核心线程->最大线程数->队列) 场景1:CPU密集型场景思路&…

浅谈线段树

文章同步发布于洛谷,建议前往洛谷查看。 前言 蒟蒻终于学会线段树(指【模板】线段树 1 1 1)啦! 线段树思想 我们先来考虑 P3372(基础线段树模板题)给的操作: 区间修改(增加&am…

linux运行级别

运行级别:指linux系统在启动和运行过程中所处的不同的状态。 运行级别之间的切换:init (级别数) 示例: linux的运行级别一共有7种,分别是: 运行级别0:停机状态 运行级别1:单用户模式/救援模式…

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具03

SQLSERVER的ImpDp和ExpDp工具 1、全部的表导出(仅表结构导出) 2、导出的表结构,导入到新的数据库 导入前,test3数据没有任何表 导入 导入结果确认:表都被做成,但是没有数据 3、全部的表导出&#x…