如何基于大模型开发应用接口

一、前言

针对自然语言处理方向,以前要开发一个情感分析、命名实体识别之列的应用是非常麻烦的,我们需要完成收集数据、清理数据、构建模型、训练模型、调优模型等一系列操作,每一步都非常耗时。如今大语言模型(LLM)的出现,极大简化了其中一些任务。LLM像一个全能的自然语言机器,通过一些简单调整,就可以实现一些特定任务。

这些特定任务不只限于自然语言的基本任务,我们还可以实现更复杂的应用。今天我们就来详细讨论一下。

二、大语言模型

2.1 大语言模型的能力

相信大家都知道了LLM是怎么工作的,也是就玩文字接龙游戏。经过预训练和RLFH后,LLM具备了非常强大的自然语言理解能力和指令遵循能力。

我们可以看几个实际例子,现在假设我们是2020年的人类,ChatGPT还未出现,站在这个视角下,我们才能明白LLM的强大。

  1. 多轮对话

首先是多轮对话能力,早期要实现多轮对话需要人类的许多干预,而ChatGPT则可以一步到位实现多轮对话:

You:你好啊
ChatGPT:你好!有什么我可以帮你的吗?
You:我上一句说了啥
ChatGPT:你说了"你好啊",我回复了"你好!有什么我可以帮你的吗?"

那为什么可以呢?因为LLM的训练方式是文字接龙,如果我们的训练数据中本身就有对话数据,那LLM能实现对话功能也不足为奇。而多轮对话则是每次把历史对话也作为输入,因为LLM已经用多轮对话的数据训练了,那他自然可以实现多轮对话。比如: 第一轮输入:

You:你好啊

第二轮输入:

You:你好啊
ChatGPT:你好!有什么我可以帮你的吗?
You:我上一句说了啥
  1. Zero-Shot

Zero-Shot的意思是零样本,就是在没有不需要额外数据的情况下,完成某个任务。以情感分析为例,我们可以用下面的方式和LLM对话:

You:“我很喜欢这部电影”包含的情感是:
ChatGPT:积极

在LLM预训练阶段,如果我们用下面模板生成数据交给LLM训练:

“{{ sentence }}”包含的情感是:{{ label }}

那么上面的结果也就不奇怪了。

  1. 代码能力

起初我认为代码生成工具无非就是查数据库,而实际体验后,却发现工具真的对代码有自己的理解。比如我们可以让工具写出Sleep排序算法的代码,而这个排序算法实际并不存在。我们只需要描述Sleep排序的逻辑即可。

而现在LLM的代码能力包括如下几个:

  • 根据注释生成代码
  • 输入代码,让其纠错
  • 输入代码,让其简写或优化
  • 输入代码,让其修改为其它语言版本

在2020年的我们面前,上面这些功能都不是近十年可以实现的,但是第二年就已经可以做到了。

  1. 图形理解

LLM有一个惊人的能力,就是字符图形理解能力。这里我们不讨论VisionLLM。比如我们可以和LLM下棋:

You:我们来玩一个游戏,在3x3的网格里面,谁先连成连续三个谁赢。我先手:
x | || || |ChatGPT:好的,我也选择一个空格:
x | ||o|| |

而原因的话,可能是某群无聊的人正好使用上面的方式玩游戏,而这些数据正好被OpenAI爬取了。

2.2 结构化和非结构化

LLM还有需要其它能力,这里不再列举,我们来讨论一下将LLM接入应用的前提。

对于程序员来说,结构化数据是非常有用的。我们编写各种api接口返回的数据都遵循一定格式,这种我们称为结构化数据。比如天气接口,下面是一种可能的形式:

{"city": "广州","temperature": "34"
}

当前端程序员拿到这个接口后,可以很容易将数据展现出来。

现在我们不再固定形式,而是用下面方式返回:

广州今天的温度是34

或:

今天广州34°

