|
|
" k& u7 u5 E4 P# o, R* e
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。+ g- u: p- u y1 ?0 n6 g( a% {: P
& o& R( W# X. g3 L
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
6 v4 G1 l& m1 q( E3 Z( B
* p* P& A1 o7 c4 t我们应该思考如何让AI在专业领域中释放更大的价值潜能。6 _( Q) P2 `/ l( X+ f8 V3 Q
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。# |9 X7 \1 ~& A
j* h! M5 T4 g! s' [ c
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
3 p3 ]5 F$ H# ]1 O% X/ z' |' F6 s9 J5 z
, P+ Y$ t; e3 X J. ]- n5 Z& k
1 O5 h! J; ]& Q4 |( e* K
% Z' b5 F, b/ [# |, |7 ] % g- a$ s5 V% r, _
/ O& r( ]* U' U) P: B一、微调(Fine-tuning)注入专业领域知识3 s* N1 u6 a8 l# Q1 M( T. K
微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。& O3 H# G( H. y8 \- L
& G. O7 X" X k6 Z2 n* a% r传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。( d: |1 p$ p' V/ W$ q& ~
o1 ]' Y5 F. L2 u1 x
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。+ b `% D9 U1 K1 g& A! ]) l
E+ F8 q6 w4 X0 q# YOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
: i! c) ?, w: T1 u
, e9 j/ T& J/ l7 L" W! K从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
4 ?+ e; e5 H0 c; `1 W6 R& K! J( m0 @4 o% e1 q
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。+ z) G) |3 w$ p! ]: g( x. z) ^; q, S
4 p% Y, N0 z! c+ G7 E. B4 Gcompletion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。' n" L; s3 X1 c# S
5 ]: |4 M$ w2 d3 M* Z Z
下面是一些数据例子:
2 a2 K4 W% w0 w, d. ~3 H* E
! [# N8 c1 [; o( _) v$ c! W! F3 t7 F4 S{
, b8 w- W( G! L# Y' i5 i "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", 6 O' L. x+ L, @- R
"completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
& u6 u8 r" f2 k}
' [8 u% g5 l% `- v5 \更多的例子可以看如下链接:
, [3 {; h' ?+ P' Y) y0 I( [" i* c1 G/ ]# B3 i* }
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub$ \" R+ U( X4 ?- `7 Z
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
! N& K' D5 ~, `; k要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
# S5 u' k# ^. H6 S( w+ p# _, O4 E; r) k
二、在Prompt中带入知识
% [1 N W: q2 s6 c) N只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。* v% n% ?) j$ X, F
6 O# ]3 r9 d1 Y+ b2 ?( M1 ]+ }输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
6 ~" v0 X5 p# c* Y2 B0 N q) m: }6 Y! l" P7 z. {$ @: t
下面是一些例子:9 l9 [- ?) t. N. O( X* M7 y8 _
3 Q3 m- H- m0 K: t例1:作为专业DBA,回答SQL相关问题2 m* E+ R2 M& X! c- h- O
这里在输入问题时,引入了我们的数据库表结构这个专业知识。: B+ D+ d! g3 a; O7 {, w! A
" F/ M2 u. Q, y* }9 k问:
9 Q/ v# n" B- D- \; d& G+ I# s5 D+ @. K6 r2 ?0 A
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。" Z$ ^7 o4 a, v
0 z8 g a+ N8 Z" U( a
我的数据表结构为:
; g/ Y, i) u3 o9 D- H; [7 A0 M6 N$ i) K; U; T4 y& Z
CREATE TABLE `user` (0 w! j1 y) {3 t' c5 O6 G
`id` int NOT NULL AUTO_INCREMENT,' q! |! V6 l# S e
`name` varchar(255) CHARACTER SET utf8mb4
- R4 q6 C( l9 E+ C5 v: x/ G COLLATE utf8mb4_unicode_ci ; m6 V2 ], H8 D3 u3 h; o6 ~
NOT NULL DEFAULT ''
8 C$ W2 e% O9 T; @4 t" Y( K. G, ` COMMENT '名字',
. Y! y5 q+ _3 l1 |$ j z. z7 FPRIMARY KEY (`id`)
/ H Z8 T$ U2 `& q s) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
5 u6 l1 E, X) ~ j/ U/ R COLLATE=utf8mb4_unicode_ci
' j8 c" } [; K COMMENT='用户表';, R: K4 p. x$ F9 L
我的需求为:根据用户的名字查询用户的id
" M7 Y* @8 C0 S/ {4 d9 K; y$ j- z: V
回答$ q1 Y+ M: t0 p% |2 m9 n
4 F( ^: Q, J' C4 u5 y好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:; J' a" z9 i0 K1 E% @7 l
2 _- w" G0 p2 W, ^1 [
SELECT id FROM user WHERE name = '用户的名字';3 l% K1 v( L$ y& h
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
5 m7 a: P, L& Z2 x: n
! a) B, E& ]1 e1 S, V* [您可以使用以下SQL语句来为name字段创建索引:4 l! {$ `. ]. O
|- X. w" U0 E4 S
ALTER TABLE user ADD INDEX name_index (name);* k$ F! N, I6 }: ^2 k1 r
此外,为了保证查询的效率,您需要注意以下几点:! }! k) `- ?7 n; u$ I- r
0 Q/ Z5 N7 Z$ E L3 {/ O6 ?
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。7 B, c- x9 }$ [
- w6 ^! k: ^! j
如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。
. i% A4 a( O2 s ]6 b2 L+ [4 [6 ~8 i% e1 p7 h/ f/ f
例2:智能客服7 h/ G3 K, @( L F& m$ ^' t3 r
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
3 k; e, h' ` g* S$ n+ K
* d2 t3 e9 }) m: Hlanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub+ W& F- {1 S5 b6 Y4 F' L
( {- c2 }( c: ^. _
下面代码通过消息对象的数组注入了一些上下文知识。: ?1 u$ n# z& w! v4 l0 N
9 Z) G R# Y& t% Q % p- w8 y( Q2 O! t$ x
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
8 ?/ d- f- k" Z9 F6 S1 _+ `8 D3 F. Fimport openai" T5 a6 |' b6 _7 W2 B1 {( }
- ~: L1 ~$ b" A; a/ Ropenai.ChatCompletion.create(. C8 ]; x# E2 o5 N
model="gpt-3.5-turbo",
. X" @. @# o8 Z2 l4 ]( s! {7 L messages=[# O: u1 E/ f: H& w9 F
{"role": "system", "content": "You are a helpful assistant."},
/ t+ A9 X6 s; e( V9 G6 @6 C {"role": "user", "content": "Who won the world series in 2020?"},
1 N4 y: f* s( B9 p/ [+ R {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
, S& H* i8 g7 o9 N% u {"role": "user", "content": "Where was it played?"}& x& }9 w$ s; Y. Q% h
]
& W& c3 s$ y1 V; P4 D)
6 [* d) r% Z6 G: p# }4 J: L
) f! f1 o2 T4 k5 f3 N其中& w7 `2 \: f- @( K, n0 o
; q3 E9 Q) z! }系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。: b! n3 Z- `1 k' P+ e$ W. d
用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。* ?. [. {# }% y6 i) j( g% n
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
( U3 n8 ~) U' c/ W通过上面的方式就可以完成专业领域知识的注入。: A1 H- b, u# s
. e7 X* E$ v5 ~2 Q9 J" |; M6 p: Q
例3:通过外部链接把内容带入8 c, s4 Z9 v8 o, |2 d$ a
下面只包含我们发起的对话部分,会话结果比较长,省略了:
+ _& T) U+ m* C& P2 b2 b( o$ c* N5 I
! K9 U3 C( F: i7 i& s, O" s MUser : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?2 C9 ]* n$ _' g0 m
...
# [4 r4 p4 V7 b2 C, zUser : Microsoft 2022 Annual Report, r! P) H, p5 s5 }1 Q
...
+ T8 p$ @1 Q. ]4 Z8 s5 Y+ A3 t( lUser : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
' q; ^! x [* S# Y3 }...
]5 g' N1 I; P6 o+ }6 yUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
' \. T0 ^- ^+ Y...0 j9 C' { ^* w( t* Z
User: 您能否从Nvidia的报告中提供更多财务见解?
/ L1 Q4 i/ u, C' Q# Q0 h& M...
/ ?6 e. p5 K5 s9 Q0 NUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
% A+ T; H6 y# t$ K+ N# ^9 ]1 w5 |$ C- A....
7 M4 V' D/ y9 s. ?# U: o
# ?+ b2 @4 ]. K% ?1 u7 dUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。5 l- r) B$ @! H, z2 P% i" \; t
...0 t: t. A/ Y* [) _+ t3 ~+ q
User:预测下戴尔未来12个月的现金流。; |1 f5 }2 s% m" ]: D4 J
6 A; f/ u5 Y. v* c, Q6 q' Y* p这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。
' W" E/ T3 ~# u2 L- b, x
% C& E2 Q9 d% K& G8 r) f) T1 p适用场景对比" T2 [9 ~/ I& o7 n; _. U# \* D
价格对比8 E7 V! s$ {; Y0 J6 J0 s5 W
OpenAI的相关报价看: Pricing8 K7 W. W5 E( b- R* ~( \
/ f7 p- d0 Z3 a) k( ?5 M
对话类:GPT4远远高于GTP3.5。# V" Z2 C$ P; _( ?% v3 g
5 U4 z+ _) n2 c4 S+ E' n8 N2 l' @ v0 v% m; D4 X; P% k$ R+ n' F
$ i. t9 o( G" R( B" `+ ~目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。1 G& r- f8 e$ |" m1 }6 I4 ?
8 ]# d6 z& n: J. b {# e$ C
7 Y6 p3 ~4 \: V5 H
4 \, H2 H! ^ E( I+ |' C; Y$ h
' n5 Q9 V2 b7 T
; h, i( g+ e' a4 E% j" o3 O0 H" U0 N- \8 \* ~% h6 W3 Q
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
3 Y8 t1 y( Y: q& B; f: W% I1 R5 k1 d1 p: D
而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。6 n+ L; u- |9 C2 ], |; t
8 `* }5 O& D% d( n/ x所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
) v U- S/ Q4 |5 X/ A7 p! D5 h5 t3 V W7 _8 _2 \0 \
长度问题
" q( D+ C, P7 r6 mChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。! W( g% q9 Y: p6 ~$ h% N2 ?
/ `( p0 C% ]- z( T- D但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。9 e: x; [9 r" W! v
' `( t- K6 ^' } z* l9 q7 J首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)+ j+ v( _4 h7 l- Z4 _
1 B0 j! w; ?( L- g; Y+ T: k/ p4 c# r当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。+ y1 p9 s1 }$ W; F8 @; d
; p$ V0 |( i; w6 \9 o$ q/ r
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。6 `+ h0 C9 o1 \/ F7 l
# G+ k' O5 `6 b t. ~6 W
比如说用户提了一个问题:
" T( `; |; N: ^" W. L! z/ w% O2 J. _6 e$ [1 e
“What's the makers's schedule?” E+ x$ Z; t7 u" e6 z' P! V
. o3 t* E1 [9 h7 P ^. |' _/ O! n从数据库中检索到相关的文字段落是:
+ d1 l Z% z9 Q. I# f, y
8 q5 |6 w% c) W' V: [- Z1 c“What I worked on...”# B% O2 a& u; t
"Taste for Makers..."
; p {! d" [2 A# n* k" f, o2 V/ Q. E z2 G1 C) N* f
那么最终的prompt看起来就像这样:4 ?/ Z7 K/ ]' E
4 P6 H1 c3 G: c c8 X* J5 m
. F y7 }; J7 f) t- G' ?8 L6 i" s
[7 K- E0 |( ?" D" E7 [% Z9 t" O: D
{
. ?/ p' `! O% @6 ^2 ^3 X" P5 } role: "system",
8 r1 M$ ^) ~7 n/ l$ M6 f. V 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."
( Q1 h4 c0 m$ c; `% Y5 ^' ]- C },
7 y* H) m' S: G6 p( g6 W! n {
) l: U( @% q. D4 F5 Y role: "user",. p1 G$ O: u; {1 i
content: `Use the following passages to provide an answer
- Y% `/ s* M( h! h' a4 `to the query: "What's the makers's schedule?"
N! `7 |/ U6 p' m0 [8 n1. What I worked on...! y5 I' |1 d' ]' R; \" x
2. Taste for Makers...`
1 t( S+ B D( g! H: I+ f! g# h }
! Q/ W# B. W2 N9 K) b4 {+ B. ]0 V# ]]2 C6 |7 @0 k; }. V$ }" e/ S
|7 i! R8 N5 t
' i% I: G" b* S9 |) X
这样ChatGPT在返回结果的时候,就会加上你的数据集。/ G7 [- `" R4 d( E4 B
/ t8 I# W/ b% q3 [$ U, @% @
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.' ~: X* }( C6 j/ B
+ M! t* k1 I2 k& ]5 z+ ^, [1 \总结
' f( c% m5 Q% v4 K8 h) d大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。0 E8 ^8 _( x- {
9 }/ T! r' u m, l* c而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
% t) R) S8 t: _* b; [5 r2 s+ d8 i+ U5 ^
参考# E. U0 P+ E0 w0 U# f. H4 ]8 W
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客$ U" ^+ D8 O0 x- [
9 y# p1 D& W9 i% G搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
f6 D& p Y7 w9 ~" X; A m
; `, m) E/ d, L8 i# T: w+ H/ ~4 }: |& y. i/ r. G: b
————————————————& g; _: f0 P; m, x
版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* M4 f/ t! k& ~- [3 w8 x7 P1 F% T; k原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
4 L+ V+ k! X7 n+ J |
|