AI大模型-如何利用开源模型节约成本?

1.电商QA系统开源模型

我们都见到过这样的场景,电商在线客服,你问什么时候发货,使用哪些快递发货等等,它就会很标准的回答出来,大部分都不是人工回答而是机器后台回答,我们今天就来用开源AI模型实现下此场景。

1.1 准备工作

1.首先需要安装sentence-transformers,我们需要它下面的paraphrase-multilingual-mpnet-base-v2多语言模型,它比较好的支持中文。pip install sentence-transformers

2.需要安装openAI包,好多开源模型依赖此包或用到此包 pip install openai

3.需要安装faiss,主要将文本信息转换索引加快搜索的。pip install faiss-gpu

4.安装llama_index,这个功能很多了,加载文件夹下的文档,解析文档,转换向量索引等

5.安装langchain:这里主要是将模型转换为向量

此文件夹下的文件目录:/data/faq/        文件为:ecommerce_faq.txt

文件内容如下:

Q: 如何注册新帐户?
A: 点击网站右上角的“注册”按钮,然后按照提示填写相关信息并设置密码。完成后,您将收到一封验证电子邮件。点击邮件中的链接以激活您的帐户。

Q: 忘记密码怎么办?
A: 点击登录页面的“忘记密码”链接,输入您的电子邮件地址。我们将向您发送一封包含重置密码链接的邮件。请点击链接并按照提示操作。

Q: 如何更改帐户信息?
A: 登录您的帐户,然后点击“我的帐户”以更改个人信息、收货地址等。

Q: 如何下订单?
A: 浏览商品并将想要购买的商品加入购物车。当您准备结算时,点击购物车图标,然后选择送货地址、付款方式和物流方式。确认订单详情后,点击“提交订单”。

Q: 支持哪些支付方式?
A: 我们支持支付宝、微信支付、银联在线支付、信用卡支付等多种支付方式。

Q: 如何查看订单状态?
A: 登录您的帐户,点击“我的订单”,在此页面上,您可以查看所有订单及其当前状态。

Q: 如何取消订单?
A: 在订单发货前,您可以登录帐户,进入“我的订单”页面取消订单。如果订单已发货,您需要联系客服协助处理。

Q: 如何申请退款?
A: 登录帐户,进入“我的订单”页面,选择要退款的订单并点击“申请退款”。请按照页面提示填写退款理由和退款金额。提交申请后,我们将在1-3个工作日内处理您的请求。

Q: 退货政策是什么?
A: 自收到商品之日起7天内,如产品未使用、包装完好,您可以申请退货。某些特殊商品可能不支持退货,请在购买前查看商品详情页面的退货政策。

Q: 退款会退回到哪里?
A: 退款将原路退回至您的支付帐户。

Q: 支持哪些省份配送?
A: 我们支持全国大部分省份的配送,包括北京、上海、天津、重庆、河北、山西、辽宁、吉林、黑龙江、江苏、浙江、安徽、福建、江西、山东、河南、湖北、湖南、广东、海南、四川、贵州、云南、陕西、甘肃、青海、台湾、内蒙古、广西、西藏、宁夏和新疆

Q: 物流时效是多久?
A: 一般情况下,大部分城市的订单在2-3个工作日内送达,偏远地区可能需要5-7个工作日。具体送货时间可能因订单商品、配送地址和物流公司而异。

Q: 如何查询物流信息?
A: 在订单发货后,您可以在“我的订单”页面查看物流单号。点击相应订单的“查看物流”按钮,输入物流单号查询物流详情。

Q: 提供哪些快递公司的服务?
A: 我们与顺丰速运、圆通速递、申通快递、韵达快递、中通快递、百世快递等多家知名快递公司合作。

Q: 如何更改收货地址?
A: 在订单发货前,您可以登录帐户,进入“我的订单”页面,选择要修改的订单并点击“修改地址”。如果订单已发货,您需要联系客服协助处理。

Q: 如何查询发票信息?
A: 登录您的帐户,进入“我的发票”页面。在此页面上,您可以查看已开具的发票及其详细信息。

Q: 如何申请开具发票?
A: 在提交订单时,您可以选择需要发票,并填写相关发票信息。您还可以在订单完成后登录帐户,进入“我的发票”页面,点击“申请发票”按钮并填写发票信息。

Q: 提供哪些类型的发票?
A: 我们提供普通发票和增值税专用发票。具体发票类型请参考订单页面或联系客服咨询。

