|
|
6 t; {* P0 t& M( ^0 S6 T$ \
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
% ?6 T, Z( T7 i! l/ Q4 A+ ]' h" c# o; V6 N& N4 C% _1 J3 p
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
$ x, @9 W0 I9 z5 {* J. Q% i$ o
" q% C; e& f4 F/ @: l3 e我们应该思考如何让AI在专业领域中释放更大的价值潜能。
$ k9 r' t8 j8 A7 g! J就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。4 b* F u/ D. Q7 _7 [3 B
0 k4 f& @ v: A# R; L
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
6 w: Y1 L/ v3 |2 ]
" M% o! i6 i ~2 E0 L% I {2 d2 c2 r; k& N4 M/ W1 a
" w9 w/ f6 O8 l$ i" ~2 q+ e
" l6 _" P/ y( `4 G O
. B$ L1 x5 l4 \4 `- G! w# ?
$ a" L% ~5 e& X! V+ s一、微调(Fine-tuning)注入专业领域知识
) m# M, a6 t2 A6 @% p微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。7 L8 E2 u& v0 f4 V, [9 u% o
& [8 N2 }7 K/ k) G传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。: l9 e1 B" ^! ^4 k. h9 ], x* b
, u7 V- _2 V/ @, j d% ]7 c& y
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
: g$ x4 |& c9 |) C: v
8 N6 f' L; S& Z% L4 T" |& b3 ?) _OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
9 j8 l$ C3 c8 j$ w9 y, q2 @; u4 \! v9 R
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
- Q5 o' j! l' ]% x3 b$ h" j$ I. h) Z
- g5 R/ A4 V! G( G; wprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
4 U# Y2 \ B. T; [4 R7 x& a( }
! ^! o/ P0 y/ T, v) i' L5 [2 c& Ncompletion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
" o) U; _9 G+ P4 q( a0 @/ S0 n! Z' f9 F
下面是一些数据例子:3 g: q, s$ ^( o. K$ C! N! E
& n) |! V& p, s{# ]. W- b# b3 k. H- ]) f
"prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
/ t+ w$ l5 \- b( w( |* X "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
8 i! M a0 {( E9 N. ^}6 n T6 `* b. d3 I/ ]
更多的例子可以看如下链接:/ {9 j0 a, B! N. I. s4 X% }
) y- p; j! ~- Q. X8 c
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
6 o; K/ ^$ i/ V1 Efinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
2 h( V; p0 j& T/ m* \6 y要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
% H8 N3 e& ]' C/ I1 X
; u. z* q- U, C& F3 m! E x- M二、在Prompt中带入知识! O; F6 W' s1 w& c: O& o( t+ D
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
+ n3 W7 v1 c& @1 m3 _( }, D L; Y( v: w5 Y" L
输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
; x9 _3 ]0 M3 {
% j6 W9 Z5 {( L% Y7 _下面是一些例子:
, V* c4 l K* k! c8 T B5 M1 [) X" v5 h
例1:作为专业DBA,回答SQL相关问题) {0 I$ J9 n; h) M
这里在输入问题时,引入了我们的数据库表结构这个专业知识。$ i1 z$ I) I3 j, `1 h
6 R$ }5 V5 K# K3 T. c; u7 A问:
3 g$ J0 u% ^; q" H, O
. F O" r- R2 Z: d s/ u我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。
# C. Q! F8 V2 l2 z$ D) N2 x3 c v( }1 e
我的数据表结构为:. s2 C9 ]! Z3 j1 ?) t# M: h+ N
$ D7 y7 t( K0 A# p
CREATE TABLE `user` (: E# S$ c. j1 ~$ C% y z- R
`id` int NOT NULL AUTO_INCREMENT,
u! a# J% O+ [* U$ O9 `# @2 ^`name` varchar(255) CHARACTER SET utf8mb4
; e: P5 m/ @: b- B1 L& h0 B! i/ u COLLATE utf8mb4_unicode_ci
$ n6 D/ \1 L; Z NOT NULL DEFAULT '' 9 o/ L& _- `& J; g- X) k( p
COMMENT '名字',5 T! r! U2 _$ l/ {6 {9 s
PRIMARY KEY (`id`)
7 l7 H u7 J) {- R5 A9 e) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 9 ?6 F0 g; t; S4 i* L8 s$ {8 h
COLLATE=utf8mb4_unicode_ci
5 X, { t8 \1 ~; o/ u/ I COMMENT='用户表';5 C/ E' k/ C. D/ A+ c1 Z$ Z; ?' O
我的需求为:根据用户的名字查询用户的id4 b) \" f/ z, j9 P% `( o
! M1 w- Z' q+ s
回答
/ f% @. T+ ]7 U4 `5 N4 G7 b. U- X9 J! y3 H4 X0 k7 g9 O O/ t! p
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:0 f' J( N2 q, o) k$ P9 B
. m& o4 O# Y& D' C, A* h" g
SELECT id FROM user WHERE name = '用户的名字';- [+ S9 c) h; ]& T# J, R% p7 \1 e
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。1 X; i: U& ^4 C$ t% @. X
9 z8 _+ Q4 L* G f0 a! A" c5 X
您可以使用以下SQL语句来为name字段创建索引:
9 d a. T, e) b; X6 e+ [ ?8 m* {+ w. |4 b+ Z* C
ALTER TABLE user ADD INDEX name_index (name);
8 [ K& B D) f此外,为了保证查询的效率,您需要注意以下几点:6 a8 @! C5 l! J4 [$ v, m
" T* U! \; T8 s% ~* e
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。8 O" K6 @+ C. _; G, _& h, J ^
* l7 W% S- ] ?" Q如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。/ s7 P9 D0 @/ H
2 F: d( a# z, {% C" c: C( h6 {% V
例2:智能客服
- ?1 R3 j* C9 ~! p* l比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:' Z5 q9 [3 z. S
5 w4 S/ q* G& Q% _; @
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
- G- G1 L M. o" r# t4 K6 F2 t( N: W% p& M- k9 e* K6 z
下面代码通过消息对象的数组注入了一些上下文知识。
6 S* D, R* F- W: A) R S8 G7 @' A6 ~! Y6 r& z, ?
% n& `* B% x [& Q# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
1 a: F+ P, Y- Qimport openai; D# t1 F$ F6 f9 [
$ ]; w, y; d% y. f' d2 bopenai.ChatCompletion.create(+ Q/ y- _4 h [" W
model="gpt-3.5-turbo",0 ^$ _% H8 B$ r* Z0 L/ q# C* n
messages=[
4 N- S7 A( U0 k- ?5 `* r& | {"role": "system", "content": "You are a helpful assistant."},& k8 o0 p$ N4 r( _0 J; ?. i
{"role": "user", "content": "Who won the world series in 2020?"},* F, v/ R: U' `9 x! M) w" T0 n6 X
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
2 _1 U: G1 ^% n" M. s, E4 Q2 i {"role": "user", "content": "Where was it played?"}% e7 M$ I( K! Z, A
]& G; b( g7 k0 E$ }# ~# ]' m6 l. X0 Z2 t
)
0 e# }- d( u* b
' A' o% s3 f0 b) }+ q' Q s其中: H( {# g5 y9 i: ~4 i1 y2 `
2 Z( Y6 K3 @0 p- P: a) X4 V# K" n" d系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
( E, a0 i2 j+ ~% y9 p2 T用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。" f V: O- G. e [% {
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
! V/ i* M7 j7 X/ L通过上面的方式就可以完成专业领域知识的注入。
: |) F$ @/ U- P; |& d$ k' ]+ z$ ?4 Z% S6 E* X' }& a
例3:通过外部链接把内容带入" m7 q. V3 M9 G5 c
下面只包含我们发起的对话部分,会话结果比较长,省略了:7 U/ U6 w" C4 {+ D" k: H
3 r" [4 u9 ?) Y; a+ x6 y
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?2 r1 f/ u3 \- W7 V: a8 J4 P) T) D
...
( f0 u0 G$ V. ^; \# y8 ZUser : Microsoft 2022 Annual Report
, J/ K* L0 A& H. F* x...
! O( [; n. K, W; wUser : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?& u3 `8 v7 N2 b+ q
...' O5 @+ i' M" { {3 r3 D* q/ i
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
1 n# j6 B8 X( y...6 P; ~& A) I% S) z9 [% T9 l& g
User: 您能否从Nvidia的报告中提供更多财务见解?
$ Q+ q. [5 a" D% x" |...
7 e7 K: y: j" j' f$ JUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
8 e# V. }" R8 d% i7 f4 n) j....* I: v7 B0 a) U$ T. k
N& V0 R9 ` J, E3 S) A0 H
User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
V H" S2 E, }, J2 ~8 q& \...
7 O, K, h9 }* l' }7 g0 w. ]# aUser:预测下戴尔未来12个月的现金流。5 w3 w; r3 c! u3 T3 Y+ o
" F) c4 y9 d4 u* z: |& ^$ X
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。& j/ f, c \) ^% x+ ^
7 V$ r. b4 S; j& _ b4 k$ X
适用场景对比
2 c7 u3 M. S. g5 @+ i. h价格对比: m7 N1 u5 h% i( x
OpenAI的相关报价看: Pricing: i }. k1 _# H1 c- B
2 ~- u `+ `$ t5 j对话类:GPT4远远高于GTP3.5。6 F6 E3 B- @" e/ R
8 i" \- A6 X9 r. v
4 m; }9 T n8 g! Q( W3 m
5 z( [* M; R6 x! l: m目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。! x0 a" X1 z- z$ v, Q
4 T9 g2 m H+ X
2 g0 ]4 }8 n$ U3 b$ C! P
( {3 B2 l' k/ |
6 X# M! v9 A7 U8 H8 ` 9 b; X& @4 C7 g
8 \, @+ e; |- {& L5 w. t5 j
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
: ?) I' A% o& \
+ j. Q' K: H3 z( z2 |/ g而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。3 ~9 J% m6 [6 O$ d: z' v
. I) r6 r' |) k0 d: f& [8 C所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。2 \* R) @1 r/ k O: t2 @. w1 Y6 i% J
# X6 h6 U3 T$ K长度问题7 q) L! U1 f I9 w- p
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。4 _1 ^ R# Z, z u. H
! L$ h- W+ O0 R5 C l! p' y# C$ [但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。) u; C" j9 I& I0 f
{6 a8 i k- J- ~0 c, @
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)8 D, \& x0 r, Y& Q l
! Q& z9 z4 m! f4 v
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。$ f8 S8 |, c# g
' b! y2 ~: O* u; I I+ k+ ]) o- ^# d) J' }聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
* O5 _3 } b: g# Y; ?+ c4 n# r' I% w! ^( w1 h
比如说用户提了一个问题:
7 F4 b( u0 ]3 B# j
9 @! A! o7 x0 A5 B$ o( Q S“What's the makers's schedule?”' [/ k. o* o" m' H
! v) Z& I/ k/ K$ t& n' L' ~2 A7 a6 v从数据库中检索到相关的文字段落是:; t2 U2 C, e0 }7 U- P
$ l, X$ m8 V4 g3 O( a5 f/ b“What I worked on...”
& @7 A1 c2 e7 `"Taste for Makers..."
: J5 R# x1 v8 W& ?' X
4 j. M. Y3 x0 O那么最终的prompt看起来就像这样:
5 r t' n1 N2 O; X% A4 e) ` P2 R5 F0 f
- X+ d$ L8 m/ W9 N3 e1 s[9 U9 J' Z2 Z' O) y
{
) f* s" m. G/ C! ?* G- [ role: "system",
% ~4 \/ Z; O8 G, U$ S, P) T 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."
5 b* V& E+ J9 t# V) y) w/ @9 j },6 U6 d. i; E, v2 ?5 z! \6 [* J8 E
{; L* i2 o( C+ x4 ~' z
role: "user",
; z, |8 d8 A8 U4 z6 O" F; { content: `Use the following passages to provide an answer
+ \+ \2 }$ S- y3 F( eto the query: "What's the makers's schedule?", b. K# J% s* L
1. What I worked on...
q+ H0 E! X9 d' \ G; x ~2. Taste for Makers...`/ X6 _) {* ~8 f" I- Z
}& v ]$ P4 d& R5 K! s: G
]
% E5 N' f) u. Y) q/ W3 t6 \' I ( d. r" Z$ a. |- Z3 }
2 e b1 t; a# Q' ^! n6 u& j& N* y
这样ChatGPT在返回结果的时候,就会加上你的数据集。/ m0 F, }( _( K, S% a, k
6 x. c, ?) {/ L/ U具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.3 b- C: G. W- u
9 B0 \* O& T! k. X" D0 `! f4 \6 S5 ?总结: e6 [. _( ?) C) d+ w
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
$ N* I# j: o9 z
. b9 ?6 N# R6 P2 q" g$ O: B! q而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。% @; K7 u6 g0 z7 j
( l* y% R( A/ }! m
参考# D0 x5 I1 j: V' V. b
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客
6 K M6 q& h- h' G3 b0 Z$ {) n; y. J
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
0 i) A* t4 c, s- w' h) L; H+ n4 t9 Q' Y
* o1 K' p/ d& i* [————————————————
( r$ U s2 l( _版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 s/ c2 V3 K5 B原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
6 K v: Y9 M9 ]! C- h& B3 l) ? |
|