LangChain(4)检索增强 Retrieval Augmentation

LangChain(4)检索增强 Retrieval Augmentation

    • 文本分段
    • 构建 Embedding
    • 存储向量
    • 向量查询
    • 检索信息结合LLM

Large Language Models (LLMs) 的能力或者知识来自两方面:模型在训练时候的输入;模型训练好后以提示词方式输入到模型中的知识source knowledge。检索增强就是指后期输入到模型中的附加信息。

文本分段

按顺序安装包:

!pip install -qU \datasets==2.12.0 \apache_beam \mwparserfromhell!pip install -qU \langchain==0.0.162 \openai==0.27.7 \tiktoken==0.4.0 \"pinecone-client[grpc]"==2.2.2
from datasets import load_dataset
# 下载维基百科资料
data = load_dataset("wikipedia", "20220301.simple", split='train[:10000]')# 分词工具
import tiktoken
tiktoken.encoding_for_model('gpt-3.5-turbo')import tiktoken
tokenizer = tiktoken.get_encoding('cl100k_base')
# 计算分词后的token数 create the length function
def tiktoken_len(text):tokens = tokenizer.encode(text,disallowed_special=())return len(tokens)# 使用 RecursiveCharacterTextSplitter 将整段文本分割,限定每个片段的最大token数
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=400,chunk_overlap=20,length_function=tiktoken_len, #计量token数separators=["\n\n", "\n", " ", ""]
)# 使用方式
chunks = text_splitter.split_text(data[6]['text'])[:3]
# 计算token数
tiktoken_len(chunks[0])

构建 Embedding

import os
# 设置OPENAI_API_KEY  get openai api key from platform.openai.com
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') or 'OPENAI_API_KEY'from langchain.embeddings.openai import OpenAIEmbeddings
# 向量化的模型
model_name = 'text-embedding-ada-002'embed = OpenAIEmbeddings(model=model_name,openai_api_key=OPENAI_API_KEY
)# 测试文本
texts = ['this is the first chunk of text','then another second chunk of text is here']res = embed.embed_documents(texts)
print(len(res), len(res[0]))
>>>2 1536 # 向量长度为 1536

存储向量

使用 Pinecone 存储向量。

index_name = 'langchain-retrieval-augmentation'import pinecone# find API key in console at app.pinecone.io
PINECONE_API_KEY = os.getenv('PINECONE_API_KEY') or 'PINECONE_API_KEY'
# find ENV (cloud region) next to API key in console
PINECONE_ENVIRONMENT = os.getenv('PINECONE_ENVIRONMENT') or 'PINECONE_ENVIRONMENT'pinecone.init(api_key=YOUR_API_KEY,environment=YOUR_ENV
)if index_name not in pinecone.list_indexes():# we create a new indexpinecone.create_index(name=index_name,metric='cosine',dimension=len(res[0])  # 1536 dim of text-embedding-ada-002)# 连接库索引
index = pinecone.GRPCIndex(index_name)
print(index.describe_index_stats()) # 库索引统计信息>>>{'dimension': 1536,'index_fullness': 0.1,'namespaces': {'': {'vector_count': 27437}},'total_vector_count': 27437}

按批将数据插入索引库中

from tqdm.auto import tqdm
from uuid import uuid4
# 批量大小
batch_limit = 100texts = []
metadatas = []for i, record in enumerate(tqdm(data)):# 维基百科中文本原始信息 first get metadata fields for this recordmetadata = {'wiki-id': str(record['id']),'source': record['url'],'title': record['title']}# 文本分段 now we create chunks from the record textrecord_texts = text_splitter.split_text(record['text'])# 为每一个分段文本创建元信息:j第几个片段 text片段文本 其它几个维基百科字段:wiki-id、source、title  create individual metadata dicts for each chunkrecord_metadatas = [{"chunk": j, "text": text, **metadata} for j, text in enumerate(record_texts)]# append these to current batchestexts.extend(record_texts)metadatas.extend(record_metadatas)# if we have reached the batch_limit we can add textsif len(texts) >= batch_limit:ids = [str(uuid4()) for _ in range(len(texts))]embeds = embed.embed_documents(texts)index.upsert(vectors=zip(ids, embeds, metadatas))texts = []metadatas = []if len(texts) > 0:ids = [str(uuid4()) for _ in range(len(texts))]embeds = embed.embed_documents(texts)index.upsert(vectors=zip(ids, embeds, metadatas))

向量查询

