给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.mzph.cn/pingmian/68935.shtml

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

相关文章

游戏引擎 Unity - Unity 设置为简体中文、Unity 创建项目

Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…

小红的小球染色期望

B-小红的小球染色_牛客周赛 Round 79 题目描述 本题与《F.R小红的小球染色期望》共享题目背景,但是所求内容与范围均不同,我们建议您重新阅读题面。 有 n 个白色小球排成一排。小红每次将随机选择两个相邻的白色小球,将它们染成红色。小红…

ASP.NET Core与配置系统的集成

目录 配置系统 默认添加的配置提供者 加载命令行中的配置。 运行环境 读取方法 User Secrets 注意事项 Zack.AnyDBConfigProvider 案例 配置系统 默认添加的配置提供者 加载现有的IConfiguration。加载项目根目录下的appsettings.json。加载项目根目录下的appsettin…

Redis集群理解以及Tendis的优化

主从模式 主从同步 同步过程: 全量同步(第一次连接):RDB文件加缓冲区,主节点fork子进程,保存RDB,发送RDB到从节点磁盘,从节点清空数据,从节点加载RDB到内存增量同步&am…

沙皮狗为什么禁养?

各位铲屎官们,今天咱们来聊聊一个比较敏感的话题:沙皮狗为什么会被禁养?很多人对沙皮狗情有独钟,但有些地方却明确禁止饲养这种犬种,这背后到底是什么原因呢?别急,今天就来给大家好好揭秘&#…

物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

一、MQTT介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅模式的轻量级通讯协议,构建于TCP/IP协议之上。它最初由IBM在1999年发布,主要用于在硬件性能受限和网络状况不佳的情…

w186格障碍诊断系统spring boot设计与实现

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

题解 洛谷 Luogu P1955 [NOI2015] 程序自动分析 并查集 离散化 哈希表 C++

题目 传送门 P1955 [NOI2015] 程序自动分析 - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/problem/P1955 思路 主要用到的知识是并查集 (如何实现并查集,这里不赘述了) 若 xi xj,则合并它们所在的集合。若 xi ! xj,则 i 和 …

无用知识之:std::initializer_list的秘密

先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化,这个动作又触发了拷贝…

97,【5】buuctf web [极客大挑战 2020]Greatphp

进入靶场 审代码 <?php // 关闭所有 PHP 错误报告&#xff0c;防止错误信息泄露可能的安全隐患 error_reporting(0);// 定义一个名为 SYCLOVER 的类 class SYCLOVER {// 定义类的公共属性 $sycpublic $syc;// 定义类的公共属性 $loverpublic $lover;// 定义魔术方法 __wa…

蓝桥杯单片机第七届省赛

前言 这套题不难&#xff0c;相对于第六套题这一套比较简单了&#xff0c;但是还是有些小细节要抓 题目 OK&#xff0c;以上就是全部的题目了&#xff0c;这套题目相对来说逻辑比较简单&#xff0c;四个按键&#xff0c;S4控制pwm占空比&#xff0c;S5控制计时时间&#xff0…

【C语言】自定义类型讲解

文章目录 一、前言二、结构体2.1 概念2.2 定义2.2.1 通常情况下的定义2.2.2 匿名结构体 2.3 结构体的自引用和嵌套2.4 结构体变量的定义与初始化2.5 结构体的内存对齐2.6 结构体传参2.7 结构体实现位段 三、枚举3.1 概念3.2 定义3.3 枚举的优点3.3.1 提高代码的可读性3.3.2 防止…

我问了DeepSeek和ChatGPT关于vue中包含几种watch的问题,它们是这么回答的……

前言&#xff1a;听说最近DeepSeek很火&#xff0c;带着好奇来问了关于Vue的一个问题&#xff0c;看能从什么角度思考&#xff0c;如果回答的不对&#xff0c;能不能尝试纠正&#xff0c;并帮我整理出一篇不错的文章。 第一次回答的原文如下&#xff1a; 在 Vue 中&#xff0c;…

纯后训练做出benchmark超过DeepseekV3的模型?

论文地址 https://arxiv.org/pdf/2411.15124 模型是AI2的&#xff0c;他们家也是玩开源的 先看benchmark&#xff0c;几乎是纯用llama3 405B后训练去硬刚出一个gpt4o等级的LLamA405 我们先看之前的机遇Lllama3.1 405B进行全量微调的模型 Hermes 3&#xff0c;看着还没缘模型…

UbuntuWindows双系统安装

做系统盘&#xff1a; Ubuntu20.04双系统安装详解&#xff08;内容详细&#xff0c;一文通关&#xff01;&#xff09;_ubuntu 20.04-CSDN博客 ubuntu系统调整大小&#xff1a; 调整指南&#xff1a; 虚拟机中的Ubuntu扩容及重新分区方法_ubuntu重新分配磁盘空间-CSDN博客 …

在 Zemax 中使用布尔对象创建光学光圈

在 Zemax 中&#xff0c;布尔对象用于通过组合或减去较简单的几何形状来创建复杂形状。布尔运算涉及使用集合运算&#xff08;如并集、交集和减集&#xff09;来组合或修改对象的几何形状。这允许用户在其设计中为光学元件或机械部件创建更复杂和定制的形状。 本视频中&#xf…

AI作画提示词:Prompts工程技巧与最佳实践

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网智能项目之——智能家居项目…

LLMs之DeepSeek:Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略

LLMs之DeepSeek&#xff1a;Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略 目录 Math-To-Manim的简介 1、特点 2、一个空间推理测试—考察不同大型语言模型如何解释和可视化空间关系 3、DeepSeek R1-Zero的简介&#xff1a;处理更…

二叉树——429,515,116

今天继续做关于二叉树层序遍历的相关题目&#xff0c;一共有三道题&#xff0c;思路都借鉴于最基础的二叉树的层序遍历。 LeetCode429.N叉树的层序遍历 这道题不再是二叉树了&#xff0c;变成了N叉树&#xff0c;也就是该树每一个节点的子节点数量不确定&#xff0c;可能为2&a…

详解单片机学的是什么?(电子硬件)

大家好&#xff0c;我是山羊君Goat。 单片机&#xff0c;对于每一个硬件行业的从业者或者在校电子类专业的学生&#xff0c;相信对于这个名词都不陌生&#xff0c;但是掌没掌握就另说了。 那单片机到底学的是什么呢&#xff1f; 其实单片机在生活中就非常常见&#xff0c;目前…