|
1 w& M7 m$ x/ D' D* jChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。2 y7 W& ~$ a( {! H5 n) T
2 H: a: N' c4 [! C2 t r6 _
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。# h' G+ {" x* Z; n6 t
( Z1 R" r) T4 Y" b0 y: y+ b
我们应该思考如何让AI在专业领域中释放更大的价值潜能。
- e* y9 L1 @9 ]# \6 b7 {就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
7 k4 P8 n# I$ h. ]1 ^% D; R8 M
4 I3 r: w* Y. J- `9 x以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。6 J& E2 D2 ?; R
0 ?2 r5 E+ X5 _+ y1 D( q! o I& g$ b
' h; o3 V, W- c0 j
$ r6 L) t) g( m* n
% f3 U2 w# @ \* F5 s : [4 Z0 N: j3 w+ C
1 ]" v6 r" i7 `9 Z+ n
一、微调(Fine-tuning)注入专业领域知识1 n5 ^8 ] w+ h3 k! l
微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。
9 v1 E) b% o* f- \% t* e* Z; v2 D) b+ b5 x( b) Z& K4 }
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。1 u7 n3 _4 Z3 z7 X& g+ F! s/ S
# z; @/ x+ `" |, e" @% Q! E. @如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。9 S8 M1 L: D& g: K: u
7 w0 U v+ |( B! Y8 kOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
4 x0 N/ n$ }0 Z% k5 h A2 q7 [+ b u' Q
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
5 u& {) E$ _. h, [6 F5 G% \" h
% a& O7 |2 J/ @8 gprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
8 R' D9 e' p4 A( t4 t% m1 p# L% `) j+ l2 l4 M, S
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。" o( H* G) e" j7 l4 I r7 b8 N
: N+ P, l! p; ~, h2 T
下面是一些数据例子:9 l, I2 ?8 ~% Z+ Y+ }1 K+ ?
, p! ^0 T- I; g# _{
! l2 M. z4 _6 p$ x, E "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
/ R1 g2 n& ~( b) N5 |+ [ "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"* ^6 X1 ] r0 t
}* p6 v9 f# b; {
更多的例子可以看如下链接:8 v; n1 u$ i0 U2 v9 T" I L: J
. R3 ~6 u7 X: ]% b
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
7 s. K9 P9 G- q) J3 ?9 R+ b7 [$ B$ Ufinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
+ V4 r# D/ f. N& f要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。" o" ? Y5 F1 O& K$ G+ e
$ X! l2 x( C6 Q: p* w: _$ n
二、在Prompt中带入知识- g0 P8 I. {' y+ ?
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。8 U3 X2 H1 z9 P
4 c. R4 R0 x) U2 p输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
: x- t3 c4 C' [4 a a/ {
/ R; l! X/ p4 J9 N% d) B下面是一些例子:# U: s& a+ I# p, G3 D0 O( [
1 s9 F* B, |1 k* G( ]例1:作为专业DBA,回答SQL相关问题/ d3 G0 Z! Z2 B% a N0 ]5 }
这里在输入问题时,引入了我们的数据库表结构这个专业知识。
/ q% E& q, ^- H9 \5 z! I/ g) R6 E L' d" S2 F
问:% t. p' ` Q$ D7 \
3 D1 j1 J/ N1 f. j2 @' m我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。5 x8 O0 S! y5 Z0 Z9 E9 f+ P# N. n5 b; L
8 D8 J+ V' r3 Z1 S+ ^" P( \我的数据表结构为:7 V+ C. B! s, S* i* E( e1 A
: D1 U7 q$ V# K# }8 X3 b4 o/ V3 sCREATE TABLE `user` ($ ^7 T) B5 o: r- @& e% J+ s
`id` int NOT NULL AUTO_INCREMENT,4 z8 O; a `5 y( v9 w, k
`name` varchar(255) CHARACTER SET utf8mb4 + u) c$ j; t; E- I# z
COLLATE utf8mb4_unicode_ci 8 e8 Q" i N1 _8 f( k
NOT NULL DEFAULT ''
- m: p4 E* Z0 z2 v; s5 ]" \ COMMENT '名字',
3 X+ C1 O c {5 T3 BPRIMARY KEY (`id`)
+ E. X" y; V) t( `: E) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
: H* P8 J/ R9 G# n/ f COLLATE=utf8mb4_unicode_ci
$ f6 b/ Y5 E6 a, h- | COMMENT='用户表';5 Y/ H# v: n `4 @$ k9 t) q/ y
我的需求为:根据用户的名字查询用户的id
Q# V4 r) K! j" i- i2 `6 o4 L7 u8 ?/ d- h3 S0 H/ P$ A# d0 f
回答! l6 E: r" _- R
$ F3 n1 i& a( a/ |: k: k8 y9 _. m
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
7 Q6 G$ f$ m3 ?/ ~; ?, G+ E% `( t/ f7 c3 k# K0 Z
SELECT id FROM user WHERE name = '用户的名字';7 w- w, L* ?3 n/ l0 ^( F
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。" _) q& H7 c3 j9 q" r1 }7 \
0 t8 C/ ~: S& M+ x您可以使用以下SQL语句来为name字段创建索引:/ Z! V" x! E* t; ?6 c* V
: z, Y9 b% E) n+ iALTER TABLE user ADD INDEX name_index (name);
2 e* ]- C* w0 m5 _2 a# r此外,为了保证查询的效率,您需要注意以下几点:
1 Q' P: W4 j) G2 p! b
. C3 ^. S! ^5 l3 B8 K) q数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
& u0 R0 m4 N) V2 e# |: w4 V+ `
7 J/ L" l6 V9 U# g* m2 l' O9 }如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。
1 ?# X7 y$ {' R: u0 x: d5 d0 x, i x8 z/ q t" I
例2:智能客服
! f$ g5 `' N5 W: r& Z$ N# n; }比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
8 T6 P7 R9 ` h1 s1 T5 U* f! S. ^: O; A0 T! T+ A8 u3 H
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub$ P, q! f$ D( U/ ]9 n
6 U* K" m i+ [* [
下面代码通过消息对象的数组注入了一些上下文知识。4 z; r8 W- G* Y! y2 N
* n( u1 m8 X" i# I% O
9 E6 S( n1 [ s2 l- B2 b! d# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
1 g p; d$ g, H* m$ pimport openai8 _, ?" w* L: {% y$ ?6 Q0 b* v
) a% C# q+ ?2 W m6 ]( d. ~" Aopenai.ChatCompletion.create(
# K$ ?9 @; B" [0 D5 u model="gpt-3.5-turbo",
) Y" p/ g8 l1 g( S* D messages=[
0 ~. H1 V$ d! l+ n {"role": "system", "content": "You are a helpful assistant."},* O; i8 k; y" K4 K1 w% R
{"role": "user", "content": "Who won the world series in 2020?"},
0 v& x! Y1 C. f0 J$ r- c {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},! a, f9 y! ^6 m" F; h2 Q
{"role": "user", "content": "Where was it played?"}: S3 a% ?9 `; r: e
]; b% c( y: D: B( I* Y( j
)
: L! H+ @1 \8 }7 _; S2 ` 4 E* n F/ V1 j2 b& S4 B
其中8 e2 ~5 a4 @- b1 d/ K
) F* E9 O4 ?8 I, o
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
( r; \9 W5 Z2 [: @" B1 z. O) n6 q用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。' C4 r1 U7 ?/ |; R. x! b
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
1 s M7 i5 a& B# \, ?9 O; t通过上面的方式就可以完成专业领域知识的注入。: d& a, ^% Q/ F( x
L: }& x- l* |- \4 ^例3:通过外部链接把内容带入
. m0 o+ V- D- ~* `' \下面只包含我们发起的对话部分,会话结果比较长,省略了:3 O8 ]- A4 P# E: `
8 B; F9 r6 x. N
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?
) b) n! l" c$ B; U Q7 E...
t7 ]; D7 [- V4 `; A; FUser : Microsoft 2022 Annual Report
0 T" O/ l/ D& n8 l @...
' [" A$ t- U, F6 M- UUser : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
5 x* \3 W" o+ s' t...
5 Q& W. r% {' N3 D i: x9 |- HUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom5 ]" M: R4 m4 h. F" t4 ~5 X2 n. X# a
...& c) \( P m1 W' [
User: 您能否从Nvidia的报告中提供更多财务见解?. W" w! q3 y# m: J6 f
...* ~- \. Y: f5 d" |
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?( u. N7 Q8 x. ~+ A
....
, G! V! {/ ?9 M! ?
: Q5 Q9 ?( x: p( lUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。, r% { s2 e. F0 p* c
...
6 G* w [. L6 @' E4 S* [User:预测下戴尔未来12个月的现金流。/ s& C. l' s/ v) m r
' O" f7 H! e; B3 B2 F
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。
" s: J$ @9 O, C: s
/ ], r( y( G( u+ z, g3 o% C适用场景对比, b4 Q( F& m: o; x+ C8 k
价格对比
* C* S' O' U+ S& p+ I7 p1 nOpenAI的相关报价看: Pricing- _0 q2 u8 Y: r6 y. S* y
; X9 t' |6 D @. b! [" N
对话类:GPT4远远高于GTP3.5。- C. w1 M$ K I7 C
! g2 O! z3 H- }* k }/ W; `4 A, k9 q/ r, v) k
8 F9 n! e+ v. f: t
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
9 d* e$ C% @4 p, y& g# z2 o- n5 T. b
6 `; f2 }0 c7 a. V" m4 b, M6 o$ y9 N* J, M. v' N
. }% ~& I) K2 n- z# M2 `. ^; G
) t4 N1 k/ U1 `1 b6 n* d: T3 j* q
5 t- D9 \/ R7 K" r" Y0 z( I7 x& V0 G- Z2 _
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
" {6 G: M& i3 f; \9 c3 H# k
- l: [! z/ o+ [0 r0 Q" m$ H K而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
. U2 S6 y& ^3 d/ S+ M2 l( L8 z. r) g
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
0 l( P5 @$ b3 M; P7 J8 g* P# I: y2 t0 K( k
长度问题
: q* h- Z1 m9 r3 s4 _& u& e3 g- @ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
" [8 d: T" O- D" e8 i) t ]
- Z: r# A5 O1 n1 z- l但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。0 x- E3 Y, d, A1 V. f
: f% F4 ^- R/ V: Y- T0 _" K首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。): q, o/ X' R4 p2 Y8 h
4 e$ C1 r# ]' s3 ]( j. S7 W当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
, W7 q7 x% ~9 T/ C3 e
$ r! m9 M# Y% F/ v$ v聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
1 h" F# r; M( c, _9 c. R; [: r! Y% y1 r1 ]( `
比如说用户提了一个问题:% U- j, V0 B% ~7 I6 |2 B
* b# u% M8 o% {' J3 Y' f8 m“What's the makers's schedule?”
0 s# d- C% @/ ^4 }6 G) w/ w6 M* M2 P- W# W6 t9 l
从数据库中检索到相关的文字段落是:
! T: `6 g$ e7 s9 c* j t9 Q: _* y% z3 p# j$ r/ F8 ~4 V; W
“What I worked on...”
8 H4 V! w3 G/ b0 n"Taste for Makers..."8 t! |6 c; K, M8 v/ s, D2 [8 M
- z, \9 S. s s那么最终的prompt看起来就像这样:
4 Q% P# ?4 b t4 `& N- k0 M- q' x8 o! T" p
2 r {7 B$ P. A% r[
" ?5 s% U6 h- l. O( M {3 ]' s1 j! J2 L: q5 `
role: "system",
& i* J+ V& |4 b! d- j 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."
! t( q/ }; }/ b# C) w1 P& k" ^ },
/ H# Z* t, T0 ]( j+ J {
2 U/ K! I; J- D" N. T( D role: "user",
, p! y/ w0 G; y- o& P0 q9 z content: `Use the following passages to provide an answer
1 |6 p+ [. P F2 vto the query: "What's the makers's schedule?"" z- D, m. y* ?& r4 o/ Z
1. What I worked on...
7 ?! r: z# O) o: x% h! b/ `2. Taste for Makers...`
; D' Z, ~+ U( h }
1 |3 T) E# M, C5 c9 D8 `8 y]
9 l. @* N- t' E& I, J
+ q7 ?: M% z1 C# b0 i) M" k
) C) F" [2 J* D6 N# D$ z& B这样ChatGPT在返回结果的时候,就会加上你的数据集。- c, p. K. i$ ~8 i, r
8 U& u% e3 N5 l, k, S+ t具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.! |9 n c/ ~; M }. L9 p% Q
! A+ R; A, o5 [/ Y( n/ Q
总结- P- R- i- T: Q* R6 m% i
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
+ p6 V: M7 ^" P
. F! d1 F x( a1 {* m$ G1 o8 y+ M而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
4 T, ? Z. t. ~. e- S) K( j0 ~3 ~. L' v
+ a/ A! F( c' i) S参考
\2 g7 d$ u9 r- [6 e如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客
8 O8 k& V; E& s$ e. P9 r' j4 v$ Q4 }1 g& b) Y4 l+ r
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt, B" e! e7 {+ I8 y0 J3 L
4 X9 Y& m/ `# N
- S7 o. Z! j/ I————————————————
% ^6 L# E6 r: V! Z$ v版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
. x& K. M7 n( P( B原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
. w1 T S9 B3 v8 S |
|