大语言模型RAG项目实战

学习完大语言模型落地的关键技术:RAG的相关概念,我们今天来用代码实现一下RAG。

项目实战:基于百度ERNIE SDK 和 LangChain 搭建个人知识库。

1、安装ERNIE Bot 

!pip install --upgrade erniebot测试embedding 
import erniebot
erniebot.api_type = "aistudio"
erniebot.access_token = "<你的token>"
response = erniebot.Embedding.create(
model="ernie-text-embedding",
input=["我是百度公司开发的人工智能语言模型,我的中文名是文心一言,英文名是ERNIE-Bot,可以协助您完成范围广泛的任务并提供有关各种主题的信息,比如回答问题,提供定义和解释及建议。如果您有任何问题,请随时向我提问。" ])
print(response.get_result())

2、引入 Chromadb 向量数据库

!pip install chromadb

3、自定义嵌入函数

定义一个自定义的嵌入函数,用于将文本内容转换为嵌入向量。其中使用 ERNIE Bot 库来创建文本的嵌入,并且通过 Chromadb 库来管理这些嵌入向量。

import os
import erniebot
from typing import Dict, List, Optional 
import chromadb
from chromadb.api.types import Documents, EmbeddingFunction, Embeddings
def embed_query(content):
response = erniebot.embedding.create(
model="ernie-text-embedding",
input=[content])
result = response.get_result()
print(result)  
return resultclass ErnieEmbeddingFunction(EmbeddingFunction): 
def __call__(self, input: Documents) -> Embeddings:embeddings = []for text in input:response = embed_query(text)try:embedding = response[0]   embeddings.append(embedding)except (IndexError, TypeError, KeyError) as e:print(f"Error processing text: {text}, Error: {e}")return embeddings
chroma_client = chromadb.Client()chroma_client = chromadb.PersistentClient(path="chromac") #数据保存硬盘位置 可选
collection = chroma_client.create_collection(name="demo", embedding_function=ErnieEmbeddingFunction())
print(collection)

4、导入数据集

选用课程内容作为知识库:

https://aistudio.baidu.com/datasetdetail/260836

5、文档切割

使用 LangChain 库来处理和分割文本文档

from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader 
loader = TextLoader('./AI大课逐字稿.txt',encoding='utf-8')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=600, chunk_overlap=20)
docs = text_splitter.split_documents(documents)
docs

6、Embedding 嵌入

将分割后的文档列表转换为嵌入向量,以便进行进一步的分析和处理。

import uuid
docs_list=[]
metadatas=[]
ids=[]
for item in docs:
docs_list.append(item.page_content)
metadatas.append({"source": "AI大课逐字稿"})
ids.append(str(uuid.uuid4())) 
collection.add(
documents=docs_list,
metadatas=metadatas,
ids=ids
)

7、检索

query = "讲师说见VC有两种错误的思维方式,分别是什么"results = collection.query(query_texts=[query],n_results=2
) 
content=results['documents'][0]
[ ] 
prompt=f"""
用户问题:{query}
<context>
{content}
</context>
根据<context>里的知识点回答用户问题
"""
response = erniebot.ChatCompletion.create(model="ernie-4.0", messages=[{"role": "user", "content": prompt}])
print(response.get_result())
#讲师说见VC有两种错误的思维方式,分别是:
##1. 用过去的方式套今天的人工智能,比如比喻成OS。一旦比喻成操作系统,就得出结论全世界两套到三套,你觉得必然会被垄断、没有机会了,这种是典型的刻舟求剑。
#2. 人容易对已经成功的事委曲求全,对于创新的新生代创业者容易求全责备。特别是有些做VC容易犯这个错误,比如OpenAI做成了,已经证明了,是个傻子都能看到OpenAI做的很成功,我们容易对它顶礼膜拜,恨不得跪下。对创业者很多还不成形的想法,因为八字没有一撇,光看到了你的很多缺点,这种价值观是不对的,容易Miss掉一些有潜力的项目。

8、封装函数

