给AI加知识库

1、加载

Document Loader文档加载器

在 langchain_community. document_loaders 里有很多种文档加载器

from  langchain_community. document_loaders import ***

1、纯文本加载器:TextLoader,纯文本(不包含任何粗体、下划线、字号格式)

loader = TextLoader("./demo.txt")  # 创建TextLoader实例,参数是文件路径

docs = loader.load() # 加载文件内容

将文本文件的内容加载到 documents 列表中。每个文档是一个 Document 对象,包含文本内容(page_content 属性)和元数据(metadata 属性)。

metadata 属性存储的是与文档相关的一些额外信息,如文件的来源、创建时间、文件大小、作者等。元数据在文档管理和检索中非常有用。例如,在构建文档检索系统时,你可以根据元数据(如文件来源、创建时间)对文档进行筛选和排序,从而快速定位到你需要的文档。此外,元数据还可以用于数据质量管理和版本控制等方面。

 

2、PDF加载器:PyPDFLoader

pip install pypdf (专门处理PDF文件的库)

PyPDFLoader会在这个库的基础上工作

loader = PyPDFLoader("./论文介绍.pdf")

docs = loader.load()

 

除了加载本地文件内容,还可以加载网络上的内容。

3、维基百科加载器:WikipediaLoader

pip install wikipedia

loader = Wikipedia(query="颐和园",lang="zh",loader_max_docs=3) #参数query传要搜索的词条名

docs = loader.load()

2、分割

pip install langchain-text-splitters

from langchain-text-splitters import RecursiveCharacterTextSplitter

RecursiveCharacterTextSplitter:字符递归分割器

可以指定根据什么符号分割

  • chunk_size:默认值为4000,表示将文本分割成的每个块的最大长度。
  • chunk_overlap:默认值为200,表示相邻文本块之间重叠的字符数。

重叠是为了保持文本的上下文连贯性和完整性。

如果没有重叠,就会丢失相邻文本块之间的连接,一些重要信息可能就在分界线处。

separators:字符列表,指定根据什么字符分割,排在前面的字符会先被选择来分割文本。

如果分割出来的文本块仍然超过了最大长度chunk_size,就选择列表里的下一个分隔符进行分割。

以此类推。

默认时:["\n\n", "\n", " ", ""]最后一个是空字符串,相当于哪处都可以分割。但是不太适合中文。

可以设置成这样:

分割时:text = text_splitter.split_documents(docs) 

分割后仍然是Document组成的列表,但是每个Document的page_content的长度变短了。

3、嵌入

 

向量里要包含文本之间的语法语义等关系,

相似的文本所对应的嵌入向量在向量空间里距离会更近。

langchain可以借助嵌入模型,把文本转成向量。

以openai服务方提供的嵌入模型为例:

embed_documents传入字符串列表,返回向量列表。每个字符串都有对应的一个向量。向量维度由模型定。

如果希望嵌入向量的维度更小,可以指定dimensions参数。(有些模型在设计上可能支持不同维度的输出,以适应不同的应用场景和资源限制。虽然整体上模型有其默认的维度设定,但为了满足用户多样化的需求,允许在一定范围内指定维度。)

4、储存 

传统数据库:

精准匹配,适合查询结构化信息(有预定义数据模型的信息)

向量数据库:

相似性搜索,根据向量之间的距离,找到语义上相似或相关的内容,即是关键词不完全匹配。

适合处理非结构化数据。(非结构化数据指数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维表逻辑结构来表现的数据。)

 向量数据库有很多种,以Faiss为例:

pip install faiss-cpu

FAISS.from_documents:把文档块转换成向量,并储存进向量库里

第一个参数传入切割后的文档列表,第二个参数传入嵌入模型的实例

返回值是向量数据库

5、检索

retriever = db.as_retriever() #得到检索器

retrieved_docs = retriever.invoke("***") #返回检索得到的文档列表,越相似的排在越前面

