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

news2024/11/28 8:42:04

  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 np


def get_text_embedding(text):
	# Baichuan-13B-Chat Embedding
    url = "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_content
    embedding = 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]])

    # 建立prompt
    qa_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.coloradmin.cn/o/777843.html

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

相关文章

【C语言day02】

转义字符 \\ 表示字符\,\123表示字符{,\t表示制表符,这些都是一个字符宏只是替换 替换后NUM的样子是(211)*21/2常量指针与指针常量 const和* 来区别,如果是const * 这样的顺序就是常量指针,所以说他的本质是指针&am…

uni-app:请求后端数据uni.request

完整代码: onLoad() {uni.request({url: getApp().globalData.position Produce/select_employee,data: {username: getApp().globalData.username,},method: POST,dataType: json,success: res > {this.employee_name res.data.info.employee_name;// consol…

uniapp 之 微信小程序、支付宝小程序 对于自定义导航栏的不同

目录 前言 微信小程序 代码 支付宝小程序 首页配置文件 二级菜单页面 配置 总结 不同 相同 前言 小程序都是 uni-app 写的 不是原生 微信小程序 代码 pages.json文件中配置 重点: "navigationStyle": "custom", // 导航栏样式…

安卓开发日记问题记录(隐藏标题栏中的应用名称)

当我们设置了显示标题栏,应用名也会显示出来,这对设置标题栏内容很不方便 可以在activity里的onCreate部分设置这句代码隐藏APP名字 getSupportActionBar().setDisplayShowTitleEnabled(false);或者改变它 getSupportActionBar().setTitle("new …

疲劳驾驶检测和识别1: 疲劳驾驶检测和识别数据集(含下载链接)

疲劳驾驶检测和识别1: 疲劳驾驶检测和识别数据集(含下载链接) 目录 疲劳驾驶检测和识别1: 疲劳驾驶检测和识别数据集(含下载链接) 1. 前言 2. 疲劳驾驶类别说明 3. 疲劳驾驶检测数据集: (1)Drowsy-Driving-Det1 …

hadoop安全保护机制(kerberos + ldap)

信息安全理论: CIA模型:机密性、完整性和可用性 CIA模型能够帮助建议一些信息安全原则,但该模型并不是一个需要严格遵守的规则 hadoop平台可能设计多个CIA模型组件,也kennel一个也不涉及 机密性: 信息只应该被期望的…

高压放大器的增益和偏压是什么意思

高压放大器是一种广泛应用的电子元器件,主要用于放大高压信号和驱动负载等方面。在实际应用中,了解高压放大器的增益和偏压是非常重要的,下面安泰电子将详细介绍它们的意义和作用。 高压放大器的增益 增益是指放大器输入信号与输出信号之间的…

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

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

二极管钳位电路的原理与实际应用

写在前面 本文参考了什么是二极管钳位的作用及原理? - 知乎 针对一些文章讲述错误的地方进行了更正,在讲述不清楚的地方进行了详细的解释,还请各位两篇文章结合而看,效果更佳。 钳位电路说明 1.我们都知道二极管具有单向导电性&a…

【Ajax】笔记-Ajax重复发送请求

问题的产生 用户频繁地点击一个发送请求的按钮,服务器就会频繁地处理请求,而且处理的内容是一样的,这样会导致服务器的压力很大。 这种情况下服务器就没有必要处理每一个请求。 解决方案 发送请求的时候先查看有没有正在请求的相同请求&am…

docker - prometheus+grafana监控与集成到spring boot 服务

一、Prometheus 介绍 1.数据收集器,它以配置的时间间隔定期通过HTTP提取指标数据。 2.一个时间序列数据库,用于存储所有指标数据。 3.一个简单的用户界面,您可以在其中可视化,查询和监视所有指标。二、Grafana 介绍 Grafana 是一…

Android图形系统之ANativeWindow与Surface关系(十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Unity 之 错误的停止协程的方式

相信很多人都会这样开启一个协程 StartCoroutine(Cor_1()); 这样确实没啥毛病,那么怎么关掉这个协程呢,是不是在想也是一样的传cor_1()这个参数,然后start对应stop,试着输入stopCor....诶,代码提示有这个方法喔,然后…

【计算机网络】socket编程基础

文章目录 1. 源IP地址和目的IP地址2. 理解MAC地址和目的MAC地址3. 理解源端口号和目的端口号4. PORT与PID5. 认识TCP协议和UDP协议6. 网络字节序7. socket编程接口7.1 socket常见API7.2 sockaddr结构 1. 源IP地址和目的IP地址 因特网上的每台计算机都有一个唯一的IP地址&#…

windows命令之获取电脑已经连接过的wifi的密码

有时候想连接wifi不知道密码,恰巧电脑此时正连接着能用的wifi,想获取密码吗,使用下面这个指令:这个指令能获取历史连接的wifi的信息,密码也是之前连接的时候保存的密码,并不能获取某个wifi的正确密码 netsh…

Redis进阶(2)——Redis数据的持久化 CAP分布式理论(高可用性) Redis主从搭建 Redis的哨兵机制

目录 引出Redis数据的持久化RDB方式(redis database数据备份文件)RDB工作机制RDB优势和劣势RDB常用参数 AOF的方式(命令追加)AOF优缺点 Redis集群CAP理论 主从搭建(Master/Slave)主master的redis自定义docker静态网段创建文件上传redis.conf到conf文件夹…

物联网的介绍

目录 1.什么是物联网 2.物联网给人类带来的福利 3.学习物联网需要什么知识 4.物联网未来的发展趋势 5.物联网专业的就业前景 1.什么是物联网 物联网(Internet of Things,简称IoT)是指连接、交互和共享数据的各种物理设备、传感器、软件和…

你的语言是第几名?

2023年已经过半,最新一期的编程语言排行榜你看了吗?刚刚,全球知名编程语言社区TIOBE公布了7月榜单,一起来看吧! TIOBE 7 月 TOP 15 编程语言: 详细榜单可参考官网: https://www.tiobe.com/tio…

进阶C语言——数据的存储

Hello,时间过的好快,从我一开始在csdn写的第一篇文章,距离现在已经过去一个多月了,我也在csdn收获了一些粉丝,你们的点赞就是我的动力,希望大家也越来越强,好了,进入我们的正题 &…

STL中的string类的模拟实现【C++】

文章目录 默认成员函数构造函数拷贝构造函数 赋值运算符重载函数析构函数beginendsizecapacityreserveeraseresizepush_backappendoperatorinsertswapsubstrc_stroperator[ ]findcleargetline>>运算符的重载<<运算符的重载 默认成员函数 构造函数 构造函数设置为…