Q: 为什么我的订单被取消?
A: 订单可能因库存不足、支付异常、用户要求等原因被取消。如有疑问,请联系客服咨询。

Q: 如何参加促销活动?
A: 关注我们的官方网站和社交媒体账号,我们会定期发布优惠券、折扣码和特价商品信息。您还可以在购物车页面直接查看适用于您订单的优惠活动。

Q: 如何使用优惠券?
A: 在购物车页面,输入优惠券代码后,点击“应用”。优惠券折扣将自动应用于您的订单。

Q: 优惠券有使用限制吗?
A: 优惠券可能有最低消费要求、有效期限制或特定商品范围。使用前请查看优惠券详情。

1.2 实现代码

此代码在!pip install sentence-transformers则是在colab在线执行器运行,你也可以在别的Python执行器里执行,就可以将!pip...更改。

# sentence-transformers Python库,是一个用于将文本句子转换为向量表示
!pip install sentence-transformers
!pip install openai
!pip install faiss-gpu
!pip install llama_index==0.5.27
!pip install langchain
import openai, os
import faiss
from llama_index import SimpleDirectoryReader,LangchainEmbedding,GPTFaissIndex,ServiceContext
# langchain功能的向量化
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
# langchain功能的文本切分
from langchain.text_splitter import CharacterTextSplitter
from llama_index.node_parser import SimpleNodeParser

os.environ["OPENAI_API_KEY"] = "your openAI key"
openai.api_key = os.environ.get("OPENAI_API_KEY")

# 中文文本分割,将大块分成小块,每一块100字符
# chunk_overlap自动合并小的文本片段的时候,可以接受多大程度的重叠,默认200,
# 在这里比chunk_size所以设置的小点防止出错。
text_splitter=CharacterTextSplitter(separator="\n\n",chunk_size=100,chunk_overlap=20)
parser=SimpleNodeParser(text_splitter=text_splitter)
# 加载faq文件内容
documents=SimpleDirectoryReader("./data/faq/").load_data()
# 从一个文档集合获取节点
nodes=parser.get_nodes_from_documents(documents)

# paraphrase-multilingual-mpnet-base-v2是一个支持多语言(multilingual)并且能把语句和段落(paraphrase)变成向量的一个模型
embed_model = LangchainEmbedding(HuggingFaceEmbeddings(
    model_name="sentence-transformers/paraphrase-multilingual-mpnet-base-v2")
)

# 默认值创建服务上下文对象,并将一个LLM对象传递给它,可以用于管理维护服务的上下文信息。
service_context=ServiceContext.from_defaults(embed_model=embed_model)

# 这个模型的维度是768维
dimension=768
faiss_index=faiss.IndexFlatIP(dimension)
# 用于在基于GPT的文本生成模型和Faiss索引之间建立桥梁。Faiss是一个高效的相似性搜索库,而GPTFaissIndex允许将GPT模型的生成结果与Faiss索引进行交互。
index=GPTFaissIndex(nodes=nodes,faiss_index=faiss_index,service_context=service_context)

1.首先用了langchain的分割功能CharacterTextSplitter,将faq的文本进行分割,一块100字符,分割符为\n\n,你可以看下文件的内容,每一次对话后就是两个\n\n,所以正好分割每一个对话。

2.用llama_index的SimpleNodeParser将分割的文本进行解析

3.用llama_index的SimpleDirectoryReader类加载对话文件内容。用2的解析文件获取文档里的节点内容转换为节点。

4.嵌入模型的定义使用了sentence-transformers/paraphrase-multilingual-mpnet-base-v2,最后赋值为embed_model。因为 HuggingFace 为基于 transformers 的模型定义了一个标准,所以大部分模型你只需要传入一个模型名称,HuggingFacebEmbedding 这个类就会下载模型、加载模型,并通过模型来计算你输入的文本的 Embedding。

sentence-transformers 是目前效果最好的语义搜索类的模型,它在 BERT 的基础上采用了对比学习的方式,来区分文本语义的相似度,它包括了一系列的预训练模型。我们在这里,选用的是 sentence-transformers 下面的 paraphrase-multilingual-mpnet-base-v2  模型。顾名思义,这个是一个支持多语言(multilingual)并且能把语句和段落(paraphrase)变成向量的一个模型。因为我们给的示例都是中文,所以选取了这个模型。

5.将模型传递给服务对象service_context