from langchain.vectorstores import Pineconetext_field = "text" # 需要查询出来的字段
# 向量化的模型
model_name = 'text-embedding-ada-002'
embed = OpenAIEmbeddings(model=model_name,openai_api_key=OPENAI_API_KEY
)# switch back to normal index for langchain
index = pinecone.Index(index_name)vectorstore = Pinecone(index, embed.embed_query, text_field
)# 查询信息
query = "who was Benito Mussolini?"
vectorstore.similarity_search(query,  # our search queryk=3  # return 3 most relevant docs
)

检索信息结合LLM

from langchain.chains import RetrievalQA# completion llm
llm = ChatOpenAI(openai_api_key=OPENAI_API_KEY,model_name='gpt-3.5-turbo',temperature=0.0
)qa = RetrievalQA.from_chain_type(llm=llm,chain_type="stuff",retriever=vectorstore.as_retriever()
)print(qa.run(query))>>>'Benito Mussolini was an Italian politician and journalist who served as the Prime Minister of Italy from 1922 until 1943.'

有时 LLM 回答不着边,没有完全按照提供的信息回答,可以通过 RetrievalQAWithSourcesChain 使得回答更可信,模型会返回参考的来源信息

from langchain.chains import RetrievalQAWithSourcesChainqa_with_sources = RetrievalQAWithSourcesChain.from_chain_type(llm=llm,chain_type="stuff",retriever=vectorstore.as_retriever()
)
print(qa_with_sources(query))>>>{'question': 'who was Benito Mussolini?','answer': 'Benito Mussolini was an Italian politician and journalist who was the Prime Minister of Italy from 1922 until 1943.', 'sources': 'https://simple.wikipedia.org/wiki/Benito%20Mussolini, https://simple.wikipedia.org/wiki/Fascism'}

参考:
Fixing Hallucination with Knowledge Bases
Retrieval Augmentation

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

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

相关文章

【ArcGIS微课1000例】0070:制作宾馆酒店分布热度热力图

本文讲解在ArcGIS中,基于长沙市酒店宾馆分布矢量点数据(POI数据)绘制酒店分布热力图。 相关阅读: 【GeoDa实用技巧100例】004:绘制长沙市宾馆热度图 【ArcGIS Pro微课1000例】0028:绘制酒店分布热力图(POI数据) 文章目录 一、加载宾馆分布数据二、绘制热度图一、加载宾…

stm32(HAL库)使用printf函数打印到串口

目录 1、简介 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 串口外设配置 2.3 项目生成 3、KEIL端程序整合 4、效果测试 1、简介 在HAL库中,常用的printf函数是无法使用的。本文通过重映射实现在HAL库中进行printf函数。 2.1 基础配置 2.1.1 SYS配置 2.1.2 …

ceph集群的维护

ceph集群的维护 1、ceph集群常用命令 1.1查看集群的状态 rootceph-mon1:~#ceph -s#或者 rootceph-mon1:~#ceph health detail #显示集群状态的详细信息1.2查看所有存储池的列表 rootceph-mon1:~# ceph osd pool ls1.3查看所有存储池的编号 rootceph-mon1:~# ceph osd ls…

Linux gdb汇编调试

文章目录 一、示例代码二、gdb汇编指令2.1 step/stepi2.2 next/nexti2.3 info registers2.4 set2.5 x2.6 rsp寄存器2.7 rip 寄存器 参考资料 一、示例代码 &#xff08;1&#xff09; #include <stdio.h>int add(int a, int b) {return a b; }int main() {int a 3;in…

【洛谷题解】P1102 A-B 数对

题目 给出一串正整数数列以及一个正整数 C C C&#xff0c;要求计算出所有满足 A − B C A - B C A−BC 的数对的个数&#xff08;不同位置的数字一样的数对算不同的数对&#xff09;。 输入格式 输入共两行。 第一行&#xff0c;两个正整数 N , C N,C N,C。 第二行&…

【Python】数据可视化利器PyCharts在测试工作中的应用

点击跳转原文&#xff1a;【Python】数据可视化利器PyCharts在测试工作中的应用 实际应用&#xff1a;常态化性能压测数据统计 import random from pyecharts.charts import Line, Bar, Grid, Pie, Page from pyecharts import options as opts # 查询过去 8 次数据 time_rang…

MVVM 实现记录文本

1. MVVM 框架说明: Model - 数据层 View - 视图层 ViewModel - 管理模型的视图 2. 资源文件 2.1 启动图标: AppIconhttps://img-blog.csdnimg.cn/8fa1031489f544ef9757b6b3ab0eddbe.png 2.2 Display Name: Do Stuff 2.2 颜色图: 2.3 项目结构图: 3. Model 层实现&a…

组合(力扣)dfs + 回溯 + 剪枝 JAVA

