NLP(六十)Baichuan-13B-Chat模型使用体验

  2023年7月11日,百川智能正式发布参数量130亿的通用大语言模型Baichuan-13B-Base、对话模型Baichuan-13B-Chat及其INT4/INT8两个量化版本。
  本文将介绍大模型BaiChuan-13B-Chat的使用体验,其HuggingFace网址为:https://huggingface.co/baichuan-inc/Baichuan-13B-Chat 。
  BaiChuan-13B-Chat模型采用FastChat工具部署,部署方式与Baichuan-7B模型相同,关于部署的详细步骤,可参考文章:NLP(五十九)使用FastChat部署百川大模型 。

使用初体验

  GPT3.5或者GPT4模型在中文问答上偶尔会出现“幻觉”问题,比如一些常识性的中文问题,在这方面,Baichuan-13B-Chat模型的表现较好。
  我们考虑以下三个问题:

  • 鲁迅和周树人是同一个人吗,简要回答?
  • 中国第三大岛是哪个?
  • 拉普拉斯获得过诺贝尔奖吗?

  这是GPT3.5的回答:

GPT3.5的回复
  这是GPT4的回复:

GPT4的回复
  这是Baichuan-13B-Chat模型的回复:
Baichuan-13B-Chat模型的回复

向量嵌入(Embedding)

  当我们完成Baichuan-13B-Chat模型的部署后,我们可以使用类似OpenAI的调用方式来调用该模型,以下是其在向量嵌入方面的表现。
  我们选择五个初始文本:

  • 唯心主义的对立面是什么
  • 你好
  • 上海的人口是多少?
  • 北京的旅游景点有哪些?
  • 中国的第一高楼

首先使用模型对以上文本进行向量嵌入(Embedding),向量维度为512维,范数为1(即已经进行规范化)。再使用新的文本进行向量嵌入,通过向量的余弦相似度获得五个文本中的最相似文本。实现Python如下:

# -*- coding: utf-8 -*-
import requests
import json
import numpy as npdef get_text_embedding(text):# Baichuan-13B-Chat Embeddingurl = "http://localhost:8000/v1/embeddings"headers = {'Content-Type': 'application/json'}payload = json.dumps({"model": "Baichuan-13B-Chat","input": text})response = requests.request("POST", url, headers=headers, data=payload)return response.json()["data"][0]['embedding']contents = ["唯心主义的对立面是什么","你好","上海的人口是多少?","北京的旅游景点有哪些?","中国的第一高楼"]embeddings = [get_text_embedding(content) for content in contents]new_text = '苏州的旅游景点有哪些?'
new_embedding = get_text_embedding(new_text)cosine_sim_list = []
for embedding in embeddings:cosine_sim_list.append(np.dot(np.array(new_embedding), np.array(embedding)))print(f'输入:{new_text}')
print(f'最相似文本:{contents[cosine_sim_list.index(max(cosine_sim_list))]}')

测试结果如下:

输入:苏州的旅游景点有哪些?
最相似文本:北京的旅游景点有哪些?

输入:柏拉图的哲学思想是什么?
最相似文本:唯心主义的对立面是什么

输入:北京的人口
最相似文本:上海的人口是多少?

文档阅读

  在向量嵌入的基础上,我们使用LangChain工具,将文档进行切分(split),之后转化为向量(Embedding),存入向量数据库(如Milvus),这样完成文档的储存。
  对于用户的新问题,使用文本相似度进行向量数据库查询,找到最接近的K条文本,使用这K条文本和新问题,进行文档问答,类似于BERT时代的阅读理解(MRC)。
  我们以中国载人登月工程百度百科中的文本为例,访问网址为:https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E8%BD%BD%E4%BA%BA%E7%99%BB%E6%9C%88%E5%B7%A5%E7%A8%8B/7147309 ,将其储存为txt文件。
中国载人登月工程百度百科
  以此为例进行文档问答,流程图参考如下:
LangChain中的文档问答流程
实现Python代码如下:

# -*- coding: utf-8 -*-
import json
import requests
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from pymilvus import (connections,utility,FieldSchema,CollectionSchema,DataType,Collection,
)# 指定要使用的文档加载器
documents = TextLoader('dengyue.txt', encoding='utf-8').load()
# 接下来,我们将文档拆分成块。
text_splitter = RecursiveCharacterTextSplitter(chunk_size=250, chunk_overlap=0)
texts = text_splitter.split_documents(documents)# 获取文本的向量嵌入,使用Baichuan-13B-Chat模型
def get_text_embedding(req_text):url = "http://localhost:8000/v1/embeddings"headers = {'Content-Type': 'application/json'}payload = json.dumps({"model": "Baichuan-13B-Chat", "input": req_text})new_req = requests.request("POST", url, headers=headers, data=payload)return new_req.json()['data'][0]['embedding']# 使用Baichuan-13B-Chat模型获取文档问答的答案
def get_doc_qa(qa_template):url = "http://localhost:8000/v1/chat/completions"payload = json.dumps({"model": "Baichuan-13B-Chat","messages": [{"role": "user","content": qa_chain_prompt}]})headers = {'Content-Type': 'application/json'}response = requests.request("POST", url, headers=headers, data=payload)return response.json()['choices'][0]['message']['content']# 连接Milvus
connections.connect("default", host="localhost", port="19530")# 创建一个collection
fields = [FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=False),FieldSchema(name="source", dtype=DataType.VARCHAR, max_length=100),FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=1000),FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=5120)
]
schema = CollectionSchema(fields, "vector db for docs qa")
hello_milvus = Collection("docs_qa", schema)# 数据插入
_ids = []
sources = []
contents = []
embeddings = []
for i, text in enumerate(texts):source = text.metadata['source']print(i+1, source)content = text.page_contentembedding = get_text_embedding(content)_ids.append(i+1)sources.append(source)contents.append(content)embeddings.append(embedding)insert_result = hello_milvus.insert([_ids, sources, contents, embeddings])
# After final entity is inserted, it is best to call flush to have no growing segments left in memory
hello_milvus.flush()# 在entities字段创建索引
index = {"index_type": "IVF_FLAT","metric_type": "IP","params": {"nlist": 128},
}
hello_milvus.create_index("embeddings", index)# 将collection加载至内存
hello_milvus.load()# 输入问题,进行文档问答
while True:query = input('输入问题:')vectors_to_search = [get_text_embedding(query)]# 通过嵌入向量相似度获取相似文本,数量为3个search_params = {"metric_type": "IP","params": {"nprobe": 10},}result = hello_milvus.search(vectors_to_search, "embeddings", search_params, limit=3, output_fields=["text"])context = ''.join([_.entity.get('text') for _ in result[0]])# 建立promptqa_chain_prompt = f"""使用以下文本来回答最后的问题。如果你不知道答案,就说你不知道,不要试图编造答案,尽可能保持答案简洁。 文本: {context}问题: {query}答案:"""# print(qa_chain_prompt)print(f'问题:{query}')print(f'回答:{get_doc_qa(qa_chain_prompt)}')

测试结果如下:

问题:美国什么时候登上月球?
回答:美国在20世纪60年代和70年代通过“阿波罗”计划成功登上月球。

问题:中国预计在什么登上月球?
回答:中国预计在2025年实现航天员登月。目前,关于中国载人登月工程计划的时间,国内有三种说法:2020年、2025年和2030年。不过,这些时间表都是专家的观点和预测,国家尚未公布一个明确的时间表。

问题:嫦娥二号、嫦娥三号的总指挥是谁?
回答:嫦娥二号、嫦娥三号的总指挥是叶培建。

问题:神舟十六号载人飞行任务新闻发布会在哪里举行?
回答:神舟十六号载人飞行任务新闻发布会在酒泉卫星发射中心举行。