带记忆的检索增强生成对话链:ConversationalRetrievalChain

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain_community.vectorstores import FAISSfrom langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChainimport os# 加载
loader = TextLoader("./京剧介绍.txt",encoding="utf-8") #加载器,可能要指定编码格式
docs = loader.load()
# 分割
text_splitter = RecursiveCharacterTextSplitter() #分割器
texts = text_splitter.split_documents(docs)
# 嵌入模型
embeddings_model = OpenAIEmbeddings(api_key=os.getenv("OPENAI_API_KEY"),base_url="https://api.gptsapi.net/v1") #注意:指定模型都要指定api_key,不是官方的还要加上base_url
# 嵌入并储存
db = FAISS.from_documents(texts,embeddings_model)
# 检索
retriever = db.as_retriever() #检索器# 模型
model = ChatOpenAI(model="gpt-3.5-turbo",api_key=os.getenv("OPENAI_API_KEY"),base_url="https://api.gptsapi.net/v1")# 记忆
memory = ConversationBufferMemory(return_messages=True,memory_key="chat_history",output_key="answer")# 创建对话链
chain = ConversationalRetrievalChain.from_llm(llm = model,retriever = retriever,memory = memory,return_source_documents=True
)result = chain.invoke({"chat_history":memory,"question":"介绍京剧中的旦角"}
)print(result)
print(result["answer"]) #不是result.answer,'dict' object has no attribute 'answer'
print(result["source_documents"])

1、memory = ConversationBufferMemory(return_messages=True,

                                  memory_key="chat_history",

                                  output_key="answer")

因为ConversationalRetrivalChain里储存历史消息的变量名叫chat_history,

AI的输出的变量名叫answer,所以更改memory_key和output_key的默认值。

变量名一致,这样就能确保对话历史在不同组件间准确传递和使用。

 

2、

chain = ConversationalRetrivalChain.from_llm(

    llm = model,

    retriever = retriever,

    memory = memory

)

result = chain.invoke(

    {

        "chat_history":memory,

        "question":"介绍京剧中的旦角"

    }

)

from_llm:“工厂模式”,允许做更多的定制化,适合更复杂的操作。

特别指定"chat_history":memory,允许用户在每次询问时灵活指定不同的对话历史,以便更好地处理复杂的问答场景。

返回值是包含chat-history、question和answer的字典:

如果希望返回结果里不仅AI的回复,还有参考的外部文档里的原片段,

可以设置参数return_source_documents=True

这可以帮我们判断模型的回答是真实可信有依据的,还是产自幻觉

把外部文档传递给模型的不同方式:

默认是所有片段一股脑塞给模型,即Stuff填充,但是当片段很长很多时,可能超过模型的上下文窗口限制。

1、Map-Reduce:

Map阶段,每个相关片段会单独传递给模型,让模型根据各个片段对查询分别作出回答。

Reduce阶段,各个回答会被整合起来,形成一个统一的信息合集,作为输入再传给模型。

最后得到一个连贯的、结合了多方面信息的回答。

综合分析理解

2、Refine 优化:

从第一个片段开始,得到模型针对查询的回答。再把这个回答,连带查询,以及第二个片段一块给模型,让模型对回答进行优化。以此类推。

每次模型都会结合下一片段,对已有的回答进行优化给出新的回答。

逐步深入分析、不断完善回答

3、Map-Rerank:

Map阶段同上。但除了让模型根据各个片段生成回答之外,还会要求模型对这些回答进行评估,即为每个回答打分。

Rerank阶段,系统会找出得分最高的一个回答或几个回答的合并结果作为最终回答。

缺点:不会整合不同片段之间的信息。

从不同角度生成回答,并找出最合理的那个

如何使用?

在from_llm中指定chain_type参数即可。默认为"stuff"。

