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

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的介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

upload-labs关卡11(双写后缀名绕过)通关思路

文章目录 前言一、回顾前几关知识点二、靶场第十一关通关思路1、看源代码2、bp抓包双写后缀名绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的…

主键问题以及分布式 id

分布式 id 需要处理的问题主要是同一时间在多台机器中保证生成的 id 唯一&#xff0c;为了这么做我们可以这么做&#xff1a; 分布式 id 生成策略 先说几个已经被淘汰的策略引出分布式 id 的问题 1&#xff0c;UUID&#xff1a;UUID 随机并且唯一&#xff0c;在单一的数据库…

JS进阶——构造函数数据常用函数

1、深入对象 1.1 创建对象三种方式 1.1.1 利用对象字面量创建对象 1.1.2 利用new Object创建对象 1.1.3 利用构造函数创建对象 1.2 构造函数 构造函数&#xff1a;是一种特殊的函数&#xff0c;主要用来初始化对象 使用场景&#xff1a;常规的{...}语法允许创建一个对象。…

【数据结构】手撕双向链表

目录 前言 1. 双向链表 带头双向循环链表的结构 2. 链表的实现 2.1 初始化 2.2 尾插 2.3 尾删 2.4 头插 2.5 头删 2.6 在pos位置之前插入 2.7 删除pos位置 3.双向链表完整源码 List.h List.c 前言 在上一期中我们介绍了单链表&#xff0c;也做了一些练习题&…

IC设计企业,如何安全、可控、高效的传输设计文档和研发数据?

近年来&#xff0c;半导体的应用领域不断拓展&#xff0c;在全球经济和社会发展中的重要性与日俱增&#xff0c;半导体芯片是数字经济的核心&#xff0c;承载着现代产业发展&#xff0c;具有举足轻重的价值。从半导体行业的角度&#xff0c;IC设计是关键的一环&#xff0c;我国…

中科创达:坚定看好未来十五年的大模型机遇

中科创达是一家成立于2008年的智能操作系统产品和技术提供商&#xff0c;15年前公司成立的时候正赶上了安卓操作系统将功能手机推向了智能手机&#xff0c;截至目前&#xff0c;已赋能超过近9亿台手机走向市场。2014年中科创达开始拓展智能汽车方向&#xff0c;2015年拓展物联网…

CSGO的那些事儿:CS2这么差,为什么不改回CS1?

揭秘csgo饰品涨价背后的残酷真相 1、V社现在更新内容集中在游戏性的修复方面。 所以原来期望的新地图新大行动等&#xff0c;要等到游戏本体趋于稳定后才更新。但是&#xff0c;因为距离下一个大型活动&#xff0c;也就是丹麦major还有5个月时间&#xff0c;那这之间必然要有一…

kubernetes 高可用集群

目录 一、haproxy负载均衡 二、pacemaker高可用 三、部署control-plane 四、部署worker node 实验环境 主机名 IP 角色 docker 192.168.67.10 harbor k8s1 192.168.67.11 control-plane k8s2 192.168.67.12 control-plane k8s3 192.168.67.13 control-plane k8s…

opencv(5): 滤波器

滤波的作用&#xff1a;一幅图像通过滤波器得到另一幅图像&#xff1b;其中滤波器又称为卷积核&#xff0c;滤波的过程称为卷积。 锐化&#xff1a;边缘变清晰 低通滤波&#xff08;Low-pass Filtering&#xff09;&#xff1a; 目标&#xff1a;去除图像中的高频成分&#…

【打卡】牛客网:BM55 没有重复项数字的全排列

自己写的&#xff1a; 虽然题目要求了排序&#xff0c;但是我没排序也可以通过。 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param num int整型vector * return int整型vector<vec…

23届计科,想找Java开发之类,真的是很难吗?

23届计科&#xff0c;想找Java开发之类&#xff0c;真的是很难吗&#xff1f; 你的投递信息(投递多少家&#xff0c;如何跟hr打招呼&#xff0c;已读不回如何应对等)都亮- -下才能知道问题出在 哪。最近很多小伙伴找我&#xff0c;说想要一些Java的资料&#xff0c;然后我根据…

Ubuntu 下C++数字雨

以前写过一个Window下的数字雨&#xff0c;像黑客帝国里那样的01数字&#xff0c;现在补充一版Linux下的。使用了curses库&#xff0c;安装方法与使用方法参照 Linux下curses函数库的详细介绍_libcurses库-CSDN博客 5-linux学习笔记之-----curses-CSDN博客 效果如下&#xf…

21. 深度学习 - 拓朴排序的原理和实现

文章目录 Hi,你好。我是茶桁。 上节课&#xff0c;我们讲了多层神经网络的原理&#xff0c;并且明白了&#xff0c;数据量是层级无法超过3层的主要原因。 然后我们用一张图来解释了整个链式求导的过程&#xff1a; 那么&#xff0c;我们如何将这张图里的节点关系来获得它的求…

抖音自动评论脚本,可按关键词,实现批量点赞,按键精灵开源版!

这个脚本是我之前给一个客户开发的&#xff0c;现在用着也没啥意义&#xff0c;开发了很多&#xff0c;我索性就把代码直接分享出来&#xff0c;给一些新手做学习研究用&#xff0c;里面很多结构都是自己花费了很大的心思和心血才弄出来的&#xff0c;所以价值很高。 UI界面&a…

OpenAI GPT5计划泄露

OpenAI的首席执行官萨姆奥特曼在最近接受《金融时报》的专访时&#xff0c;分享了OpenAI未来发展的一些新动向。此外&#xff0c;他还透露了关于即将到来的GPT-5模型以及公司对AGI的长期目标的一些细节。 奥特曼指出&#xff1a; 1.OpenAI正在开发GPT-5&#xff0c;一种更先进的…

QT绘图设备

pixmap绘图设备在磁盘上进行绘图 通过pix.save将图片保存到E盘下 不是主要的绘画设备&#xff0c;可以将绘图指令保存 然后在下边可以调用重现绘图指令

多媒体领域顶会ACM MM 2023 获奖论文一览

ACM 国际多媒体会议是计算机科学领域中多媒体领域的顶级会议&#xff0c;属于CCF A类。今年的ACM MM 2023 已于2023年10月29日至11月2日在加拿大渥太华举行。 ACM MM会议专注于推动多媒体研究和应用&#xff0c;其研究领域广泛涉及触觉、视频、VR/AR、音频、语音、音乐、传感器…

Unity 场景烘培 ——LensFlare镜头光晕(三)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神指出&#xff01; 文章目录 前言一、镜头光晕 (Lens Flares)是什么&#xff1f;二、使用Lens Flares组件总结 前言 一般情况下都会忽略的东西&#xff0c;镜头光晕。理论上不加镜头光晕&#xff0c;也不会有什么影响…

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

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

洛谷 P3131 [USACO16JAN] Subsequences Summing to Sevens S

被普及-卡的没思路真是蒟蒻啊233 优化思路 每次都在枚举(a[r]-a[l-1])%70&#xff0c;所以可以认为数组大小对最终答案没有影响&#xff0c;考虑对前缀和数组取模&#xff0c;那么如果有a[r]的值等于a[l-1]的值相等&#xff08;即余数相等&#xff09;&#xff0c;那么两者相减…