给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2&#xff1a; 输入&#xff1a;n 1, …

spring笔记

Transactional 在方法开始前开启事务 检查异常&#xff08;unchecked exception&#xff09;不回滚 如果想针对检查异常进行事务回滚&#xff0c;可以在Transactional注解里使用 rollbackFor属性明确指定异常。 Transactional(rollbackFor Exception.class)catch的异常不回…

在Linux环境中安装配置Django与PostgreSQL数据库

Django是一款功能强大的Python Web框架&#xff0c;而PostgreSQL是一个开源的高级关系型数据库系统。本文将介绍在Linux环境中如何安装和配置Django与PostgreSQL数据库&#xff0c;帮助您搭建一个完整的开发环境。 第一步&#xff1a;安装Django和PostgreSQL 安装Python环境&a…

鲸鱼优化算法MATLAB代码

论文 Seyedali Mirjalili,Andrew Lewis. The Whale Optimization Algorithm[J]. Advances in Engineering Software,2016,95.func_plot.m % This function draw the benchmark functionsfunction func_plot(func_name)[lb,ub,dim,fobj]Get_Functions_details(func_name);switch…

数据结构(王道)——线性表之静态链表顺序表和链表的比较

一、静态链表 定义&#xff1a; 代码实现&#xff1a; 如何定义一个静态链表 静态链表的基本操作思路&#xff1a; 初始化静态链表&#xff1a; 静态链表的查找、插入、删除 静态链表总结&#xff1a; 二、顺序表和链表的比较 逻辑结构对比&#xff1a; 存储结构对比&#xff…

vue3 引入dataV 报错,使用patch-package记录插件包 node_modeule 修改记录。 vite 版DataV

开发数字大屏功能&#xff0c;引用dataV UI组件库比较好用&#xff0c;目前分为Vue2 和 Vue3 两个版本。 Vue2 --DataV版本 yarn add jiaminghi/data-viewVue3 --DataV版本 yarn add dataview/datav-vue3vite – --DataV版本 //不想动手改的&#xff0c;也可以使用此版本&a…

【Zookeeper】

目录 一、Zookeeper 概述1、Zookeeper 定义2、Zookeeper 工作机制3、Zookeeper 特点4、Zookeeper 数据结构5、Zookeeper 应用场景6、Zookeeper 选举机制 二、部署 Zookeeper 集群1.安装前准备1、关闭防火墙2、安装 JDK3、下载安装包 2.安装 Zookeeper1、修改配置文件2、拷贝配置…

被字节拷打了~基础还是太重要了...

今天分享一篇一位同学去字节面试的实习面经&#xff0c;技术栈是java&#xff0c;投了go后端岗位&#xff0c;主要拷打了 redismysql网络系统java算法&#xff0c;面试问题主要集中在 mysql、redis、网络这三部门&#xff0c;因为面试官是搞 go 的&#xff0c;java 只是随便问了…

【微信机器人开发

现在并没有长期免费的微信群机器人&#xff0c;很多都是前期免费试用&#xff0c;后期进行收费&#xff0c;或者核心功能需要付费使用的。 这时如果需要群机器人帮助我们管理群聊&#xff0c;建议大家使有条件的可以自己开发微信管理系统。了解微信群机器人的朋友都知道&#x…

Mysql数据库之事务

目录 一、事务的概念 二、事务的ACID特点 1.原子性&#xff08;Atomicity&#xff09; 2.一致性&#xff08;Consistency&#xff09; 3.隔离性&#xff08;lsolation&#xff09; 4.持久性&#xff08;Durability) 三、并发访问表的一致性问题和事务的隔离级别 1.并发访…

Windows下 创建 FTP 服务器及相关设置

Windows 创建 FTP 服务器 1. 示例功能说明 FTP 服务器根路径下的目录&#xff1a; C:\USERS\SQQIAN\DESKTOP\FTP └─localuser├─FTP1 # 只有用户名为FTP1可以访问&#xff0c;读写均可│ FTP11.txt│├─FTP2 # 只有用户名为FTP2…

好家伙,9:00面试,9:06就出来了,问的实在是太...

从外包出来&#xff0c;没想到死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到2月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推我去…

zabbix-server监控mysql数据库及httpd服务、监控apache、监控ftp

目录 一、监控mysql数据库及httpd服务 1、为server.Zabbix.com添加服务模板 2、server.zabbix.com服务端 操作 3、编辑chk_mysql.sh脚本 4、server.zabbix.com测试 二、监控apache 1、获取键值 2、服务器操作 3、zabbix监控web端导入监控模板 4、server.zabbix.com添加…