使用AMD GPU和LangChain构建问答聊天机器人

news2024/11/28 4:32:32

Question-answering Chatbot with LangChain on an AMD GPU — ROCm Blogs

作者:Phillip Dang 2024年3月11日

LangChain是一个旨在利用语言模型强大功能来构建前沿应用程序的框架。通过将语言模型连接到各种上下文资源并基于给定的上下文提供推理能力,LangChain创建了能够智能推理和响应的上下文感知应用程序。在这篇博客中,我们演示了如何使用LangChain和Hugging Face来创建一个简单的问答聊天机器人。我们还展示了如何使用检索增强生成(RAG)技术来增强我们的大型语言模型(LLM)知识,然后允许我们的机器人根据指定文档中的信息来回答查询。

前提条件

要运行本文中的内容,你需要以下条件:

  • AMD GPUs: AMD Instinct GPU.

  • Linux: see the supported Linux distributions.

  • ROCm 6.0+

  • PyTorch

  • 或者,你可以启动一个包含以上设置的 Docker 容器,将 /YOUR/FOLDER 替换成你选择的目录,它将挂载到 Docker 根目录。下面是一个使用 ROCm 6.2 和 PyTorch 2.3 的示例:

    docker run -it --group-add=video --ipc=host --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --device /dev/kfd --device=/dev/dri -v /YOUR/FOLDER:/root rocm/pytorch:rocm6.2_ubuntu22.04_py3.10_pytorch_release_2.3.0
    

为了检查你的硬件并确保系统识别你的 GPU,请运行:

! rocm-smi --showproductname

你的输出应该如下所示:

================= ROCm System Management Interface ================
========================= Product Info ============================
GPU[0] : Card series: Instinct MI210
GPU[0] : Card model: 0x0c34
GPU[0] : Card vendor: Advanced Micro Devices, Inc. [AMD/ATI]
GPU[0] : Card SKU: D67301
===================================================================
===================== End of ROCm SMI Log =========================

接下来,确保 PyTorch 检测到你的 GPU:

import torch
print(f"number of GPUs: {torch.cuda.device_count()}")
print([torch.cuda.get_device_name(i) for i in range(torch.cuda.device_count())])

你的输出应该如下所示:

number of GPUs: 1
['AMD Radeon Graphics']

要构建一个能够与文档聊天的聊天机器人,你将需要以下三个工具:

  • LangChain

  • 一个语言模型

  • 使用 Facebook AI 相似性搜索 (FAISS) 的 RAG

LangChain

LangChain 作为一个框架,用于创建由语言模型驱动的应用程序。它允许应用程序:

  • 通过将语言模型与上下文资源(如提示、示例或相关内容)链接来*拥抱上下文性*,以丰富其响应。

  • 依靠语言模型根据给定的上下文逻辑地推导答案,并决定采取适当的行动来*进行推理*。

要安装 LangChain,请运行 pip install langchain langchain-community

语言模型

在本博客中,我们使用Google Flan-T5-large作为我们的底层语言模型。

要安装我们的语言模型并与文档聊天,请运行以下代码:`pip install transformers sentence-transformers`。

带有 FAISS 的 RAG

尽管大规模语言模型(LLM)在各种领域都很智能,但它们的知识仅限于在训练完成时可供其使用的公共信息。如果我们希望模型考虑私有信息或训练后的数据,我们必须自己添加这些额外的信息。这个添加过程叫做RAG,而用于高效检索相关信息的工具是FAISS。

FAISS是一个用于高效相似性搜索和密集向量聚类的库。它广泛用于近邻搜索、相似性匹配以及在大型数据集中的其他相关操作。它帮助我们高效存储新的信息,并根据我们的查询检索最相关的信息块。

要安装FAISS,请运行`pip install faiss-cpu`。

Q&A 聊天机器人

首先,设置您的语言模型。您需要拥有一个Hugging Face API Token。

import os
from langchain import HuggingFaceHub, LLMChain
from langchain.prompts import PromptTemplate

os.environ["HUGGINGFACEHUB_API_TOKEN"] = "your Huggingface API Token here"

llm = HuggingFaceHub(repo_id="google/flan-t5-large",model_kwargs={'temperature':0.5,
                                                               'max_length': 512})

一旦您有了您的模型,您可以通过 LangChain 的 LLMChain 来将各组件组合在一起。LLMChain 使用 PromptTemplate 来结构化用户输入,然后将这些输入发送给您的语言模型进行处理。这使得 LLMChain 成为生成连贯语言的有价值工具。

template = """Question: {question}
Answer: Let's think step by step."""

prompt = PromptTemplate(template=template, input_variables=["question"])
llm_chain = LLMChain(prompt=prompt, llm=llm)

现在是有趣的部分——让我们向聊天机器人问几个问题:

输入:

question =  "What is the capital of Ecuador?"
llm_chain.run(question)

输出:

'Quito is the capital city of Ecuador. Quito is located in the north of the country. The answer: Quito.'

输入:

question =  "What is GTA? "
llm_chain.run(question)

输出:

'GTA is an abbreviation for Grand Theft Auto. GTA is a video game series. The answer: video game series.'

