调用本地大模型实现聊天机器人ChatBot

news2024/11/23 14:57:13

AWS Instance本地部署大模型

AWS上申请带GPU的instance,例如g4dn系列,申请instance后安装CUDA的driver,driver安装完成后,就可以在带gpu的instance上部署开源的大模型了。如果想了解在aws上部署本地模型细节,可以阅读我的这两篇博客。

AWS instance上本地部署大模型

Fastchat本地部署大模型

这里为了能在ChatBot上调用本地模型,使用FastChat进行部署,且启动了大模型的API接口。安装driver后,启动api接口和启动模型的命令如下所示。ssh连接到申请的instance后,执行下面的命令,即可部署开源的vicuan-7b-v1.5模型,当然,你也可以部署其他开源模型,只需要修改--model-path的值即可。

git clone https://github.com/lm-sys/FastChat.git
cd FastChat
#下载FastChat代码

pip3 install --upgrade pip  # enable PEP 660 support
pip3 install -e ".[model_worker,webui]"
#安装依赖

python3 -m fastchat.serve.controller
#启动fastchat的controller

python3 -m fastchat.serve.model_worker --model-names "gpt-3.5-turbo,text-davinci-003,text-embedding-ada-002,vicuan-7b-v1.5" --model-path lmsys/vicuna-7b-v1.5
#启动模型,设置model-names等于是给启动的模型设置的别名

python3 -m fastchat.serve.openai_api_server --host localhost --port 8000
#启动API服务

对于上面的命令,需要注意两点。

第一点:

通过--model-names命令,等于是对启动的模型设置了别名,上面的命令中设置了多个别名,后面使用任意一个别名,本质上调用的还是vicuan-7b-v1.5模型。那么为什么要将vicuan-7b-v1.5模型设置成和OpenAI提供的模型相同的名称呢?因为FastChat在封装Embedding接口的时候,调用了OpenAI开源的ticktoken库,如果在写应用的时候,需要对内容进行向量化,即调用Embedding接口,模型名称如果不是OpenAI提供的模型名称,就会报错,具体错误如下所示:

查看FastChat的源代码,会发现在代码中调用了OpenAI的tiktoken库。所以,如果是调用Embedding接口,即将信息转换成向量的接口时,传入的模型名称必须是OpenAI提供的模型名词。如果是与机器对话的接口,例如chat/completions接口,此时,可以使用任何自定义的模型名称。

第二点:

在启动api服务时,模型的host是localhost,如果是在aws的instance上启动,host需要设置为0.0.0.0,这样才能从外网成功访问到启动的API服务。上面的命令中API启动在8000端口上,为了从外面的浏览器上成功访问到,需要在aws instance的security group中设置inbound规则,增加开放8000端口的规则。具体如下图所示:启动API时,监听的哪个端口,就开放哪个端口。如果为了更加安全,可以把Source设置为自己电脑所在的公网IP地址,这样更加安全可控。

设置环境变量OPEN_API_BASE

上面的配置和部署成功后,还需要在外面电脑的环境变量中设置API接口地址,因为编写Chatbot时使用了Lanchain,我们需要修改默认的OpenAI api的base url。查看Langchain的源代码会看到有这些环境变量的检查,这里设置OPENAI_API_BASE的值为启动的本地模型的API的base url。即“http://public ip:8000/v1” 这个值,public ip是aws instance的public ip。

使用Lanchain编写Chatbot

下面是使用Lanchain编写Chatbot的代码,代码中可以通过参数动态传入模型名称,这样就可以灵活控制具体选用哪个模型了。

def chat_with_model(model_name, question, history):
    llm = ChatOpenAI(model=model_name, temperature=0.5)
    prompt = ChatPromptTemplate(
        messages=[
            SystemMessagePromptTemplate.from_template(
                "You are a nice chatbot having a conversation with a human."
            ),
            # The `variable_name` here is what must align with memory
            MessagesPlaceholder(variable_name="chat_history"),
            HumanMessagePromptTemplate.from_template("{question}"),
        ]
    )
# Notice that we `return_messages=True` to fit into the MessagesPlaceholder
# Notice that `"chat_history"` aligns with the MessagesPlaceholder name
    memory = ConversationBufferMemory(
        memory_key="chat_history", return_messages=True)
    conversation = LLMChain(llm=llm, prompt=prompt,
                            verbose=True, memory=memory)
# Notice that we just pass in the `question` variables - `chat_history` gets populated by memory
    bot_message = conversation({"question": question})['text']
    history.append((question, bot_message))
    return '', history

前端是使用gradio框架编写,具体代码如下图所示:

with gr.Blocks() as simple_chat:
    with gr.Row():
        chat_model_radio = gr.Radio(
            ["gpt-3.5-turbo", "vicuna-7b-v1.5"], label="Chat Model")
    chatbot = gr.Chatbot()
    input_textbox = gr.Textbox()
    clear_button = gr.ClearButton([chatbot, input_textbox])

    input_textbox.submit(chat_with_model, inputs=[chat_model_radio,
                                                  input_textbox, chatbot], outputs=[input_textbox, chatbot])

 启动应用,选择模型名称,就可以与本地部署的大模型开始对话了。可以看到,当问她是谁时,大模型返回了Vicuna模型,说明调用到的确实是本地部署的大模型。

基于本地模型做知识问答

除了调用本地模型做chatbot外,还可以调用本地模型做基于知识的问答系统,做知识问答系统的时候需要将文档进行切割和向量化,此时输入的模型名称不能是vicuna-7b-v1.5,需要用其他模型别名,例如“text-embedding-ada-002”或者是“gpt-3.5-turbo”等。否则,向量化的时候会报错。如果对如何实现知识问答系统不清楚,可以查看我这篇博客。

利用Lanchain实现RAG

实现后的效果图如下所示:这里导入的知识库是路遥的小说<人生>这本书,向量化后,询问大模型高加林是谁,能比较准确的进行回答。这里Chat的模型选择的是vicuna-7b-v1.5,embedding的模型选择的是text-embedding-ada-002,实际模型本质都是vicuna-7b-v1.5,text-embedding-ada-002只是别名而已。因为已经在环境变量中修改了OPENAI_API_BASE的地址,所以,不可能会调用到真正的OPENAI的任何接口了。

在向量化文本过程中,因为是单个GPU的instance部署的大模型,可能会出现内存不够的错误,具体错误信息如下图所示:

FastChat对于这类错误,官网给出的解决办法是设置Batch-Size的大小为1 “export FASTCHAT_WORKER_API_EMBEDDING_BATCH_SIZE=1”,实际设置后,还是会报内存不够的问题,此时,可以将导入的文档内容减小一些,就不会出错了。这个本质是硬件不够的问题。大家知道如何避免即可。

以上就是对如何调用本地大模型实现ChatBot的介绍。

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

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

相关文章

【网络奇遇记】那年我与计算机网络的初相识 —— 网络的体系结构

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. 常见的三种计算机网络体系结构1.1 开放系统互连参考模型1.2 TCP/IP参考模型1.3 原理参考模型 二…

Axure基础详解二十:中继器随机抽奖效果

效果演示 组件 一、中继器 建立一个“中继器”内部插入一个“正方形”&#xff0c;给“正方形”添加一个【样式效果】>>【选中状态】填充背景为红色&#xff0c;字体白色。在中继器表格中插入两列数据函数&#xff1a;【xuhao】(序号列&#xff0c;按12345……填写&…

系列八、JVM的内存结构【方法区】

一、概述 方法区是一个供各线程共享的运行时内存区域。它存储了每一个类的结构信息&#xff0c;例如运行时常量池&#xff08;Runtime Constant Pool&#xff09;、字段和方法数据、构造函数和普通方法的字节码内容。上面讲的是规范&#xff0c;在不同的虚拟机里面实现是不一样…

【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(一)

文章目录 Abstract第一章 引言1.1 问题陈述1.2 研究假设1.3 贡献1.4 大纲 第二章 背景和相关工作2.1 CAN安全威胁2.1.1 CAN协议设计2.1.2 CAN网络攻击2.1.3 CAN应用攻击 2.2 可信执行2.2.1 软件认证2.2.2 消息身份认证2.2.3 可信执行环境2.2.4 Sancus2.2.5 VulCAN 2.3 侧信道攻…

Linux---(七)Makefile写进度条(三个版本)

文章目录 一、前提引入&#x1f397;️下面的代码什么现象&#xff1f;&#x1f397;️下面的代码什么现象&#xff1f; 二、缓冲区三、回车换行&#x1f397;️注意&#x1f397;️图解&#x1f397;️老式回车键造型&#xff08;意思是充当两个动作&#xff09;&#x1f397;…

一张图厘清各大操作系统的发展脉络

Unix&#xff1a;Unix是一种多用户、多任务、支持多种处理器架构的操作系统。它最初由贝尔实验室的Ken Thompson和Dennis Ritchie在20世纪70年代初开发&#xff0c;是第一个广泛使用的通用操作系统。Unix具有可移植性和可扩展性&#xff0c;因此被广泛应用于服务器、工作站和超…

轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码

轻松搭建短域名短链接服务系统&#xff0c;可选权限认证&#xff0c;并自动生成证书认证把nginx的http访问转换为https加密访问&#xff0c;完整步骤和代码。 在互联网信息爆炸的时代&#xff0c;网址复杂而冗长&#xff0c;很难在口头告知他人&#xff0c;也难以分享到社交媒体…

学人工智能等于失业?