6.使用 Faiss 这个库来作为我们的向量索引库,所以需要指定一下向量的维度,paraphrase-multilingual-mpnet-base-v2  这个模型的维度是 768,所以我们就把维度定义成 768 维。

7.用llama_index的GPTFaissIndex创建索引,这样我们就完成了,可以进行搜索了。

用上文的index进行查询query,查询的mode是嵌入式向量。这时就去我们的文本里搜索匹配的文本并输出,

from llama_index import QueryMode

# QueryMode.EMBEDDING:在此模式下,查询被视为嵌入式向量,系统将根据嵌入式向量的语义相似性来查找最匹配的响应。
# 这种模式适用于需要基于语义相似性进行匹配的任务,例如文档检索、聊天器人等。
response=index.query("请问海南能发货吗?",
                     mode=QueryMode.EMBEDDING,
                     # 日志
                     verbose=True,
                     )
print(response)

结果输出: 

是的,我们支持全国大部分省份的配送,其中包括海南省。

我们可以再问两个:

response=index.query("你们用哪些快递公司送货?",
                     mode=QueryMode.EMBEDDING,
                     verbose=True,
                     )
print(response)

 结果输出:

我们与顺丰速运、圆通速递、申通快递、韵达快递、中通快递、百世快递等多家知名快递公司合作,用他们的服务送货。

response = index.query(
    "你们的退货政策是怎么样的?", 
    mode=QueryMode.EMBEDDING,
    verbose=True, 
)
print(response)

 回答:

我们的退货政策是自收到商品之日起7天内,如产品未使用、包装完好,您可以申请退货。某些特殊商品可能不支持退货,请在购买前查看商品详情页面的退货政策。

你可以对照文本看下,它的答案基本都是咱们定义的文本文件内容,那么几行代码轻松实现qa系统。 

2.ChatGLM开源模型提供对话效果

2.1 准备工作

上面的代码,我们已经把生成 Embedding 以及利用 Embedding 的相似度进行搜索搞定了。但是,我们在实际问答的过程中,使用的还是 OpenAI 的 Completion API。那么这一部分我们有没有办法也替换掉呢?

我们寻求开源模型的帮助。我们试一下来自清华大学的 ChatGLM 语言模型,看看中文的开源语言模型,是不是也有基本的知识理解和推理能力。

我们还是需要安装依赖包,并且需要使用GPU,你也可以使用CPU,但是会非常的慢。

pip install icetk
pip install cpm_kernels

 2.2 实现代码

代码还是比较简单的,几行代码

!pip install icetk
!pip install cpm_kernels
!pip install transformers

# 用transformers加载模型
from transformers import AutoTokenizer,AutoModel

# 加载和初始化一个预训练的相对应的聊天生成模型,以便后续可以使用该模型生成对话回复
# 选用60亿个参数模型,并且使用int-4量化的方式
tokenizer=AutoTokenizer.from_pretrained("THUDM/chatglm-6b-int4",trust_remote_code=True)
# cuda使用GPU进行模型计算,trust_remote_code=True是否信任代码(该模型用户贡献非官方)
model=AutoModel.from_pretrained("THUDM/chatglm-6b-int4",trust_remote_code=True).half().cuda()
model=model.eval()

然后,我们还是先通过 transformers 来加载模型。ChatGLM 最大的一个模型有 1300 亿个参数。

模型太大我们的电脑还是colab都无法处理,所以我们用了60亿的模型,我们的模型名字就叫做 chatglm-6b-int4,也就是 6B 的参数量,通过 int-4 量化。并且我们希望用GPU计算,所以.cuda()。

这里加载模型的时候,我们还设置了一个 trust_remote_code = true 的参数,这是因为 ChatGLM 的模型不是一个 Huggingface 官方发布的模型,而是由用户贡献的,所以需要你显式确认你信任这个模型的代码,它不会造成恶意的破坏。我们反正是在 Colab 里面运行这个代码,所以倒是不用太担心。

拿到模型后我们就开始询问它。

import locale
locale.getpreferredencoding = lambda: 'UTF-8'
!pip install protobuf==4.21

question = """
自收到商品之日起7天内,如产品未使用、包装完好,您可以申请退货。某些特殊商品可能不支持退货,请在购买前查看商品详情页面的退货政策。

根据以上信息,请回答下面的问题:

Q: 你们的退货政策是怎么样的?
"""
response, history=model.chat(tokenizer,question,history=[])
print(response)

用model.chat搜索问题,让它根据我们所说的信息回答下:

结果如下:

A: 根据所提供的信息,退货政策如下:

自收到商品之日起 7 天内,如产品未使用、包装完好,您可以申请退货。某些特殊商品可能不支持退货,请在购买前查看商品详情页面的退货政策。

如果不给它上下文信息,它的回答是什么:

question = """
Q: 你们的退货政策是怎么样的?
A: 
"""
response, history = model.chat(tokenizer, question, history=[])
print(response)

结果回答: 

我们的退货政策是为了保障客户的利益而设计的。如果客户认为我们的产品不适合他们的需求或使用方式,他们可以申请退货。

以下是退货政策的一些重要方面:

1. 退货时间:自购买日期起 30 天内,客户有权退货。

2. 退货条件:客户需要证明他们需要退货的理由,例如产品不合适、损坏、不符合规格等。

3. 退货方式:客户可以通过在线退货服务或邮寄的方式退货。在退货之前,客户需要填写退货申请单,并提供相关的证明。

4. 退款金额:客户在退货时需要支付剩余的退款金额。如果产品已经损坏或不符合规格,客户需要承担维修或更换的成本。

请注意,如果客户在退货期间内退货,我们将有权重新销售并退款。如果客户在退货政策截止日期前退货,我们将有权处理退款,但我们将尽可能减少退款金额。

以上是我们退货政策的一些重要方面,如果有任何疑问,请随时联系我们的客户服务团队。

 可以看到跟OpenAI一样,它到它们自己模型进行搜索,给予我们这样一个答案。

咱们再来试试它有没有简单的推理能力,咱们只提供了海南,送到海南没提供三亚这个城市,看看AI能不能回答这个问题。

question = """
我们支持全国大部分省份的配送,包括北京、上海、天津、重庆、河北、山西、辽宁、吉林、黑龙江、江苏、浙江、安徽、福建、江西、山东、河南、湖北、湖南、广东、海南、四川、贵州、云南、陕西、甘肃、青海、台湾、内蒙古、广西、西藏、宁夏和新疆.

根据以上信息,请回答下面的问题:

Q: 你们能配送到三亚吗?
"""
response, history = model.chat(tokenizer, question, history=[])
print(response)

它的回答:

根据提供的信息,可以配送到三亚。

可以看到,ChatGLM 知道是可以配送到三亚的。不过万一是巧合呢?我们再看看在上下文里面,去掉了东三省,然后问问它能不能送到哈尔滨。

question = """
我们支持全国大部分省份的配送,包括北京、上海、天津、重庆、河北、山西、江苏、浙江、安徽、福建、江西、山东、河南、湖北、湖南、广东、海南、四川、贵州、云南、陕西、甘肃、青海、台湾、内蒙古、广西、西藏、宁夏和新疆.但是不能配送到东三省

根据以上信息,请回答下面的问题:

Q: 你们能配送到哈尔滨吗?
"""
response, history = model.chat(tokenizer, question, history=[])
print(response)

 它的回答,虽然说了一堆但最后也是正确的。

根据提供的信息,我们支持全国大部分省份的配送,包括北京、上海、天津、重庆、河北、山西、江苏、浙江、安徽、福建、江西、山东、河南、湖北、湖南、广东、海南、四川、贵州、云南、陕西、甘肃、青海、台湾、内蒙古、广西、西藏、宁夏和新疆.但是不能配送到东三省.

3.将 ChatGLM 封装成 LLM 

既然 ChatGLM 能够正确回答这个问题,那我们的 FAQ 问答就可以用 ChatGLM 来搞定了。将上面1和2的目录示例结合一起呢?

不过上面的代码我们用的还是原始的 ChatGLM 的模型代码,还不能直接通过 query 来访问 llama-index 直接得到答案。要做到这一点倒也不难,我们把它封装成一个 LLM 类,让我们的 index 使用这个指定的大语言模型就好了。

3.1 代码实现

我们还是用llama-index将文档转化为index,然后对话模型使用ChatGLM,通过继承LLM类来自定义个类,让它使用ChatGLM,最后llama-index查找时则通过ChatGLM对话形式查找,就不用用OpenAI了。

!pip install openai
!pip install faiss-gpu
!pip install llama_index==0.5.27
!pip install langchain
import openai, os
import faiss
from llama_index import SimpleDirectoryReader, LangchainEmbedding, GPTFaissIndex, ServiceContext
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from llama_index.node_parser import SimpleNodeParser

