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分支…

csdn 机器人回答 Spring 设计模式

Spring框架中使用了多种设计模式,包括但不限于: 依赖注入(DI)模式:通过DI模式,Spring框架可以将对象之间的依赖关系从代码中解耦出来,使得代码更加灵活、可维护。 控制反转(IoC&…

FFmpeg5.0源码阅读—— avcodec_send_frame avcodec_receive_packet

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

如何理解自动化

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

如何使用Java开发iOS应用?

使用Java开发iOS应用并不直接支持,因为iOS平台采用的是Objective-C和Swift作为主要的开发语言。然而,有一些跨平台工具和框架可以让你使用Java来开发跨平台的移动应用,包括iOS。 以下是一些可以考虑的选项: React Native&#xf…

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. 类的…

【数据归一化与标准化】

数据归一化与标准化 数据预处理是机器学习和数据分析中非常重要的一环&#xff0c;它能够有效地提高模型的性能和准确度。在数据预处理的过程中&#xff0c;数据归一化和标准化是两个常用的技术&#xff0c;它们可以将数据转换成一定的标准形式&#xff0c;有助于模型更好地学…

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

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

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

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

django递归菜单

实例代码 from django.shortcuts import render from .models import Menudef menu_list(request):menus Menu.objects.filter(parentNone)def get_children(menu):return Menu.objects.filter(parentmenu)def get_menu_tree(menu):children get_children(menu)if children:r…

【图论】最小生成树

1、Kruskal算法 步骤与基本思路 &#xff08;1&#xff09;初始化所有点&#xff0c;每个点单独在一个点集。把所有边按权重排序 &#xff08;2&#xff09;按边权重从小到大遍历每一条边&#xff0c;如果这条边的两个顶点不在同一个点集&#xff0c;就将它们加到同一点集&a…

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…

[每日一氵] C++ 类 “xxx“ 不存在默认构造函数

80年不写C, 今天遇到 类 "xxx" 不存在默认构造函数 我都忘了怎么解决… customer.h 文件&#xff1a; #ifndef CUSTOM_H #define CUSTOM_H#include<string>class Customer{public:Customer(std::string name, int age);// virtual ~Customer();void printInf…

Debezium日常分享系列之:Debezium Operator

Debezium日常分享系列之&#xff1a;Debezium Operator 一、安装步骤二、快速入门示例三、DebeziumServerSpec 参考 Debezium Operator 提供了一种在 Kubernetes 或 Openshift 上运行 Debezium Server 的简单方法。 一、安装步骤 debezium operator 当前支持按名称空间安装。…

ctemplate,安装以及出现报错处理方式

简介 Google CTemplate是一个开源的C模板引擎&#xff0c;可以生成html文件&#xff0c;今天安装出现一些问题&#xff0c;在此将遇到的问题以及解决方式记录下来# 简介 安装 git clone https://github.com/OlafvdSpek/ctemplate.gitcd ctemplate./autogen.sh./configure ma…

mysql主主架构搭建,删库恢复

mysql主主架构搭建&#xff0c;删库恢复 搭建mysql主主架构环境信息安装msql服务mysql1mysql2设置mysql2同步mysql1设置mysql1同步mysql2授权测试用账户 安装配置keepalivedmysql1检查脚本mysql2检查脚本 备份策略mysqldump全量备份mysqldump增量备份数据库目录全量备份 删除my…

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…