当然,上述的文档问答方案并不是很完善,仅仅使用向量嵌入有时无法召回相似文本,这样就会造成回答错误。
  后续笔者将考虑ES + 向量加入的结合方式进行召回,同时支持更多类型的文本,不仅限于txt文件。

总结

  本文主要介绍了Baichuan-13B-Chat模型使用体验,包括其与GPT系列模型在中文常识性问题上的测试,以及向量嵌入、文档问答等。
  笔者使用下来的初步感受是,Baichuan-13B-Chat模型的问答效果还是不错的!

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

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

相关文章

【团队协作开发】IDEA中Git新建自己的dev工作分支,合并到master主分支教程(极其简单,新手)

文章目录 一、创建新dev工作分支二、push到自己的远程dev工作分支三、工作分支合并到master主分支1、先切换到master主分支2、将远程工作dev分支的内容merge到当前master分支中3、将merge提交到远程master分支 一、创建新dev工作分支 创建完新dev分支以后将默认切换到新dev分支…

FFmpeg5.0源码阅读—— avcodec_send_frame avcodec_receive_packet

摘要:本文主要描述了FFmpeg中用于编码的接口的具体调用流程,详细描述了该接口被调用时所作的具体工作。   关键字:ffmpeg、avcodec_send_frame、avcodec_receive_packet   读者须知:读者需要了解FFmpeg的基本使用流程&#xf…

如何理解自动化

目录 1.如何定义自动化 2.自动化给人类带来的福利 3.如何学习自动化 4.自动化潜在的危害 1.如何定义自动化 自动化是指利用计算机、机械、电子技术和控制系统等现代科学技术手段,对各种工业、商业、农业和日常生活中的操作和过程进行自动控制和执行的过程。它旨在…

Vc - Qt - 自定义ComboBox

示例代码创建了一个名为ComboBoxWidget的自定义QWidget类,并在initUI方法中创建了一个垂直布局。然后将一个只读的QLineEdit和一个QPushButton添加到布局中。当按钮被点击时,会调用showMenu方法,该方法创建一个QMenu并添加选项。每个选项连接…

CodeForces:Madoka and Underground Competitions

经过观察&#xff0c;发现只要延小区域 右上-左下 的对角线填满X即可&#xff0c;那么就是可以总结为满足(i j) % k (r c) % k #include <bits/stdc.h> using namespace std; int t; void solve(){int n, k, r, c;cin >> n >> k >> r >> c…

什么是搜索引擎?2023 年搜索引擎如何运作?

目录 什么是搜索引擎&#xff1f;搜索引擎的原理什么是搜索引擎爬取&#xff1f;什么是搜索引擎索引&#xff1f;什么是搜索引擎检索?什么是搜索引擎排序&#xff1f; 搜索引擎的目的是什么&#xff1f;搜索引擎如何赚钱&#xff1f;搜索引擎如何建立索引?网页抓取文本处理建…

【C++基础(五)】类和对象(上)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 类和对象-上 1. 前言2. 类的引入3. 类的定义4. 类的…

【人工智能】深度优先搜索、代价一致搜索、深度有限搜索、迭代深度优先搜索、图搜索

【人工智能】无信息搜索—BFS 、代价一致、DFS、深度受限、迭代深入深度优先、图搜索 什么是搜索 搜索问题是指既不能通过数学建模解决,又没有其他算法可以套用或者非遍历所有情况才能得出正确结果。这时就需要采用搜索算法来解决问题。搜索就是一种通过穷举所有解的状态,来…

iClient3D for CesiumWebGL入门之使用vscode以服务方式运行调试

作者&#xff1a;超图研究院技术支持中心-于丁 iClient3D for Cesium&WebGL入门之使用vscode以服务方式运行调试 相信大家第一次使用SuperMap iClient3D for Cesium或SuperMap iClient3D for WebGL的时候&#xff0c;都遇到过和我一样的事情&#xff1a; 在文件夹中直接打…

Docker网络模式