from langchain.llms.base import LLM
from llama_index import LLMPredictor
from typing import Optional,List,Mapping,Any

# 继承LLM类
class CustomLLM(LLM):
  def _call(self,prompt:str,stop:Optional[List[str]]=None)->str:
    reponse,history=model.chat(tokenizer,prompt,history=[])
    return response

  # 属性是自定义语言模型
  @property
  def _identifying_params(self) -> Mapping[str,Any]:
    # 用chatglm-6b-int4此模型问答
    return {"name_of_model":"chatglm-6b-int4"}
  
  # 用于指示这个自定义类是一个自定义的语言模型
  @property
  def _llm_type(self) -> str:
    return "custom"

然后之前的代码将llm_predictor使用的模型塞进service_context即可。

!pip install sentence-transformers
from langchain.text_splitter import SpacyTextSplitter
# 新增
llm_predictor = LLMPredictor(llm=CustomLLM())
# 中文文本分割,将大块分成小块,每一块100字符
# chunk_overlap自动合并小的文本片段的时候,可以接受多大程度的重叠
text_splitter=CharacterTextSplitter(separator="\n\n",chunk_size=100,chunk_overlap=20)
parser=SimpleNodeParser(text_splitter=text_splitter)
documents=SimpleDirectoryReader("./data/faq/").load_data()
# 从一个文档集合获取节点
nodes=parser.get_nodes_from_documents(documents)

# paraphrase-multilingual-mpnet-base-v2是一个支持多语言(multilingual)并且能把语句和段落(paraphrase)变成向量的一个模型
embed_model = LangchainEmbedding(HuggingFaceEmbeddings(
    model_name="sentence-transformers/paraphrase-multilingual-mpnet-base-v2")
)

# 默认值创建服务上下文对象,并将一个LLM对象传递给它
service_context=ServiceContext.from_defaults(embed_model=embed_model,llm_predictor=llm_predictor)

# 这个模型的维度是768维
dimension=768
faiss_index=faiss.IndexFlatIP(dimension)
index=GPTFaissIndex(nodes=nodes,faiss_index=faiss_index,service_context=service_context)

执行查询faq里问答,前提是有上下文model,否则调用CustomLLM类是报错

from llama_index import QuestionAnswerPrompt
from llama_index import QueryMode

QA_PROMPT_TMPL = (
    "{context_str}"
    "\n\n"
    "根据以上信息,请回答下面的问题:\n"
    "Q: {query_str}\n"
    )
QA_PROMPT = QuestionAnswerPrompt(QA_PROMPT_TMPL)

response = index.query(
    "请问你们海南能发货吗?", 
    mode=QueryMode.EMBEDDING,
    text_qa_template=QA_PROMPT,
    verbose=True, 
)
print(response)

回答的也是一致的哈,你可以通过调试发现,在搜索时会进入CustomLLM调用mpdel.chat函数。

现在,我们有了一个通过 paraphrase-multilingual-mpnet-base-v2 模型来计算 Embeddding 并进行语义搜索,然后通过 chatglm-6b-int4 的模型来进行问答的解决方案了。而且这两个模型,可以跑在一块家用级别的显卡上。是不是很厉害?

4.开源模型的不足

4.1 Token过小

当然开源模型也有它的不足,假如给你一整套朝花夕拾散文,让它根据上面进行文本处理向量索引看下能否查到数据。

#!pip install spacy;
#!python -m spacy download zh_core_web_sm
#!pip install sentence-transformers
#!pip install openai
#!pip install faiss-gpu
#!pip install llama_index==0.5.27
#!pip install llama_index
#!pip install langchain
import openai, os
import faiss
from llama_index import SimpleDirectoryReader,LangchainEmbedding,GPTFaissIndex,ServiceContext
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplitter,SpacyTextSplitter
from llama_index.node_parser import SimpleNodeParser


os.environ["OPENAI_API_KEY"] = ""
openai.api_key = os.environ.get("OPENAI_API_KEY")

# 中文文本分割,将大块分成小块,每一块100字符
# chunk_overlap自动合并小的文本片段的时候,可以接受多大程度的重叠
# 散文不好确定QA格式,所以使用了SpacyTextSplitter来分句
text_splitter=SpacyTextSplitter(pipeline="zh_core_web_sm",chunk_size=128,chunk_overlap=32)
parser=SimpleNodeParser(text_splitter=text_splitter)
# 一堆散文文件
documents=SimpleDirectoryReader("./zhzhaohuaxisshi/").load_data()
# 从一个文档集合获取节点
nodes=parser.get_nodes_from_documents(documents)