chain_type(对话检索链的类型参数决定了如何将对话中的问题与检索到的文档信息进行结合和处理,以生成最终的回答,所以是关于对话检索链的类型划分。

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

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

相关文章

浅谈《图解HTTP》

感悟 滑至尾页的那一刻,内心突兀的涌来一阵畅快的感觉。如果说从前对互联网只是懵懵懂懂,但此刻却觉得她是如此清晰而可爱的呈现在哪里。 介绍中说,《图解HTTP》适合作为第一本网络协议书。确实,它就像一座桥梁,连接…

【hot100】刷题记录(12)-回文链表

题目描述: 给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表 。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2: …

Deep Sleep 96小时:一场没有硝烟的科技保卫战

2025年1月28日凌晨3点,当大多数人还沉浸在梦乡时,一场没有硝烟的战争悄然打响。代号“Deep Sleep”的服务器突遭海量数据洪流冲击,警报声响彻机房,一场针对中国关键信息基础设施的网络攻击来势汹汹! 面对美国发起的这场…

自动化构建-make/Makefile 【Linux基础开发工具】

文章目录 一、背景二、Makefile编译过程三、变量四、变量赋值1、""是最普通的等号2、“:” 表示直接赋值3、“?” 表示如果该变量没有被赋值,4、""和写代码是一样的, 五、预定义变量六、函数**通配符** 七、伪目标 .PHONY八、其他常…

【Three.js+React】教程001:绘制简单的盒子

文章目录 React整合Three.js创建项目绘制一个简单的盒子添加坐标辅助器React整合Three.js 在 React 中结合 Three.js 进行 3D 开发,可以使用 React + Three.js + @react-three/fiber 进行高效渲染,同时配合 @react-three/drei 提供的封装工具,让开发更加简洁。 创建项目 …

K8S集群架构及主机准备

本次集群部署主机分布K8S集群主机配置主机静态IP设置主机名解析ipvs管理工具安装及模块加载主机系统升级主机间免密登录配置主机基础配置完后最好做个快照备份 2台负载均衡器 Haproxy高可用keepalived3台k8s master节点5台工作节点(至少2及以上)本次集群部署主机分布 K8S集群主…

SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言

目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件: 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL(Data Definition Language):数据定义语言 1、操…

3.5.7 基于横盘结构的分析体系——缠论(背驰/背离)

背离(背驰) 本文讨论背离主要从量价和时空的角度来讨论。涉及的背离类型如下表: 角度 类型 成交量和价格 量价背离 时间和空间 MACD背离 笔背离 盘整背离 趋势背离 表1-9 背离的角度和类型。 从成交量和价格的角度,本文…

51c嵌入式~电路~合集25

我自己的原文哦~ https://blog.51cto.com/whaosoft/13241709 一、“开关电源”和“普通电源”的区别 什么叫开关电源 随着电力电子技术的发展和创新,使得开关电源技术也在不断地创新。目前,开关电源以小型、轻量和高效率的特点被广泛应用几乎所有的电…

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开,我们尝试自己创建一个数据生成器,用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

【文件上传】

目录 一. 介绍二. 本地存储三. 阿里云OSS3.1 准备工作3.2 入门程序3.3 案例集成3.4 程序优化 \quad 一. 介绍 \quad 三要素缺一不可 \quad 二. 本地存储 \quad 解决相同命名覆盖问题 \quad 三. 阿里云OSS \quad \quad 3.1 准备工作 \quad \quad 3.2 入门程序 \quad \quad 3.3…

Deepseek-R1 和 OpenAI o1 这样的推理模型普遍存在“思考不足”的问题

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Vue3的el-table-column下拉输入实时查询API数据选择的实现方法

由于本人对el-table-column有下拉输入选择的要求&#xff0c;根据网上搜索的资料及本人优化&#xff0c;推出我比较满意的方法&#xff0c;供各位读者参考使用。 效果图 el-table-column写法 <el-table-columnlabel"货品编号"align"center"prop"…

Electron使用WebAssembly实现CRC-8 MAXIM校验

Electron使用WebAssembly实现CRC-8 MAXIM校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-8 MAXIM格式校验的方式。 CRC-8 MAXIM校验函数WebAssembly源文件 C语言实现C…

使用 Elastic Cloud Hosted 优化长期数据保留:确保政府合规性和效率

作者&#xff1a;来自 Elastic Jennie Davidowitz 在数字时代&#xff0c;州和地方政府越来越多地承担着管理大量数据的任务&#xff0c;同时确保遵守严格的监管要求。这些法规可能因司法管辖区而异&#xff0c;通常要求将数据保留较长时间 —— 有时从一年到七年不等。遵守刑事…

安卓(android)饭堂广播【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的&#xff08;如果代码有错漏&#xff0c;可查看源码&#xff09; 1.熟悉广播机制的实现流程。 2.掌握广播接收者的创建方式。 3.掌握广播的类型以及自定义官博的创建。 二、实验条件 熟悉广播机制、广播接收者的概念、广播接收者的创建方式、自定广播实现方式以及有…

OPENPPP2 —— VMUX_NET 多路复用原理剖析

在阅读本文之前&#xff0c;必先了解以下几个概念&#xff1a; 1、MUX&#xff08;Multiplexer&#xff09;&#xff1a;合并多个信号到单一通道。 2、DEMUX&#xff08;Demultiplexer&#xff09;&#xff1a;从单一通道分离出多个信号。 3、单一通道&#xff0c;可汇聚多个…

【Linux】从硬件到软件了解进程

个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程&#xff08;1&#xff09;简述&#xff08;2&#xff09;系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…

Deep Crossing:深度交叉网络在推荐系统中的应用

实验和完整代码 完整代码实现和jupyter运行&#xff1a;https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 在机器学习和深度学习领域&#xff0c;特征工程一直是一个关键步骤&#xff0c;尤其是对于大规模的推荐系统和广告点击率预…

AI智慧社区--Excel表的导入导出

Excel表导入导出的环境配置 1.导入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>${easypoi.version}</version></dependency>2.配置Excel的导入导出以及…