|
|
* ^( ^( N! l" b" O; ]. t7 ?ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
' @% M! j: c$ G; I+ ]$ x: H+ V' {) c# v) f4 ~6 A& c3 O2 P
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。6 m) |5 Q- \4 s1 s: A" f
! ]& L+ v& n8 x# z1 N7 t, N
我们应该思考如何让AI在专业领域中释放更大的价值潜能。$ s& }) }5 \7 F
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。9 I0 b. o2 C# W: I2 @4 ? f
, L. W/ R, \; D7 ?8 K) r以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
( l* E, D4 Q: ]3 U [, J! r4 w+ B$ C! v: Q; l" K" W
4 ~- z. `7 p& c5 |4 H
& A) {; X3 o6 H F* n- `
( S) V6 e6 J6 M
. Q% l. h! y4 Q% m7 @
0 ~% j9 k$ a! e( b' D5 X' N一、微调(Fine-tuning)注入专业领域知识
! q% u6 ?% s5 `8 T9 M& }3 c微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。
7 i* ~/ v" a! X3 f' c
0 t, U t+ U- i传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
% h3 R I. L' ]0 z# }- L* p+ T- }) A
8 m/ b! Z. E7 f: _如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。: w# Q: ~$ K5 ]4 p, @2 R1 a$ J5 r
8 F! F$ O+ P; [OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
2 h/ a4 U; [' H2 m3 Z, Z3 }) ]# A8 o, X, W( _; j" ]
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
^. [* V+ ]4 |6 z1 x, p9 ?- q! i' l
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
$ D9 S) M8 i3 x% p& W. w. D6 C( o) n. Z. l4 F2 c7 f
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。, ?* k1 B+ r! L8 k
# X8 a: t& l* K6 f. H( d+ z下面是一些数据例子:
3 H0 R$ D% s( j) V& z* p" [
" i) v: a. \6 `4 {3 L8 O{3 c: w+ V5 X) H- e8 |+ a+ ]
"prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", + X! ~$ r/ p' y/ a: \# s: S
"completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
9 s9 Q5 X# c, A1 d% c( s4 m} g, C6 Y1 n& ?
更多的例子可以看如下链接:5 L# M9 m* r6 l' [- ~* h! N7 e9 G
- R+ O _) R( f$ Z. P6 l; Z) |" |4 C
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
) S. y, G% s' g4 g: I3 N1 c) Ifinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub- {8 ~. Q) R; [" Q) h
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
8 J+ n1 b1 i+ M7 |5 D
) n1 W' J z: }7 D" d3 Q& `二、在Prompt中带入知识
* j- D8 _# A5 i% i* Q只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
' z u5 j( `! U$ Y: C
3 B' ^' r" v3 s& ]) g输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。 _, o X4 l3 R3 v: R5 s; S3 u! L1 Q
# U/ Z" ~! s$ o9 f" f
下面是一些例子:
3 J* T8 b. D. u2 V7 C% R0 j4 Q0 H
例1:作为专业DBA,回答SQL相关问题
3 q# |7 L" x k- f这里在输入问题时,引入了我们的数据库表结构这个专业知识。3 w- k* T5 J. j6 S0 l4 r
' ]1 U0 l9 e. j问:* n. c% P! Q+ `1 L- a/ R$ }7 P
6 |! a( B) y0 W8 }& E我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。& u9 z( D% f8 Z$ w0 ]! ?
$ e. b- M6 Z3 V) A# f6 a3 V; ~
我的数据表结构为:
8 `# J$ k3 T" u: L
( ]( d1 {# T/ ~/ NCREATE TABLE `user` (
3 y9 b1 v/ \. }* h& t`id` int NOT NULL AUTO_INCREMENT,0 U$ |7 }& N) ]9 {( y
`name` varchar(255) CHARACTER SET utf8mb4
( O& l! l; E/ @; \ COLLATE utf8mb4_unicode_ci
2 |8 H: X( v+ ^8 n NOT NULL DEFAULT ''
% ` g% q# M% [( W+ z4 f, h: v x COMMENT '名字',
7 O) c! m5 a' ^$ u' s$ k C- YPRIMARY KEY (`id`)
. x- }1 U9 ]6 j6 Y( g) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
2 \8 E/ h. F) ~% u, X COLLATE=utf8mb4_unicode_ci 3 R, t) {5 D* I0 @
COMMENT='用户表';
1 L- H; F9 Q2 U! R [- B我的需求为:根据用户的名字查询用户的id
5 D/ `* E* _7 ~; g
+ u8 z7 i1 w! }% R r( G回答
! G4 \& T9 k$ Y; Q; T
! u7 B0 A0 R& b7 l5 B6 k5 E好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:3 R# L: @) _* L& y, g
# H, N9 s: O" {' W& f: p! r
SELECT id FROM user WHERE name = '用户的名字';
& C/ r5 t. h7 t7 f6 c3 x, }这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。0 y8 a/ y/ k- I {/ n
4 D j/ \1 A+ Q. i4 g您可以使用以下SQL语句来为name字段创建索引:3 V2 I! o* f% x) R0 q. c
; q/ F: k, |+ Q; QALTER TABLE user ADD INDEX name_index (name);2 ^/ \- f6 p' ^
此外,为了保证查询的效率,您需要注意以下几点:
8 f( U5 V0 {' n* U8 Z2 p% s
; |; S; a0 B" L数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
- c$ R+ y$ b/ D8 |1 _) `7 n2 B; k1 z5 {1 ~
如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。 O7 s$ ^$ i1 \9 \, D3 H
0 {; L W* I+ g' b) g
例2:智能客服
' G& e9 C& D) C: F比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:8 E* e Q6 L) f4 B) X# e0 R
( m- @+ e) y/ h8 t* ]1 M
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub) i& N0 [7 H" q9 ], j
, }$ b3 e, M9 Q, U
下面代码通过消息对象的数组注入了一些上下文知识。+ y6 U$ A6 B9 h
5 a: U. J/ |. r- U z( o! P* E
9 e! N$ R: d9 w7 K9 A" M" J! G) W# Note: you need to be using OpenAI Python v0.27.0 for the code below to work8 l6 K5 W4 i' t1 `$ U- r5 i5 f
import openai
6 i, w$ x, Y& M+ H 7 l/ ^; n7 _- Q R* }! c3 R2 W7 G
openai.ChatCompletion.create(
: F7 {8 c3 ?/ `9 ~9 i, n% Z' E% Y! L model="gpt-3.5-turbo",6 G N/ m2 O0 j5 o5 E$ b/ }" [2 i$ s
messages=[, {$ X1 m8 U E2 H
{"role": "system", "content": "You are a helpful assistant."},1 T! h; X! J7 e# t5 y2 b
{"role": "user", "content": "Who won the world series in 2020?"},; ]+ O1 ?) f" O$ z9 Q; F
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
# r* v0 p6 _' p. r( i W% K7 N {"role": "user", "content": "Where was it played?"}9 t; P/ E# s9 L
]& ?8 t# T! w3 Y- n* a$ [4 @
)
. N9 j& J7 l; k* b: \
% `6 x2 a) Z5 v, U0 V. V8 s其中
( H3 M* {* }3 B" i& a) t$ i- o, c, X: P. G& G& N; o. C
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
9 F$ Z8 h" k% D6 E- J8 C用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。( Q1 }; i8 C* R. ^" j1 t
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。4 Q( S8 J7 t( B0 P1 B3 T( Z8 i8 ^
通过上面的方式就可以完成专业领域知识的注入。
( z f6 P( @, F& |% Z8 B- m5 j+ y8 k% y t0 r- Q
例3:通过外部链接把内容带入
6 I( q R) @. X下面只包含我们发起的对话部分,会话结果比较长,省略了:& }9 i( J, E" O0 ^3 k: U
7 c* ]) A4 v5 L( n' Z# d8 \1 y
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?3 B; O2 c6 A2 W
...! i; t; U; m- |9 M$ n
User : Microsoft 2022 Annual Report
- R+ W4 x% n: P& J) @& M...0 n$ f: N9 ]3 Y' z: D- U0 ^
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
s, n' y; z, v% S& X9 E9 ?...$ U& Y( Q0 |1 J9 r
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
0 G' F" A% o% N' q, E' ?..." k T5 {0 C4 [7 m
User: 您能否从Nvidia的报告中提供更多财务见解?
$ H2 s2 D" z; Z. ~. O j... S" p: l8 z5 q5 ~
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
/ A8 m! K0 \" ^% ] f- J, \....3 T% t. l0 i/ x. ^( b
8 G& [9 o5 |8 P9 vUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。. i* \7 U9 O- Z+ A$ L
...
* z' ] v+ M4 d, h7 FUser:预测下戴尔未来12个月的现金流。
, I5 {# ~% h$ s3 v$ [* _ U% F, b' ^% p! Q' v7 ]
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。! z4 K! I8 U, \1 |6 p
& W6 n9 y2 |6 p \$ k
适用场景对比' U0 l% f4 b7 @! c: m N
价格对比
) Q0 |1 O3 \4 Y" HOpenAI的相关报价看: Pricing; h2 b$ Z' G3 J/ a' @7 t# l, D4 Q
) n+ z# U3 z/ E+ q5 r4 j
对话类:GPT4远远高于GTP3.5。; J+ g" q9 F' c, W
/ H/ |, h ] T1 e* E5 q
% x5 G1 g3 g% |0 i- e6 N0 Y& P
5 _ Q* Z/ L- \( h1 V- s% b目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。+ o3 x" G6 ^9 U
% |, P/ Q4 ^2 i5 h9 i7 I" [- T6 z3 y2 C& x9 v; Q& m; T
{ G% l( L% [7 y* Y" S/ E
1 ]0 c! F' T8 b- L( @
; P8 C3 s6 P3 A& C' c
( e. h3 R) c$ f- e/ _GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
6 R t( v0 Y( C. E0 ~' G1 k8 a& M7 z2 Z- {3 |- t: \
而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
: m& W- P: _0 ~) v
( {: P8 O, Z. z9 [4 `所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。/ V0 `0 y2 G# y# l& |8 d
* l0 m( a% [3 A# }6 i' a. F; ^
长度问题
]- x( b" i! w- Z6 k' GChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
' o: ^& \- m; N/ M
8 [) R# H- L; Q. t4 D. q但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。& d# B$ O- j; Y# j" {
- a( L4 L' b% J: u, F* M7 X首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)6 F9 |: @& C2 v* `! F
0 X2 z1 c; T0 B- Q当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。0 g$ N; z: D' t1 ^7 w. G. e
% H. [, |$ a$ T$ i聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
1 F7 r) q- N/ ]" h0 f3 v
/ V: n5 B+ A" n9 X9 b比如说用户提了一个问题:+ D' u4 ]% n9 }1 H
1 N* E+ `* b8 _' O0 `7 z“What's the makers's schedule?”4 s* G4 Z: u7 Z# l
( g) J. p- S6 ^从数据库中检索到相关的文字段落是:4 G+ O" g3 M, ?2 I# b$ v* d' Z, l: L
: q9 A& S* Y8 X7 ] O
“What I worked on...”
9 C: Z/ U) R0 |6 O"Taste for Makers..."4 {; C) p& ?4 _: J: r
, R& L. y: N+ L
那么最终的prompt看起来就像这样:+ H! w5 a/ ]4 K% I- z! b6 U/ n% m9 M
; B$ B' u/ A# d+ a
& X1 v4 ]) Y- g/ {[
* _& e" ?: f5 b: b' m5 y& a8 v {, m0 `9 r% c2 r) k3 k: s
role: "system",- {& W' c+ Z3 S# K, } \# R
content: "You are a helpful assistant that accurately answers queries using Paul Graham's essays. Use the text provided to form your answer, but avoid copying word-for-word from the essays. Try to use your own words when possible. Keep your answer under 5 sentences. Be accurate, helpful, concise, and clear."4 O$ z9 f4 H5 J' Z. @% J
},# v1 R& m5 [" o/ z3 L) x
{
a5 {/ F! p8 C$ U I role: "user"," H2 w I; I9 Y7 X$ M
content: `Use the following passages to provide an answer
; x9 ^* w; G8 V2 Mto the query: "What's the makers's schedule?"
2 H$ a( }* ^. S1. What I worked on...
3 D% G) \. @/ N6 e' ^) h+ ~2. Taste for Makers...`
7 ]( g, b' T& ` }
, N2 ]* A& ^5 h0 ~- ~0 _3 []
?' V4 }& T+ J2 j
4 N/ k" Q! r* J+ M& T9 I$ t: h; t1 X( H. g
这样ChatGPT在返回结果的时候,就会加上你的数据集。# k& M" G0 b, V0 H& u0 B9 U
9 J5 S3 J; S+ V6 n具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.& D( v5 N* e7 a4 x- v
( J2 A8 v& j" c+ V- ^- c P- P$ a
总结
# I; \( }3 `& S- S大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
4 Y. n0 ~' ?9 r* A' n( [! T& W6 I j3 \/ C, c& i9 p) `
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。% T, i6 O7 A* B; V1 {5 P
/ S7 a1 M2 e" L( E' }参考% G( ~! p0 C5 w. J# r
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客5 @: T# q R# R; G
1 w7 h0 G3 ~* S. K+ s5 M
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt+ M% [9 p, g5 Y# F+ g. u
8 Q) W' W: \: k
8 c" C/ Z) D3 J1 t" o5 l2 } ?————————————————
% L; ?- @9 P: r$ J版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ L+ G- N; E, P6 Y! V' G$ q* N( L原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
9 `$ {4 Y8 d; B8 J |
|