包含了之前步骤中存储的文本嵌入向量。函数的目的是接收用户的查询,从数据库中检索相关信息,并生成一个回答。


def main(query):results = collection.query(query_texts=[query],n_results=2
)content=results['documents'][0]prompt=f"""用户问题:{query}<context>{content}</context>根据<context>里的知识点回答用户问题"""response = erniebot.ChatCompletion.create(model="ernie-4.0", messages=[{"role": "user", "content": prompt}])return response.get_result()
query=input("请输入您要查询的问题:")
print(main(query))

代码地址:

https://aistudio.baidu.com/projectdetail/7431640

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

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

相关文章

网站基本建设基本上步骤

网站基本建设基本上步骤 一.领取一个免费域名和SSL证书&#xff0c;和CDN 1.打开网站链接&#xff1a;https://www.rainyun.com/ycpcp_ 首先创建一个CDN&#xff0c;这里以我加速域名“cdntest.biliwind.com 1”为例 这里就要填写 cdntest.biliwind.com 1 &#xff0c;而不是…

4.1 JavaScript的使用

JavaScript有两种使用方式&#xff1a;一是在HTML文档中直接添加代码&#xff1b;二是将JavaScript脚本代码写到外部的JavaScript文件中&#xff0c;再在HTML文档中引用该文件的路径地址。 这两种使用方式的效果完全相同&#xff0c;可以根据使用率和代码量选择相应的开发方式。…

day19-归并两个有序数组

问题描述&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终…

Qt5.15以上版本在线安装步骤,可选择更多早期版本

以ubuntu系统为例&#xff1a; 1、先去下载在线安装程序&#xff1a; https://download.qt.io/official_releases/online_installers/ 选择合适的版本&#xff0c;这里是在x64机器的ubuntu虚拟机里安装QT&#xff0c;所以选择如下版本&#xff1a; 或者直接在终端执行如下命令…

Qt | 元对象系统

一、QByteArray 类简介 1、QByteArray 类简介  该类是一个用于处理字符串的类似于 C++的 string 类型的类,在 Qt 中,对字符串的处理,经常使用的是 QString 类,该类保证字符串以\0结尾,并使用隐式共享(copy-on-write)来减少内存用量和不必要的数据复制。  QByteArra…

【ControlNet v3版本论文阅读】

网络部分最好有LDM或者Stable Diffusion的基础&#xff0c;有基础的话会看的很轻松 Abstract 1.提出了一种网络结构支持额外输入条件控制大型预训练的扩散模型。利用预训练模型学习一组不同的条件控制。 2.ControlNet对于小型&#xff08;<50k&#xff09;或大型&#xff…

Halcon的HWindowControl控件在C#WinForm中的使用介绍(包括绘制ROI)

Halcon的HSmartWindowControl控件在C#WinForm中的使用介绍&#xff08;包括绘制ROI&#xff09; 文章目录 Halcon的HSmartWindowControl控件在C#WinForm中的使用介绍&#xff08;包括绘制ROI&#xff09;一、 引入hSmartWindowControl控件二、 编写打开图像功能三、 编写绘制RO…

如何保护您的企业免受人工智能生成的深度伪造品的侵害

最近&#xff0c;网络犯罪分子利用一家跨国公司高管的“深度伪造”视频&#xff0c;说服该公司驻香港的员工汇出 2560 万美元。 根据包含多个 Deepfake 的视频电话会议&#xff0c;员工认为是他们驻英国的首席财务官要求转移资金。 据报道&#xff0c;警方已逮捕六名与该诈骗案…

操作系统②——内存管理

1. 栈、堆 1.1 程序的内存分配 栈区&#xff08;stack&#xff09;&#xff1a;由编译器自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变量的值等。其操作方式类似于数据结构中的栈。堆区&#xff08;heap&#xff09;&#xff1a;一般由程序员分配释放&#x…

光猫桥接模式详细步骤