Docker网络模式 一、Docker网络实现原理二、Docker的网络模式1、host模式1.1 host模式原理1.2 host模式实操 2、Container模式2.1 模式原理 3、none模式4、bridger模式4.1 bridge模式的原理4.2 bridge实操 5、overlay模式6、自定义网络模式6.1 为什么需要自定义网络模式&#x…

03. 自定义镜像 Dockerfile

目录 1、前言 2、构建镜像的方式 2.1、docker commit 2.1.1、先查看下当前的容器 2.1.2、生成该容器镜像 2.1.3、查看镜像列表 2.2、Dockerfile 2.2.1、创建Dockerfile文件 2.2.2、编写Dockerfile文件 2.2.3、构建镜像 2.2.4、使用该镜像生成容器 3、Dockerfile 3…

FTP与HTTP: 哪种协议更适合大文件传输?

随着互联网技术的发展&#xff0c;网络传输已成为了现代社会中不可或缺的一部分。无论是文本、图像、音频、视频等各种类型的数据&#xff0c;相应的传输协议也在不断地发展和更新。FTP&#xff08;File Transfer Protocol&#xff09;和HTTP&#xff08;Hyper Text Transfer P…

【密码学】二、古典密码

古典密码 1.置换密码1.1列置换密码1.2周期置换密码 2.代换密码2.1单表代换密码2.1.1凯撒密码2.1.2仿射密码 2.2多表代换密码2.2.1维吉尼亚密码2.2.2普莱费尔密码 3.轮转密码3.1恩尼格玛密码机Enigma3.1.1Enigma加密3.1.1Enigma解密 4.古典密码的分类5.古典密码的统计分析5.1单表…

【云原生】Prometheus之图形化界面grafana与服务发现部署

前言 上一篇文章中我们介绍了Prometheus的组件&#xff0c;监控作用&#xff0c;部署方式&#xff0c;以及如何通过在客户机安装exporter再添加监控项的操作。但是不免会发现原生的Prometheus的图像化界面对于监控数据并不能其他很好的展示效果。所以本次我们将介绍一款开源非常…

06-Vue基础之事件处理

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Hive自定义函数

本文章主要分享单行函数UDF&#xff08;一进一出&#xff09; 现在前面大体总结&#xff0c;后边文章详细介绍 自定义函数分为临时函数与永久函数 需要创建Java项目&#xff0c;导入hive依赖 创建类继承 GenericUDF&#xff08;自定义函数的抽象类&#xff09;&#xff08;实现…

HP惠普暗影精灵9笔记本原装出厂Win11系统预装专用OEM系统镜像

暗影9笔记本电脑原厂Windows11系统包 OMEN by HP 16.1英寸游戏本16-wf0000,16-wf0001,16-wf0003,16-wf0004,16-wf0006,16-wf0008,16-wf0009,16-wf0010,16-wf0011,16-wf0012,16-wf0028,16-wf0029,16-wf0007,16-wf0032,16-wf0036,16-wf0043 链接&#xff1a;https://pan.baidu.…

[SQL系列] 从头开始学PostgreSQL 自增 权限和时间

[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131841058上一篇介绍了事务&#xff0c;锁&#xff0c;子查询 事务有点像是原子操作&#xff0c;需要有完整性&#xff0c;要么全都完成了&#xff…

win11我们无法创建新的分区也找不到现有的分区

U盘重装系统的时候 提示&#xff1a;win11我们无法创建新的分区也找不到现有的分区 ShiftF10 &#xff0c;调出 命令提示符&#xff1b; diskpart list disk select disk 盘编号 clean convert gpt 参考&#xff1a;怎么解决我们无法创建新的分区也找不到现有的分区问题&#x…

STM32F407-- DMA使用

目录 1. DMA结构体 STM32F103&#xff1a; STM32F407&#xff1a; 2. F4系列实现存储器到存储器数据传输 1&#xff09;结构体配置&初始化 2&#xff09;主函数 补充知识点&#xff1a;关于变量存储的位置&#xff0c;关于内部存储器一般存储什么内容 3. F4系列实现…