等等。这种数据我们称为非结构化数据,如果我们返回的输入是上面的形式,那么前端确定不了怎么展示。

在非结构化数据中,我们包含了结构化数据里的信息,但是组织方式不一样。或许可以通过硬编码,编写一堆if else把city和temperature提取出来,然后把非结构化数据转换成结构化数据,但是这样太麻烦了,而且实际情况要更为复杂。

如果现在有一个工具,可以将非结构化数据转换成结构化数据,那事情就简单了,而LLM就是这样一个工具。

我们可以用下面的方式和LLM对话:

You:帮我把:“广州今天的温度是34”转换成json数据,包含city和temperature两个键。只返回json内容。
ChatGPT:{"city": "广州","temperature": 34
}

我们换一句话还是可以得到正确结果:

You:帮我把:“今天广州34°”转换成json数据,包含city和temperature两个键。只返回json内容。
ChatGPT:{"city": "广州","temperature": 34
}

现在有了这个工具,我们就可以实现各种应用了。

三、LangChain

LangChain是一个用来创建LLM应用的模块,我们可以使用LangChain创建各种Chain,完成各式各样的任务。

3.1 Chain的主要部分

我们要组建一个Chain,需要知道几个主要模块。Chain的最简单组合就是单纯一个LLM,它可以接收文本输入,输出文本。

而在上面的内容中,我们发现了一些特点,即输入内容有一部分是固定的。比如在情感分析部分,我们的输入可以提炼成:

“{{ sentence }}”包含的情感是:

其中sentence是要替换的内容。在非结构化转结构化部分,我们的输入可以提炼成:

帮我把:“{{ sentence }}”转换成json数据,包含city和temperature两个键。只返回json内容。

这种提炼出来的部分,我们就叫做PromptTemplate,或者叫Prompt。这样就引出了Chain的第二个部分,Prompt。

在非结构化转结构化部分,我们得到的结构都是非常标准的json。但是实际情况并没有这么理想,可能会出现下面这些情况:

多余的字符:
​```{....具体内容
}```多余的解释:
好的,下面是转换后的结果
{....具体内容
}错误的字段

总之并不是每一次结果都如我们预想。这个这么解决呢?最简单的办法就是拿到输出后,我们用正则匹配,拿到最终结果。而对数据结果再次操作,提取内容的这部分叫做OutputParser。

这样Chain的三个主要部分都出来了:Prompt、LLM、OutputParser。

3.2 Prompt

下面就开始实战吧。我们先安装模块:

pip install langchian
pip install langchain_community
pip install langchain_openai

构建Prompt主要有PromptTemplate和ChatPromptTemplate两个类,前者针对基本的LLM,后者则针对ChatModel。这里我们使用ChatPromptTemplate。

在LLM中,通常有三种消息,分别是:system、assistant、human。其中其中system设定该模型在当前整个会话中的情况。比如我们希望当前模型是一个心理医生,我们就可以把system设定为:“你是一个心理医生…”。

在代码上,我们使用ChatPromptTemplate.from_messages方法完成,代码如下:

from langchain_core.prompts import ChatPromptTemplate  prompt = ChatPromptTemplate.from_messages([      ("system", "你是一个心理医生..."),      ("human", "心情不好...")  ])

如果我们向构造一个情感分析的应用,那么我们可以把prompt改成:

from langchain_core.prompts import ChatPromptTemplateprompt = ChatPromptTemplate.from_messages([("system", "你是一个情感分析程序,不管用户输入什么,你都返回积极或消极。"),("human", "{sentence}")
])
print(prompt.invoke({'sentence': '心情不好'}))

在代码里面,我们添加了{sentence}用来占位,然后我们调用prompt.invoke({‘sentence’, ‘心情不好’}),可以把prompt里面的sentence标记,替换成后面的内容,运行后输入如下:

messages=[SystemMessage(content='你是一个情感分析程序,不管用户输入什么,你都返回积极或消极。'), HumanMessage(content='心情不好')]

human的消息被替换成了字典中的内容。

3.3 LLM

接下来是LLM,在前面提到两类Prompt,模型也有两类。我们用ChatPromptTemplate构建prompt,所以我们使用ChatModel。

国内比较方便访问GPT的方式之一是Azure,在LangChain里面提供了对应的实现,我们可以通过下面的方式创建一个ChatModel:

from langchain_openai import AzureChatOpenAIdeployment_name = "gpt-35-turbo-16k"
llm = AzureChatOpenAI(azure_endpoint=endpoint,deployment_name=deployment_name,openai_api_key=api_key,openai_api_version="2024-02-01",
)
print(llm.invoke('你好啊'))

这里使用AzureChatOpenAI,填写对应的参数创建llm。这里同样调用invoke方法进行推理,输出结果如下:

content='你好!有什么我可以帮助你的吗?'

现在可以把prompt和llm结合起来,只需要分别执行prompt的invoke和llm的invoke即可:

from langchain_openai import AzureChatOpenAI
from langchain_core.prompts import ChatPromptTemplatedeployment_name = "gpt-35-turbo-16k"
prompt = ChatPromptTemplate.from_messages([("system", "你是一个情感分析程序,不管用户输入什么,你都返回积极或消极。"),("human", "{sentence}")
])
llm = AzureChatOpenAI(azure_endpoint=endpoint,deployment_name=deployment_name,openai_api_key=api_key,openai_api_version="2024-02-01",
)print(llm.invoke(prompt.invoke({'sentence': '心情不好'})
))

输出结果如下:

content='消极'

现在看上去一切都很顺利,但是并不是一直这么顺利。

从上面的结果,我们可以很自然地觉得,模型上面的Chain只会返回“积极”或“消极”,但是某天如果Chain背刺你,给你返回一个“消极的。”或者“消极。”,那我们可能会因为这个意向不到的回复调试半天程序。

所以下面我们就要为我们的Chain添加一个OutputParser了。

3.3 OutputParser

为了从LLM的输出中解析出我们真正想要的内容,我们还需要有一个OutputParser。我们可以自己使用正则等方式来实现OutputParser,不过这里我们使用另一种简单的方式。这里还是以天气为例,首先定义一个Model:

from langchain_core.pydantic_v1 import BaseModel, Fieldclass Weather(BaseModel):city: str = Field(default=None, description="城市")temperature: str = Field(default=None, description="温度")

在Model里面,定义了数据的格式,然后我们只需要使用下面一句,就可以给llm添加一个OutputParser:

chain = llm.with_structured_output(schema=Weather)

下面我们来测试一下:

print(chain.invoke('你好啊'))

这里我们用了一个离谱的例子,给chain发送“你好啊”,而且没有像前面Prompt一样添加一些限制,那代码能顺利运行吗?下面是输出结果:

city='北京' temperature=None

没有报错,而且正确输出了一部分内容。由此可以知道,上述方式并不是简单的正则匹配。如果查看源码可以发现,其实是使用了function_calling和json_mode:

@beta()
def with_structured_output(self,schema: Optional[_DictOrPydanticClass] = None,*,method: Literal["function_calling", "json_mode"] = "function_calling",include_raw: bool = False,**kwargs: Any,
) -> Runnable[LanguageModelInput, _DictOrPydantic]:

另外这个功能目前是beta状态,使用时需要注意。

3.4 合成Chain

最后我们要做的就是组成一条Chain了,这里不需要自己一直调用invoke了,而是使用“|”组成Chain,然后调用一次invoke即可:

chain = prompt | llm.with_structured_output(schema=Weather)
chain.invoke({"input": "北京"})

四、应用接口

最后我们部署一个接口,这里使用Fastapi,代码如下:

import uvicorn
from fastapi import FastAPI
from enum import Enum
from langchain_openai import AzureChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Fieldfrom fine_tunning.configs import endpoint, api_keyclass SentimentEnum(Enum):positive = 'positive'negative = 'negative'normal = 'normal'class Weather(BaseModel):sentence: str = Field(default=None, description="句子")sentiment: SentimentEnum = Field(default=None, description="情感")deployment_name = "gpt-35-turbo-16k"
prompt = ChatPromptTemplate.from_messages([("system","你是一个情感分析程序,不管用户输入什么,请返回包含sentence和sentiment两个键的json格式数据。只要json内容,不要其它内容"),("human", "{sentence}")
])
llm = AzureChatOpenAI(azure_endpoint=endpoint,deployment_name=deployment_name,openai_api_key=api_key,openai_api_version="2024-02-01",
)chain = prompt | llm.with_structured_output(schema=Weather)app = FastAPI()@app.get('/sentiment-analysis')
async def sentiment_analysis(sentence: str):return dict(chain.invoke({'sentence': sentence}))if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0', port=8000)

运行后,我们访问:

http://localhost:8000/sentiment-analysis?sentence=这电影一般般

返回如下结果:

{"sentence":"这电影一般般","sentiment":"normal"}

这样,我们的接口就开发好了。

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

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

相关文章

Hive的分区表分桶表

1.分区表: 是Hive中的一种表类型,通过将表中的数据划分为多个子集(分区),每个分区对应表中的某个特定的列值,可以提高查询性能和管理数据的效率。分区表的每个分区存储在单独的目录中,分区的定义…

[Flask笔记]一个完整的Flask程序

前面讲过Flask是一个轻量级Web开发框架,为什么说是轻量级的呢,因为它用短短几行代码就能运行起来,我们一起来看看最简单的flask框架。 安装Flask 在看Flask框架之前我们需要先安装flask模块,学过python的肯定都知道,…

SQL构造一个触发器audit_log

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 构造一个触发…

TPM开启确认

TPM 2.0在系统中开启的确认 方法一 :鼠标右击开始菜单-运行(或按下键盘的WinR键),输入tpm.msc,然后 回车 弹出窗口 方法二:通过“设置>权限和安全>Windows安全中心>设备安全性” 点击Devices s…

PE73_D_E6_BLE

产品参数 产品型号 PE73_D_E6_BLE 尺寸(mm) 176.2*137.15*80mm 显示技术 电子墨水屏双面显示 显示区域(mm) 163.2(H) * 97.92(V) 分辨率(像素) 800*480 外观颜色 银色 显示颜色 黑/白/红/黄/蓝/绿 视觉角度 180 工作温度 15-35℃ 产品重量 268g 电池容…

计网ip层重要面经总结

文章目录 127.0.0.1, localhost, 0.0.0.0有什么不同?ipv6还需要NAT吗?DNS查询服务器的基本流程浏览器输入一个URL到显示器显示的过程PING是怎么工作的?ipv4和ipv6究竟有哪些区别?什么是跨域,什么情况下会发生跨域问题&#xff1f…

..质数..

先弄清楚我们在上小学时 学的概念。 1、什么是质因数? -质因数是指能够整除给定正整数的质数。每个正整数都可以被表示为几个质数的乘积,这些质数就是该数的质因数。质因数分解是将一个正整数分解成若干个质数相乘的过程。例如,数字 12…

C:数据结构---算法