输入:

question =  "What are some key advantages of LoRA for LLM?"
llm_chain.run(question)

输出:

'LoRA is a centralized repository for all LLM degree work. The LLM degree program at the University of
Michigan was the first to use LoRA for their degree program. The University of Michigan School of Law
is the first law school in the United States to use LoRA for their degree program.'

最后一个问题的答案是错误的。这可能是因为模型的训练数据中没有包含关于 LoRA 的信息。在下一部分中,我们将通过应用 RAG 技术来解决这个问题。

Q&A 聊天机器人使用 RAG 技术

根据前一节的内容,模型错误地回答了我们关于LoRA技术的问题——这可能是因为在模型训练时没有包含该信息。要解决这个问题,你可以使用RAG技术将信息包含到你的模型中。

RAG工作分为两个阶段:

  1. 检索阶段:给定一个查询(例如,一个临床问题),模型在大型数据库中搜索相关文档或片段。

  2. 生成阶段:模型使用检索到的信息生成响应,确保输出基于输入数据,在我们的例子中将是一个PDF。

要看到这点的实际效果,你需要创建两个函数,一个用于处理我们的输入数据(关于LoRA的PDF论文),另一个用于构建我们的知识数据库。

from langchain.vectorstores import FAISS
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings

def process_text(text):
    # 使用LangChain的CharacterTextSplitter将文本分割成片段
    text_splitter = CharacterTextSplitter(
        separator="\n", chunk_size=256, chunk_overlap=64, length_function=len
    )
    chunks = text_splitter.split_text(text)

    # 将文本片段转换为嵌入以形成知识库
    embeddings = HuggingFaceEmbeddings(model_name='sentence-transformers/all-mpnet-base-v2')
    knowledgeBase = FAISS.from_texts(chunks, embeddings)

    return knowledgeBase

import PyPDF2
import requests
from io import BytesIO

# 阅读PDF论文
pdf_url = "https://arxiv.org/pdf/2106.09685.pdf" 
response = requests.get(pdf_url)
pdf_file = BytesIO(response.content)
pdf_reader = PyPDF2.PdfReader(pdf_file)

def get_vectorstore():
    # 从pdf_reader构建向量存储
    text = ""
    # 变量text将存储pdf文本
    for page in pdf_reader.pages:
        text += page.extract_text()

    # 创建知识库对象
    db = process_text(text)
    return db

db = get_vectorstore()

现在,通过加载LangChain的Q&A链,搜索知识数据库中最相关的信息,并查看聊天机器人是否能提供更准确的答案来将所有内容结合在一起:

from langchain.chains.question_answering import load_qa_chain
# 加载Q&A链
chain = load_qa_chain(llm, chain_type="stuff", prompt=)

query = "what are some key advantages of LoRA for LLM?"
# 搜索数据库中相关的信息
docs = db.similarity_search(query=query)

# 运行我们的链
chain.run(input_documents=docs, question=query)

输出:

'LORA makes training more efficient and lowers the hardware barrier to entry by up to 3 times when
using adaptive optimizers since we do not need to calculate the gradients or cantly fewer GPUs and
avoid I/O bottlenecks. Another benefit is that we can switch between tasks while deployed at a much
lower cost by only swapping the LoRA weights as opposed to all the'

在为我们的模型提供了额外的信息后,更新的答案显然更加相关,通过`input_documents=docs`参数可以实现这一点。
我们建议测试不同的LLM作为基础模型,并尝试用于不同用例的各种LLMChain。我们还鼓励实验不同的处理方法,并细分输入文档以提高相似性搜索的相关性。 

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

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

相关文章

一篇文章总结 SQL 基础知识点

1. 官方文档 MySQL:https://dev.mysql.com/doc/refman/8.4/en/ SQL Server:What is SQL Server? - SQL Server | Microsoft Learn Oracle:https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loe.html 2. 术语 SQL S…

【Java数据结构】树】

