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 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模型的问答效果还是不错的!

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

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

相关文章

8. Vmvare中重新分配Linux系统的分区空间大小

1. 说明 一般情况下,在使用Vmvare虚拟机创建配置Linux系统时,默认将系统的内存设置为4GB,硬盘大小设置为40GB,但随着空间利用的越来越多,内存会出现不够使用的情况,此时需要重新分配空间大小,具…

一起学数据结构(1)——复杂度

目录 1. 时间复杂度: 1.1 时间复杂度的概念: 1.2 时间复杂度的表示及计算: 1.3 较为复杂的时间复杂度的计算: 2. 空间复杂度: 2.1 空间复杂度的概念: 2.2 空间复杂度的计算: 1. 时间复杂度…

【C++进阶之路】适配器、反向迭代器、仿函数

文章目录 前言一、适配器①模拟实现栈②模拟实现对列 二、反向迭代器三、仿函数总结 前言 我们先来笼统的介绍一下今天的三个内容。 适配器——简单的理解就是复用,用已经实现的轮子,来继续实现某种功能。 反向迭代器——原理很简单,就是对…

Maven发布中央仓库始终报403

把域名 oss.sonatype.org 全部替换为:s01.oss.sonatype.org

Chatgpt Web API 创建对话,免费,不计token数量,模仿网页提交对话

Chatgpt API 是收费的,按token使用量计费 Chatgpt Web API 免费的,只要有账号就可以使用。 curl https://chat.openai.com/backend-api/conversation \-H authority: chat.openai.com \-H accept: text/event-stream \-H accept-language: zh-CN,zh;q…

52.弱集合 WeakSet

WeakSet与Set相似,Set的方法在WeakSet中基本都能使用 WeakSet只能放对象 WeakSet不能被遍历 目录 1 创建WeakSet 2 弱集合的指向问题 1 创建WeakSet 直接在创建的时候把对象放进去是不行的 你需要用add()方法才可以放进去 2 弱集合的指向问题 当你把obj加…

前后端分离windows本地nginx解决跨域

下载 http://nginx.org/en/download.html 命令 启动Nginx: nginx.exe start 快速停止或关闭Nginx: nginx.exe -s stop 正常停止或关闭Nginx: nginx.exe -s quit 配置文件修改重装载命令: nginx.exe -s reload 强制停用…

Java基本数据类型

Java基本数据类型 字面常量数据类型变量整形变量长整形变量短整型变量字节型变量思考浮点型变量双精度浮点型单精度浮点型 字符型布尔型变量 类型转换类型提升 字面常量 字符串常量:由""括起来的,比如“12345”、“hello”、“你好”。整形常量…

机器学习---经验误差与过拟合、方差与偏差、性能度量、比较检验

1. 经验误差与过拟合 第三张图建立的模型,在训练集中通过x可以很好的预测y,然而我们不能预期该模型能够很好的预 测集外的数据,换句话说,这个模型没有很好的泛化能力。 第一张图建立了一个线性模型,但是该模型并没有…

Nginx 301 https跳转后出现跨域和混合内容问题 —— 筑梦之路

问题 在浏览器地址栏敲入url访问静态资源目录时,发现默认跳转到了http协议的地址 如上图所示,客户端https请求先到达API网关,然后网关将请求通过http协议转发到静态资源服务器。 调出浏览器发现客户端发送的https请求收到了一个301状态码的响…

nodejs+vue+elementui学习交流和学习笔记分享系统

Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 前端技术:nodejsvueelementui,视图层其实质就是vue页面,通过编写vue页面从而展示在浏览器中,编写完成的vue页面要能够和控制器类进行交互,从而使得用户在点击网页进…

Kotlin 协程 CoroutineScope

协程定义: 19年官方是这样说的:协程是轻量级的线程,协程就是 Kotlin 提供的一套线程封装的 API; 现在官方是这样说的:协程是一种并发设计模式; 协程作用: 1.处理耗时任务; 2.保…

Kotlin 新版本 1.9.0重要更新预览

释放 Kotlin 新版本 1.9.0 的强大功能 1. Kotlin K2编译器用于多平台 对K2编译器进行了进一步的改进,使其更加稳定。K2编译器针对JVM目标现已进入Beta版本,并且也可以在多平台项目中使用。 您可以通过将K2配置添加到项目的gradle.properties中&#x…

九、数据结构——顺序队列中的循环队列

目录 一、循环队列的定义 二、循环队列的实现 三、循环队列的基本操作 ①初始化 ②判空 ③判满 ④入队 ⑤出队 ⑥获取长度 ⑦打印 四、循环队列的应用 五、全部代码 数据结构中的循环队列 在数据结构中,队列(Queue)是一种常见的线性数据结…

pytest+allure运行出现乱码的解决方法

pytestallure运行出现乱码的解决方法 报错截图: 这里的截图摘自 悟翠人生 小伙伴的https://blog.csdn.net/weixin_45435918/article/details/107601721一文。 这是因为没有安装allure运行环境或者没有配置allure的环境变量导致,解决方案: 1…

Vue移动端项目--瑞幸咖啡重构优化

来了客官,好久不见! 从年初开始,就有个想法,想着把之前做过的项目重新整理一下。毕竟今时不同往日,从现在的角度去看曾经做过的项目,倒是觉得有很多稚嫩的地方。毕竟无论做什么都是熟能生巧,由浅…

深度学习推理和训练

优化和泛化 深度学习的根本问题是优化和泛化之间的对立。 • 优化(optimization)是指调节模型以在 训练数据 上得到最佳性能(即机器学习中的学习)。 • 泛化(generalization)是指训练好的模型在 前所未…

2023JAVA 架构师面试 130 题含答案:JVM+spring+ 分布式 + 并发编程》...

此文包含 Java 面试的各个方面,史上最全,苦心整理最全 Java 面试题目整理包括基JVM算法数据库优化算法数据结构分布式并发编程缓存等,使用层面广,知识量大,涉及你的知识盲点。要想在面试者中出类拔萃就要比人付出更多的…

nginx怎么做负载均衡

Nginx怎么做负载均衡 Nginx 是一个高性能的开源反向代理服务器,可以用于实现负载均衡。负载均衡指的是将用户请求平均分配给多个服务器,以提高整体系统性能和可靠性。下面是一个详细介绍如何使用 Nginx 实现负载均衡的步骤: 步骤 1&#xf…