# paraphrase-multilingual-mpnet-base-v2是一个支持多语言(multilingual)并且能把语句和段落(paraphrase)变成向量的一个模型
embed_model = LangchainEmbedding(HuggingFaceEmbeddings(
    model_name="sentence-transformers/paraphrase-multilingual-mpnet-base-v2")
)

# 默认值创建服务上下文对象,并将一个LLM对象传递给它
service_context=ServiceContext.from_defaults(embed_model=embed_model)

# 这个模型的维度是768维
dimension=768
faiss_index=faiss.IndexFlatIP(dimension)
index=GPTFaissIndex(nodes=nodes,faiss_index=faiss_index,service_context=service_context)

整套朝花夕拾的的散文集,对应的模型和索引加载的代码基本一致,只有一个小小的区别,就是在文本分割的时候,我们用了上一讲介绍过的 SpacyTextSplitter,因为这里都是散文的内容,而不是确定好格式的 QA 对。所以通过 SpacyTextSplitter 来分句,并在允许的时候合并小的片段是有意义的。

查询下:

from llama_index import QueryMode
from llama_index import QuestionAnswerPrompt

openai.api_key = os.environ.get("OPENAI_API_KEY")

QA_PROMPT_TMPL = (
    "下面的内容来自鲁迅先生的散文集《朝花夕拾》,很多内容是以第一人称写的 \n"
    "---------------------\n"
    "{context_str}"
    "\n---------------------\n"
    "根据这些信息,请回答问题: {query_str}\n"
    "如果您不知道的话,请回答不知道\n"
)
QA_PROMPT = QuestionAnswerPrompt(QA_PROMPT_TMPL)

response = index.query(
    "鲁迅先生在日本学习医学的老师是谁?", 
    mode=QueryMode.EMBEDDING,
    similarity_top_k = 1,
    text_qa_template=QA_PROMPT,
    verbose=True, 
)
print(response)

它的回答:

不知道

我连问几个都是不知道,这是为什么呢?

单机的开源小模型能够承载的文本输入的长度问题。在我们使用 OpenAI 的 gpt-3.5-turbo 模型的时候,我们最长支持 4096 个 Token,也就是一个文本片段可以放上上千字在里面。但是我们这里单机用的 paraphrase-multilingual-mpnet-base-v2 模型,只能支持 128 个 Token 的输入,虽然对应的 Tokenizer 不一样,但是就算一个字一个 Token,也就 100 个字而已。这使得我们检索出来的内容的上下文太少了,很多时候没有足够的信息,让语言模型去回答。

4.2 复杂推理

 有一个更难解决的问题,就是模型的推理能力问题。看看之前学习的片段:

question = """Consideration proudct : 工厂现货PVC充气青蛙夜市地摊热卖充气玩具发光蛙儿童水上玩具

1. Compose human readale product title used on Amazon in english within 20 words.
2. Write 5 selling points for the products in Amazon.
3. Evaluate a price range for this product in U.S.

Output the result in json format with three properties called title, selling_points and price_range"""
response, history = model.chat(tokenizer, question, history=[])
print(response)

1.这个要求将这样的商品起一个英文标题

2.给这个商品写5个卖点

3.给出这个商品在美国的售价范围

并告知输出个json格式,有三个属性,叫 title, selling_points and price_range

这个需求之前的openAI给了我们非常完美的答案,我们看下它给的答案

1. title: 充气玩具青蛙夜市地摊卖

2. selling_points:

- 工厂现货:保证产品质量

- PVC充气:环保耐用

- 夜市地摊:方便销售

- 热卖:最受欢迎产品

- 儿童水上玩具:适合各种年龄段儿童

3. price_range: (in USD) - low: $1.99 - high: $5.99

可以看到,虽然这个结果不算太离谱,多少和问题还是有些关系的。但是无论是翻译成英文,还是使用 JSON 返回,模型都没有做到。给到的卖点也没有任何“推理出来”的性质,都是简单地对标题的重复描述。即使你部署一个更大版本的模型到云端,也好不到哪里去。

这也是 ChatGPT 让人震撼的原因,的确目前它的效果还是要远远超出任何一个竞争对手和开源项目的。

本节根据 徐文浩老师《AI大模型之美》学习记录整理,希望对你有帮助

你可能感兴趣的:(Ai与大数据,人工智能)