【Java数据结构】树 一、树型结构1.1 概念1.2 特点1.3 树的类型1.4 树的遍历方式1.5 树的表示形式1.5.1 双亲表示法1.5.2 孩子表示法1.5.3 孩子双亲表示法1.5.4 孩子兄弟表示法 二、树型概念(重点) 此篇博客希望对你有所帮助(帮助你了解树&am…

【MyBatis源码】SqlSource对象创建流程

文章目录 介绍XMLScriptBuilder初始化parseDynamicTags解析动态节点RawSqlSource分析代码分析实例化 介绍 代码入口: SqlSource sqlSource langDriver.createSqlSource(configuration, context, parameterTypeClass);languageRegistry:用于注册Langua…

centos下面的jdk17的安装配置

文章目录 1.基本指令回顾2.jdk17的安装到这个centos上面2.1首先切换到这个root下面去2.2查看系统jdk版本2.3首先到官网找到进行下载2.4安装包的上传2.5jdk17的安装包的解压过程2.6配置环境变量2.7是否设置成功,查看版本 1.基本指令回顾 ls:list也就是列出来这个目录…

基于Multisim的数字温度计设计与仿真

1.设计测量范围为 0℃到 99℃的数字温度计 2.可实时显示温度 3.精度误差小于 1℃ 4.LED 数码直读显示温度大小 链接:https://pan.baidu.com/s/1isIHpMESTBTf2T2SY9-iPw 提取码:qh4o

明日周刊-第25期

十月的最后几天了,将要迎来十一月。冬天快乐 文章目录 科技短讯AI珠宝设计平台Meta AI获准使用路透社新闻OpenAI:今年不会发布“Orion”模型谷歌音乐AI创作工具Meta上线AI播客生成器📱科技大厂Waymo完成5.6亿美元新融资波音考虑出售航天业务苹…

Android AAR嵌套AAR打包出现问题解决方案

一、背景 module 打包一般会打包成 aar 的形式。如果 module 引用了一个本地的 aar,在打包的时候,这个被引用的 aar 是不会打包进去的,这种设计思想是比较好的,可以很好的避免包冲突的问题。例如 App 引用了两个 aar(1…

构建生产级的 RAG 系统

对 RAG 应用程序进行原型设计很容易,但要使其高性能、健壮且可扩展到大型知识语料库却很困难。 本指南包含各种提示和技巧,以提高 RAG 工作流程的性能。我们首先概述一些通用技术 - 它们按照简单到复杂的顺序进行排列。然后,我们将更深入地研…

【移动应用开发】Android持久化技术

目录 一、实现一个“我的图书馆” 1. 用户登陆界面 1.1 运行截图 1.2 源代码 ① 布局文件activity_login.xml ② res/values/strings.xml ③ LoginActivity.kt ④ 在AndroidManifest.xml注册LoginActivity.kt 2. 图书信息数据库和显示界面 2.1 功能实现截图 2.2 源…

二百七十一、Kettle——ClickHouse增量导入数据清洗记录表

一、目的 在完成错误数据表任务后,需要对每条错误数据的错误字段及其字段值进行分析 Hive中原有SQL语句和ClickHouse现有SQL语句很大不同 二、Hive中原有代码 2.1 表结构 --31、静态排队数据清洗记录表 create table if not exists hurys_db.dwd_data_clean_…

kubernetes——part2-3 使用RKE构建企业生产级Kubernetes集群

使用RKE构建企业生产级Kubernetes集群 一、RKE工具介绍 RKE是一款经过CNCF认证的开源Kubernetes发行版,可以在Docker容器内运行。 它通过删除大部分主机依赖项,并为部署、升级和回滚提供一个稳定的路径,从而解决了Kubernetes最常见的安装复杂…

软件测试学习笔记丨Selenium学习笔记:css定位

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22511 本文为霍格沃兹测试开发学社的学习经历分享,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 说明:本篇博客基于sel…

【瑞吉外卖】-day01

目录 前言 第一天项目启动 获取资料 创建项目 ​编辑 连接本地数据库 连接数据库 修改用户名和密码 ​编辑创建表 创建启动类来进行测试 导入前端页面 创建项目所需目录 检查登录功能 登录界面 登录成功 登录失败 代码 退出功能 易错点 前言 尝试一下企业级项…

【论文阅读】ESRGAN

学习资料 论文题目:增强型超分辨率生成对抗网络(ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks)论文地址:[1809.00219] ESRGAN:增强型超分辨率生成对抗网络代码:xinntao / ESRGAN&am…

【HarmonyOS】判断应用是否已安装

【HarmonyOS】判断应用是否已安装 前言 在鸿蒙中判断应用是否已安全,只是通过包名是无法判断应用安装与否。在鸿蒙里新增了一种判断应用安装的工具方法,即:canOpenLink。 使用该工具函数的前提是,本应用配置了查询标签querySch…

Linux内核-tmpfs虚拟文件系统

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们的Linux进阶部分,到目前为止,已经讲过:硬件,日常运维,基础软…

机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用

市场应用背景 DELTA并联机械手是由三个相同的支链所组成,每个支链包含一个转动关节和一个移动关节,具有结构紧凑、占地面积小、高速高灵活性等特点,可在有限的空间内进行高效的作业,广泛应用于柔性上下料、包装、分拣、装配等需要…

基于SSM+小程序的购物管理系统1

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的购物管理系统1,可以实现首页、个人中心、商品分类管理、商品信息管理、特价商品管理、用户管理、留言板管理、系统管理、订单管理等功能。方便用户对首页、商品…

Redis 事务 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 事务 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 事务 & 总结》(学习总结/最新最准/持续更新)《Redis & 事务…

正点原子阿尔法ARM开发板-IMX6ULL(十一)——IIC协议和SPI协议--AP3216C环境光传感器和ICM20608六轴传感器

文章目录 一、前言二、 IIC协议2.1 协议解读2.1.1 起始位、停止位、数据传输2.1.2 写时序2.1.3 读时序 2.2 代码分析2.3 AP3216C环境光传感器的代码分析 三、SPI协议3.1 协议解读3.2 代码分析3.3 ICM-20608六轴传感器代码分析 一、前言 看了IIC,我之前毕设用过这个…