目录 一、前言 路由模式 &#xff08;宽带默认&#xff09; 桥接模式 二、桥接模式步骤 &#xff08;一&#xff09;图片记录备份 设备信息图 网络侧信息 远程管理密码 宽带上网设置 &#xff08;二&#xff09;桥接模式开始 光猫设置 路由器设置 一、前言 重点&a…

jQuery的链式编程

在jQuery中&#xff0c;如果一直对同一个元素进行函数操作&#xff0c;那么可以使用 函数操作名&#xff0c;一直写下去。 //这是普通的事件绑定$("button").click(function() {console.log("1")})$("button").mouseenter(function() {console.l…

存内计算技术在边缘计算、物联网设备中的应用及前景

存内计算技术简介 存内计算技术是一种新兴的计算范式&#xff0c;其核心理念是将存储和计算功能集成在同一硬件单元中。这种技术的优势在于能够在存储单元内部直接进行计算操作&#xff0c;从而减少数据在存储器和处理器之间的传输&#xff0c;提高计算效率。 以下是存内计算技…

2024-04-02 问AI:介绍一下深度学习中的 “迁移学习”

文心一言 迁移学习&#xff08;Transfer Learning&#xff09;是深度学习中一种重要的机器学习方法&#xff0c;其核心思想是将为某个任务A开发的模型作为初始点&#xff0c;重新使用在为任务B开发模型的过程中。这种方法的目的是通过从已学习的相关任务中转移知识&#xff0c…

2_5.Linux存储的基本管理

实验环境&#xff1a; 系统里添加两块硬盘 ##1.设备识别## 设备接入系统后都是以文件的形式存在 设备文件名称&#xff1a; SATA/SAS/USB /dev/sda,/dev/sdb ##s SATA, dDISK a第几块 IDE /dev/hd0,/dev/hd1 ##h hard VIRTIO-BLOCK /de…

sharding‐jdbc之分库分表(mysql主从同步的数据库安装和使用)

水平分表 创建基础工程.. 引入sharding‐jdbc的maven依赖包 注意需要数据库连接池等依赖 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1&l…

【JavaWeb】Day36.MySQL概述——数据库设计-DDL(三)

查询 关于表结构的查询操作&#xff0c;工作中一般都是直接基于图形化界面操作。 1.查询当前数据库所有表 2.查看指定表结构 3.查询指定表的建表语句 注意&#xff1a;23版的点击导航中的转到DDL 修改 关于表结构的修改操作&#xff0c;一般也是直接基于图形化界面操作。 添…

智能感应门改造工程

今天记录一下物联网专业学的工程步骤及实施过程 智能感应门改造工程 1 规划设计1.1 项目设备清单1.2项目接线图 软件设计信号流 设备安装与调试工程函数 验收 1 规划设计 1.1 项目设备清单 1.2项目接线图 软件设计 信号流 设备安装与调试 工程函数 工程界面: using System; …

半导体runcard(上)--基础知识精讲

半导体runcard是指在半导体制造过程中&#xff0c;用于记录和管理生产过程中的关键参数和数据的一种系统或方法。runcard可以是纸质的记录方式&#xff0c;也可以是电子化的管理系统。在半导体行业中&#xff0c;runcard的使用非常广泛&#xff0c;它涉及到从原材料检验、晶圆加…

【STM32】存储器和位带映射(bit band mapping)

文章目录 0 前言1 关于地址和存储器2 STM32内部存储器3 位带映射&#xff08;bit band mapping&#xff09;4 扩展&#xff1a;IAP 0 前言 最近在研究stm32标准库&#xff0c;对使用宏定义实现位操作的函数非常感兴趣&#xff0c;简单的一句PAout(1) 0;就能实现某个引脚电平的…

bash简化if-else

#!/usr/bin/env bashsource /bal/bash-simplify/dir_util.sh#测试_get_arg: #debug__get_argtrue; x$(_get_arg example.sh 37 "true ||") ; echo $x #_is_git_2xfunction _get_arg(){ ##若变量debug__get_arg为空&#xff0c;则设置其为false # [ "x" &…