随着科技的快速发展&#xff0c;人工智能已经渗透到我们生活的方方面面&#xff0c;从手机、智能家居到自动驾驶汽车&#xff0c;都离不开人工智能技术的支持。 因此&#xff0c;学习人工智能已经成为越来越多人追求高薪职业的选择。在这篇文章中&#xff0c;我们将探讨学习人…

树状图怎么画?推荐这个好用的在线树状图软件!

在日常工作和学习中&#xff0c;我们需要用到各种各样的图表&#xff0c;树状图是其中之一。 树状图是什么&#xff1f; 树状图是一种层次式的图形结构&#xff0c;可以用来展示数据之间的关系&#xff0c;并且可以在一定程度上提高工作和学习的效率。 树状图通常用来表示…

第七部分:Maven(项目管理工具)

目录 Maven简介 7.1&#xff1a;为什么学习Maven&#xff1f; 7.1.1、Maven是一个依赖管理工具 7.1.2&#xff1a;Maven是一个构建工具 7.1.3&#xff1a;结论 7.2&#xff1a;Maven介绍 7.3&#xff1a;Maven的优点 Maven安装和配置 7.4&#xff1a;安装教程及环境配置 …

echarts双轴刻度线y轴刻度线对齐

splitNumber属性主要用于设置坐标轴分割的段数。例如&#xff0c;在类目轴&#xff08;category&#xff09;中&#xff0c;可以通过设置splitNumber属性来控制坐标轴被分割成的段数。需要注意的是&#xff0c;这个分割段数只是一个预估值&#xff0c;最终实际显示的段数会在这…

采访仁川市政府:探索《仁川登陆行动》体验及其 NFT 作品集背后的故事!

请简单介绍一下自己 大家好&#xff0c;我是仁川市政府品牌经理崔俊浩&#xff0c;负责《仁川登陆行动》的元宇宙活动。很高兴见到您。 是什么启发了你创作《仁川登陆行动》体验&#xff1f; 《仁川登陆行动》并未得到广泛认可&#xff0c;并且被认为是一项几乎不可能完成的任务…

世界坐标系,相机坐标系,像素坐标系转换 详细说明(附代码)

几个坐标系介绍,相机内外参的回顾参考此文。 本文主要说明如何在几个坐标系之间转换。 本文涉及: 使用相机内参 在 像素坐标系 和 相机坐标系 之间转换。使用相机外参(位姿)在相机坐标系 和 世界坐标系 之间转换。(qw,qx,qy,qz,tx,ty,tz)形式的外参如何使用。以具体情景为…

《高效能人士的七个习惯》思维导图

2006年诺贝尔和平奖得主穆罕默德尤努斯说&#xff0c;《高效能人士的七个习惯》让世人明白一个真理&#xff1a;我们的思维方式会改变生活。如果我们觉得自己穷&#xff0c;就会真的穷。柯维博士教给我们&#xff1a;改变生活的关键是改变思维方式——我们每个人都有无穷的潜力…

期刊会议的选择

目录 找到所有⽬标期刊定具体期刊 找到所有⽬标期刊 定具体期刊

锂离子电池充电的系统抖动问题解决方案

前言 在设计锂离子电池充电器时&#xff0c;会因为充电电流波动导致电压波动&#xff0c;系统异常。 所以分析了锂离子电池的特性&#xff0c;给出了几种解决方法。 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com 理论 锂电池简单地可看做一…

【C++学习手札】模拟实现vector

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;くちなしの言葉—みゆな 0:37━━━━━━️&#x1f49f;──────── 5:28 &#x1f504; ◀️ ⏸ ▶️ ☰…

傻瓜式提取网页数据的油猴脚本(JavaScript 代码)

目录 一、脚本适用范围 二、将脚本配置到浏览器 三、脚本用法 四、脚本原理 一、脚本适用范围 脚本适用范围&#xff1a;一次性提取任意网站的布局类似的数据&#xff0c;例如 淘宝的商品价格、微博的热搜标题、必应搜索的图片链接 脚本不适用范围&#xff1a;页面布局不相…

协同办公是什么?如何高效协同办公?读这篇就够了!

协同办公是指在工作中&#xff0c;团队成员通过共享信息、协作完成任务&#xff0c;实现高效的工作方式。它有助于促进团队成员之间的沟通、合作和协调&#xff0c;提升工作效率和质量。以下是一些实现高效协同办公的建议和好用的工具推荐。 首先&#xff0c;建立清晰的沟通渠…

单稳态中间继电器\UEG/A-2H/220V 8A导轨安装 JOSEF约瑟

UEG系列中间继电器 UEG/A-2H2D中间继电器UEG/A-4H4D中间继电器UEG/A-2D中间继电器 UEG/A-2H中间继电器UEG/A-4H中间继电器UEG/A-4D中间继电器 UEG/A-6H中间继电器UEG/A-6D中间继电器UEG/A-8H中间继电器 UEG/A-10D中间继电器UEG/A-10H中间继电器UEG/A-2DPDT中间继电器 UEG/A-4DP…