1.1排序算法 稳定排序 不稳定排序 ①冒泡排序(稳定) 比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对 ②选择排序 在未排序序列中找到最小(大…

Nature Communications|柔性高密度、高灵敏应变传感器阵列(柔性应变传感/界面调控/电子皮肤/柔性电子)

复旦大学武利民( Limin Wu)和李卓( Zhuo Li)团队,在《Nature Communications》上发布了一篇题为“High-density, highly sensitive sensor array of spiky carbon nanospheres for strain field mapping”的论文。论文内容如下: 一、 摘要 在工程应用中,准确地映射应变…

星环科技推出语料开发工具TCS,重塑语料管理与应用新纪元

5月30-31日,2024向星力未来数据技术峰会期间,星环科技推出一款创新的语料开发工具——星环语料开发工具TCS(Transwarp Corpus Studio),旨在通过全面的语料生命周期管理,极大提升语料开发效率,助…

批量提取PDF中表格内容

1 背景 从PDF文件获取表格中的数据,也是日常办公容易涉及到的一项工作。比如我们想获取某公司年报里面的表格数据,PDF动辄上百页的数据。 2 传统方法 一个一个从PDF表格中复制,然后粘贴到Excel表格中,效率太低了。 3 办公自动…

云计算【第一阶段(29)】远程访问及控制

一、ssh远程管理 1.1、ssh (secureshell)协议 是一种安全通道协议对通信数据进行了加密处理,用于远程管理功能SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,建立在应用层和传输层基础上的安全协议。SSH客…

synchronized关键字详解(全面分析)

目录 synchronized关键字详解1、synchronized关键字简介2、synchronized作用和使用场景作用使用场景①、用在代码块上(类级别同步)②、用在代码块上(对象级别同步)③、用在普通方法上(对象级别同步)④、用在静态方法上(类级别同步)总结: 3、synchronized底层原理&am…

【初阶数据结构】2.顺序表

文章目录 1.线性表2.顺序表2.1 概念与结构2.2 分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现2.4 顺序表算法题2.4.1 移除元素2.4.2 删除有序数组中的重复项2.4.3 合并两个有序数组 2.5 顺序表问题与思考 1.线性表 线性表(linear list)是n…

SpringBoot使用Redisson操作Redis及使用场景实战

前言 在SpringBoot使用RedisTemplate、StringRedisTemplate操作Redis中,我们介绍了RedisTemplate以及如何SpringBoot如何通过RedisTemplate、StringRedisTemplate操作Redis。 RedisTemplate的好处就是基于SpringBoot自动装配的原理,使得整合redis时比较…

防火墙安全策略练习

目录 实验拓扑 实验要求 实验思路 实验步骤 1.配置交换机,划分接口的vlan,配置ISP 2.配置防火墙 3.接下来在WEB界面进行所有安全策略操作 配置接口 创建安全区域: 创建地址: 时间段: 安全策略部分&#xff…

地理信息科学在灾害管理中的应用:GIS构建防灾减灾的智慧防线

在全球气候变化与人类活动加剧的背景下,自然灾害频发,给社会经济发展带来了严峻挑战。本文将深入分析GIS在灾害预测、评估和响应中的核心作用,展示其如何为构建更加安全、韧性的社会提供智慧解决方案。 灾害预测:GIS的“先知”之…

JavaScript青少年简明教程:为何学习JavaScript及JavaScript简介

JavaScript青少年简明教程:为何学习JavaScript及JavaScript简介 JavaScript最初是为web浏览器(前端开发)设计的。它可以在所有现代浏览器中运行,包括Chrome, Firefox, Safari, Edge等。 这意味着JavaScript代码可以在任何能运行…

docker中mysql设置lower_case_table_names配置的坑

前沿 今天在使用flowable流程框架的时候,遇到一个问题。需要配置MySQL数据库以实现表名大小写不敏感。本以为这是一个简单的任务,却耗费了我两个多小时的时间。 docker容器中修改配置,重启不成功 我们前提是容器中的mysql中已经有很多数据…

判断链表中是否有环(力扣141.环形链表)

这道题要用到快慢指针。 先解释一下什么是快慢指针。 快慢指针有两个指针,走得慢的是慢指针,走得快的是快指针。 在这道题,我们规定慢指针一次走一步,快指针一次走2步。 如果该链表有环,快慢指针最终会在环中相遇&a…