|
|
3 I1 s0 I: K2 P3 NChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。/ v* z6 H2 U' ?8 M$ p3 O
1 G- S) v& @4 M" v以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。4 e- Q0 T& n6 L3 ]( c
7 ^' p/ C# A4 X$ F1 N" H* Y) F
我们应该思考如何让AI在专业领域中释放更大的价值潜能。
- W: H6 A' N! g1 j, i- h. A" ]就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
1 v4 ~0 v( w3 J" ]8 P5 u
/ D8 d1 I, r" g; U* m6 E) f以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
4 c" s8 ]# `9 b. S2 \& J
% w9 j: Q/ Z: ]1 w" j9 z7 A$ O$ I0 u
( Q8 \6 x1 [$ d2 J$ a& x# D) T9 S/ |
8 E9 P0 C2 g0 ^2 W6 J8 P ) w1 z m0 U" m& a5 a" _
* i/ H/ S5 D5 k" C! p f9 h一、微调(Fine-tuning)注入专业领域知识" _* o6 g- o6 z# i% x1 s
微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。* ?* i0 A% K3 h: `/ ] k1 v5 D
3 J: A2 A1 B/ @传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。( e) j' n5 b9 T6 v$ J F
$ ^, N8 N( Z) J' l/ A$ I
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
/ T E- X4 N0 B, }# V+ K# K& i1 l6 z; G' M) ^( t+ r' u
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
# X8 I( F4 U8 W1 q" R2 f$ X' U
P) G8 R2 ^3 ^8 t5 k6 a从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
) A/ u% r; u, s8 {1 y ?
( K' |8 c l R4 ? P' qprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。" n6 P9 i$ t# o% I* Y
5 |) Q* M4 ~% H4 T2 }! ~completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。1 k! o0 B, A0 \- |, z7 t
- ^; y9 L' a" G, i/ j v
下面是一些数据例子:
* L' Z# }! w+ }2 u* W8 X: \) G, U( ?
' |+ K& W7 {; N$ g& j) p{
; n6 \ l8 O/ W "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
- }6 T+ c7 S5 w "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
7 ]& C6 C& {# x2 x7 C8 D* a}2 E+ i3 n2 k/ D, g/ Y! O% o4 E! c
更多的例子可以看如下链接:: g& f# s4 T: ] X- ]7 G+ p
8 L/ W" p Y6 y; ]+ u) n* d
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub- \# f: s( a M. L3 u f3 r; g
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub; O0 h0 H3 v% ~6 |
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。4 @5 E4 J) N8 ~1 }
5 y H% G! D A2 x二、在Prompt中带入知识
% v! _2 s, z6 k+ a$ x只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。7 \; h, o+ J7 [# W9 p- u! K
[1 l- y3 ~; k: u' X& r) s! I
输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。! }. S2 P3 x( w1 i9 h8 w
7 h3 @* ]: p4 c$ b/ W
下面是一些例子:8 r' b% z- ?' R5 S; y
6 Q/ H6 M) R5 A6 q* b" ~例1:作为专业DBA,回答SQL相关问题+ ?0 w9 N* e, d$ E- r2 G8 M: c+ C
这里在输入问题时,引入了我们的数据库表结构这个专业知识。' N7 z. {$ c. X8 W
# |- U3 L* n; X6 j$ G
问:
/ l& \" i! n% l/ i* e" u3 \' C9 \8 u1 R- p
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。
+ y. W1 V1 {2 u# l" y4 S
. }% K- f* S# Y' `" E我的数据表结构为:- E5 A& m9 U" Q1 \8 l* K/ t: G
# E0 C Z$ z4 YCREATE TABLE `user` (
1 L6 z H2 _- H0 S`id` int NOT NULL AUTO_INCREMENT,
: s# U f- O' T% J% o2 d`name` varchar(255) CHARACTER SET utf8mb4 5 U. w- C: A/ \$ s8 h
COLLATE utf8mb4_unicode_ci 6 l; F: `, x: b4 V. J: ^. \2 f9 X; t
NOT NULL DEFAULT ''
$ U2 i3 E( d8 Y h8 a( t7 e COMMENT '名字',% F7 d0 m. _6 Z7 y, V& q
PRIMARY KEY (`id`)
2 d$ ~( W6 o# r( n0 j1 P) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 3 R' T. s" d# u( g; F9 a. j
COLLATE=utf8mb4_unicode_ci
. S, H5 W/ L" S& m& K COMMENT='用户表';
* Z _. S0 i u+ b! ]$ v我的需求为:根据用户的名字查询用户的id; v* O) U1 A, U
" H: T- I5 y7 ?& i4 C回答# b8 }5 C2 v$ F0 f& _& I7 x
l; c, U7 O2 \6 }
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:: i& d" _9 [7 U" Z2 j4 r
; M5 @4 k4 t; |( U9 q
SELECT id FROM user WHERE name = '用户的名字';
2 z* F: I; I3 `; M& l J这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。/ C4 N1 M$ n4 r) }/ e/ ]5 g( v* y5 M
1 }. J- e% L _0 b- U您可以使用以下SQL语句来为name字段创建索引:
* d8 f. `$ U; N
$ ]" q6 f' `% }) K4 y1 W. Q! zALTER TABLE user ADD INDEX name_index (name);
- B! I% d; d' ]( _此外,为了保证查询的效率,您需要注意以下几点:
& m( n# e5 p, a4 X
) g& X# k+ x2 Z9 C: a3 x: l$ R8 @数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
, K5 ^: ?. l J3 F
) _% F9 b9 f+ m1 K$ E如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。' F+ M' Q E5 K' e* z
/ r$ m4 S( V! D y, a/ C7 _: p例2:智能客服7 k3 ]* q2 N) G" f2 Q: p, d
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:0 ], A; r8 m" ^2 D! Y: L
0 a* q/ |, r& d2 clanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub) {$ {- Y& a [
5 K# `: \& k& I0 P; L* D( K6 t下面代码通过消息对象的数组注入了一些上下文知识。' A& L% o% s3 k3 \6 p X7 I, ^ Q
9 l$ x7 O* d2 p& C" K3 {
: r. b) U7 i9 X' R% S
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
9 Q; k u8 O+ Y; K& jimport openai' d4 G, y3 p0 v2 s( e) U0 V H5 T; V
& r. h) }% F5 M' s7 ^
openai.ChatCompletion.create(
* [9 v& K) o# A" Z1 k3 H. J model="gpt-3.5-turbo",
7 |& x! Y% c. G& {% B messages=[
0 e' j% e% P: a; C {"role": "system", "content": "You are a helpful assistant."}," ] W9 @! C a& q9 }, o
{"role": "user", "content": "Who won the world series in 2020?"},
$ o* N& Q0 f8 Z: } {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},& z+ q5 e* U; n0 ^' I2 r( I* Y
{"role": "user", "content": "Where was it played?"}
# L0 c( o, J2 @1 V$ d% S ]
5 h4 b" z( Z1 t" ^4 ~): m; N+ }. d5 u2 S1 s8 X
7 h1 W2 ?$ V, Z% c5 J8 p" a) L其中
. S0 {8 v- a' k9 i/ `% W7 l% s$ N& @6 P
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
6 R: A' j9 S$ v" e/ \1 T' O用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。( ~; |- _, Y- q+ }6 _: `
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。6 z9 ]/ D9 l, b1 z2 i% d$ ~
通过上面的方式就可以完成专业领域知识的注入。
: l8 ?* Q# M P) w8 h2 u0 x
' e: g9 p$ g/ U* R6 d例3:通过外部链接把内容带入
9 \+ R f2 Q ]7 ]9 c& ?) m下面只包含我们发起的对话部分,会话结果比较长,省略了:
. i0 Z3 O" \$ g5 V" p N9 B- S4 M( E# C' d$ q% O. [
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?
0 V/ W3 ^2 X; r: ?..., b' c& F" S) }5 b: d
User : Microsoft 2022 Annual Report! D' X: ]1 W# s: J
...
7 t, Q: D- o! p: A5 eUser : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?( P! z$ X \9 B) N* U/ h3 N
...! X+ J+ j2 |% K/ h! z* ?, T
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom: `) x1 Y1 Q9 K* k0 I1 P- x7 z
...
: r1 b$ a! b2 E3 f1 b7 t: mUser: 您能否从Nvidia的报告中提供更多财务见解?2 a* C! b) c I( e) `
...1 E) A, y7 q7 x
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
/ @9 s+ p; ^3 H7 f$ L....5 n% M9 y- c1 @
& U$ W3 f) N1 K; w- qUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。0 F; A5 `6 d1 o6 ~
...
- W% G6 Q4 E( f' A# B6 t7 UUser:预测下戴尔未来12个月的现金流。9 K+ G" k" {; B* S3 U
% h, p/ J; [3 U& e! ~这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。! C* d+ C8 t& J! I2 e% U5 Y V
$ S: B0 u* b/ C' j( L% j0 d
适用场景对比& ] T9 _( S3 N3 C/ B( k
价格对比4 h! X" R/ P' W* O$ }
OpenAI的相关报价看: Pricing
& k6 U( U+ F! t( m x! [9 x
7 z2 w+ e- Q2 i6 F" T3 n对话类:GPT4远远高于GTP3.5。
$ O# Y! ?9 r( ]- H5 }
$ S7 `8 n; H$ l- Z; x2 Y
) C% T' a, h! S
! m2 Q; }: f' |2 f& d* ^目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
1 J- K, f% W# W& V3 D/ L7 j4 J$ J& q. E; H; }- J1 Y
% [% I' x" q- u( O1 P3 R
; {, _" \2 ^, g, Q
9 k- `$ X+ |; J3 z# W0 j+ x
5 w3 k* R- Y. M! j$ y* n4 `' l
; t* j i7 M1 {GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。, G; M9 w( {1 b5 z, V9 Y( t
4 P$ [( [% _" e6 t# C" @而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。/ B* b1 g$ L$ H6 ?8 J3 u7 t" Y
8 w" |% h1 A7 n4 L
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。& O9 o, j- r I) E. n6 f O6 ?# A+ H
' t. F( l/ b. s( h8 A2 p
长度问题
$ C- {, ^9 L! `; E+ \. U# ZChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。. M) H/ j3 Y3 @6 r3 m
, U1 u$ A) @- `& k但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
: J. k3 N. O6 q; I1 |0 S% T6 N5 a1 g
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
" i9 u( s$ W% A% F4 u. M% m
7 v. ~( w* h7 t4 O当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。3 f' r4 e/ D" y, C
) o/ z+ V3 X! M6 `8 F0 O% z聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。: P9 ~9 t8 t8 c8 U( _) w
, a1 g3 Z# h: A i0 r比如说用户提了一个问题:
C3 R }7 _( N+ l: |/ t
3 y; Z$ O& J( H( J- u9 P8 W3 v“What's the makers's schedule?”; N& R6 A: V+ _* m5 O0 G) {9 }
9 W/ p- C% M8 t7 Z# u从数据库中检索到相关的文字段落是:
/ o/ R6 i% C* s& G% `
% w6 p8 |" f. U6 S, _3 ]2 F6 F“What I worked on...”" W. a& i" g0 l5 y0 E
"Taste for Makers..."
$ I' M @+ p9 l9 p: _$ S: B" ?$ s) p9 p& J E8 [
那么最终的prompt看起来就像这样:
; K/ x! I! Y8 Q+ } O$ Q
( r# [5 r" s9 u ~; B: q
- P) z1 Q i. z2 c[
4 z- `7 z: r+ J& h {+ V6 l G1 g6 Z! a3 S l
role: "system",
$ e0 E% b# x1 ?4 H 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 j# L& S5 W0 u7 ^: g( u },
: {0 |+ w* X! N) p5 _ {
- N* x, A3 [: a. i role: "user",
( S. j3 C6 N6 X content: `Use the following passages to provide an answer/ n$ F/ q2 {6 ^+ u% o
to the query: "What's the makers's schedule?"
9 l! b% }( s' F9 X1. What I worked on...
* x9 E. u5 q7 T( v# c2. Taste for Makers...`+ |( f+ ^: S H
}
" b& _' T0 g- B. Y( ]9 W# R+ R]
# v- Z% p- b7 U
% H* I2 g. J0 J- S& N* m
; F% Y2 T: P# h" a$ H; B3 ?( q这样ChatGPT在返回结果的时候,就会加上你的数据集。
9 P$ @5 l( j# B# b
; J% k* o) \! P6 N9 I8 u2 l! X6 C具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.9 G. n. [) ?+ q: x, P/ J
- k, @; M. W6 G# N总结& f4 |# t! H+ N$ y+ |. `
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
( ?* O5 e& W$ `$ Q' ?8 H, r9 L! d, Q% i( g6 ]
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
, F8 c5 o7 z, B7 j& g
* Y& C# N$ H' F" Y7 Z1 ]; k, L: P参考
1 n# D' @; Z d# k% A" p/ j3 E3 m- @如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客+ Z9 D2 c, Q, t$ T0 Y3 J. ^8 m5 Y
4 _) ?( @3 [ Q/ C- O, t搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
# O( S: U; _" D4 `0 r# {
* W' O, ^. H8 x+ a2 n3 c* a9 `( o5 O5 P8 u1 u: O5 Z: s
————————————————$ j6 ?4 J9 e# j& D3 F3 X5 S
版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 w! o8 [: Z* l/ O5 c/ Q w I原文链接:https://blog.csdn.net/ghj1976/article/details/1296761578 l! B. h8 {- `6 x. T* G( F2 N# ]
|
|