|
|
+ }1 v( I U( {; E, D
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。! }9 ?! _7 W; S" Q
i" q+ U& N) j9 A, L, d
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
: T! V' F( y2 D% O# U" |( {
( C J. \$ b+ V$ H我们应该思考如何让AI在专业领域中释放更大的价值潜能。, ~2 K, u; b& s; T4 Z
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。% K: S& w; ?1 Y' K( _/ l
" H! v0 }/ D# M, p以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。/ ?; O$ E: T2 h. m% R+ G) `
. Z- G4 @2 q6 a6 O3 ]6 B, H
5 B ~4 }) a& a) R* b
4 `: G! J) U; w+ J# P/ d4 Z y% g3 {/ i) Z! f5 i
* B' O. ?$ @8 X( c4 _, c. `$ ]4 V! z
, U4 m. h7 C, @* M2 h6 b6 v' {" x一、微调(Fine-tuning)注入专业领域知识
! m5 |+ ` `# p. F; v' R( H微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。) C. k) E& K" S" Y
0 A5 R: s/ e! f; _传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
* y/ [8 s* j2 W) S1 K9 f
1 R {. V8 b# r8 @如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。, t6 z7 c3 E2 Q- U5 c# j
5 ]/ }' f% B2 w4 |# `" P1 J1 hOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。! n/ h, n& {( ?6 F- ^" z5 O
' t! T$ ^' v3 ^6 b6 x
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
& X1 {. G6 C* Y7 l. B% C! @0 l( c0 |/ ?. t( F) | p
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。) E& p4 X5 x' L2 n: X7 _: n
) K- c8 S. A* J# c& o
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。2 C+ U' ?% w6 ]9 [- H
9 ]2 t: a0 U$ E1 p- K8 ?* [下面是一些数据例子:
: a: n. e3 X3 ]
7 G4 ^/ f) n/ O1 ~6 W H% V$ \2 R# o{
' t/ P9 S l4 c5 [. T: y "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", - o7 V) D& [: r0 e H5 F. X
"completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"3 a$ ?# F& j5 p. z# w: R
}4 j# |. S. E q
更多的例子可以看如下链接:$ d. R' b& m# p' x
j( M4 W3 v1 m( a' q
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub" {: T% P* I+ Z2 ^/ W' v) `( @ [: g
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
3 \1 o. r4 R/ ~/ L; k x要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
! b- l \ _- R& `: N, [; J0 v6 o6 u1 {! e( P. f* Z# X+ i
二、在Prompt中带入知识
6 z) O7 M6 C" a0 E只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
: g6 h: d% G) A% }* z1 p
+ Q& }' i6 k" g& F输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
. Y# K* U. d2 x' t3 M& s; b" T9 {/ ]+ l
5 X- u+ l3 F0 [' z下面是一些例子:
2 n1 t; l# h2 Q' }% F8 ]8 G# K0 f4 t/ R
例1:作为专业DBA,回答SQL相关问题6 x0 Z: o# h4 o% c; }) j
这里在输入问题时,引入了我们的数据库表结构这个专业知识。
/ v& D/ E# ^" E# ?
) ?2 V1 C1 f, f: P7 ?问:
x' g" U$ Y0 A2 k s/ N6 n
' q$ I r+ _% q9 t我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。2 B$ ], Q/ g: D0 I3 j
( ]/ c3 p6 r' X! K+ \1 ^
我的数据表结构为:
8 d) _8 n% C% ~5 h
6 ?8 o" B7 c! j5 J3 LCREATE TABLE `user` (
3 U8 T4 l% W( z`id` int NOT NULL AUTO_INCREMENT,. U- U7 a1 \4 ~' N+ N
`name` varchar(255) CHARACTER SET utf8mb4
* a2 O* t) O/ h, W. R4 M COLLATE utf8mb4_unicode_ci
$ f2 ], g9 i, [$ @. { NOT NULL DEFAULT '' + x' V& c8 U4 A, o
COMMENT '名字',
. E! Z% O7 _2 o' s# [( r9 n3 B* WPRIMARY KEY (`id`)9 K2 r# X: N/ A' x! _% r
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 3 C/ a5 f1 m, x0 F( Q P
COLLATE=utf8mb4_unicode_ci
) [0 S- `7 f/ [9 V! C( C COMMENT='用户表';
7 \8 [, U$ \2 X# o我的需求为:根据用户的名字查询用户的id0 N7 }3 h7 d& X2 B7 z
8 z5 i- f& M" [! d* p回答
+ [8 ], O6 Q: u7 U9 b0 x7 W
5 l* H+ G& s) b# s3 d- f3 R好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
# N& @" @2 S+ i( h, |- J- e' a! \! D% `" m( T; v! f
SELECT id FROM user WHERE name = '用户的名字';& N2 T. \+ M% H! w
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。( _- |- {* S- H; Z$ A
9 I3 J" v; o! b! p2 I您可以使用以下SQL语句来为name字段创建索引:7 J# A% u0 c/ F g6 ?* j. h+ t
2 C* B+ A+ ^ ?9 F& I( V( g' vALTER TABLE user ADD INDEX name_index (name);& e' n0 W8 i5 o1 H+ f6 |
此外,为了保证查询的效率,您需要注意以下几点:( L. A9 B8 E, {' B3 u! Z8 e
- d0 T5 ~! g0 w% E" U
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
- l- A. @/ i3 r, n( b
7 @3 M3 K7 @. u1 f% V3 f如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。
7 U- R) j0 f7 G7 g
' ]' I9 ?7 e3 q) G( ^4 z& C例2:智能客服% Z4 K) e% V3 c
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接: R [. x' X9 b' S. O
3 d. K, X7 F, _+ W- t" M
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub4 u! A9 t. a3 `( ?
+ h; m l {1 X$ h* O/ ~% w下面代码通过消息对象的数组注入了一些上下文知识。) i0 @# \7 C& r& y8 `- [5 S7 [
' h( H. f+ E2 _7 {; s+ S8 l9 k8 R
) K) ~. c, i: `- }2 ?# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
2 G; @" x! Y) ~import openai7 F' I( `- u. m
( N- y6 Z6 I2 P# i* G+ |7 ]
openai.ChatCompletion.create($ j& `7 J8 J; }4 Q7 K4 [
model="gpt-3.5-turbo",
$ h4 f: V% h$ c, }6 L- @ messages=[5 W: h1 \9 i( N' }
{"role": "system", "content": "You are a helpful assistant."},: `7 u1 m4 e. _: k& a( i4 ^/ t
{"role": "user", "content": "Who won the world series in 2020?"},) V. T+ B: c. N. O# R' l; F( b2 R8 o
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},4 A$ K/ w/ S) d& C. {: k4 p0 {
{"role": "user", "content": "Where was it played?"}/ N/ J# f- n3 P5 \& E6 X
]2 Y' U" Q3 j Q! F7 z# J
)
) q, ^& d" l, M& ]7 q- q, T
7 ]$ b4 `' W$ c! x6 ~其中% h( e! e8 F- x
, k) V* r$ S9 L& F: X6 w系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
& |6 `: N6 W+ a! E用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。2 d5 s0 R" u- P k
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。% }: h% D1 p5 c) @- x
通过上面的方式就可以完成专业领域知识的注入。
% f) S; L4 x! b" m- L- @" b8 i5 s+ O+ Q) Q/ E, b. m5 T3 u% |
例3:通过外部链接把内容带入. j- B' l' t; D, W+ t
下面只包含我们发起的对话部分,会话结果比较长,省略了:# b) w4 b+ m; h v- x: n) o
g: E& D) n. xUser : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?
4 T5 R( i2 v$ i...% V, F2 a+ d2 p3 A Q1 E$ q6 Q
User : Microsoft 2022 Annual Report
4 l- r5 V& c" k- ?% N! R...9 C8 h4 h/ h; Q( f
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
6 o6 ~% I4 @# s2 q3 z, V( g( ]8 y ]...
. F' q# b& w9 t# k* F rUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
5 d$ W4 F4 |5 \8 ?! u...0 F( @0 g5 c) Y
User: 您能否从Nvidia的报告中提供更多财务见解?
! i9 w' _9 u: H& u; L.... {$ o1 [. u* E: C8 H
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
( w- \$ C. x. |; ]; \....9 ~4 `4 _/ ?& e& i" }
- o0 g+ q7 w4 a6 H& OUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
/ r3 M0 M& c3 i* ~( |...8 d" X1 N \% S- l" I
User:预测下戴尔未来12个月的现金流。/ C( E! v3 T6 f6 w
0 N4 Y( _/ K- e9 N. r8 a! a6 ?1 m这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。0 _% J6 M: H# ]; P
* z, K$ j) s, M+ @+ x适用场景对比
. @# Y4 P' i! i* N5 x X" z价格对比
' w; ^3 ?& `3 G( _3 J3 `$ \OpenAI的相关报价看: Pricing3 c1 ]$ g4 q/ }. @! |
7 V4 r J' j$ E
对话类:GPT4远远高于GTP3.5。
( L! e% c2 a u5 N0 O3 {7 |
: _: o' K5 J9 _ L6 S3 s
# g; X* |- `3 E8 A
) \0 J: z% m2 A: Y5 G3 p% ~目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。; |. i# }, x1 A9 @0 ~" a
2 q) @2 H% E2 J j6 g$ {
9 {* y: T: q& m2 e$ ?" r6 c( K
$ y& n: s/ L6 f; q* c! j
9 f# ^+ a5 a0 T
" v( {$ Z8 t4 ~ y' B
0 Z# g" I H3 ^7 `) q$ ~GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
' q: C5 M- U0 E7 m) M$ ~+ c
7 q! H/ S5 c* A, T) _而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
; m. z/ Y- C* f/ i- k) \4 u' X" F- y5 \$ J6 G
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。) v1 o% u+ V/ v% E
; B# J8 b9 x& c4 H# S8 }
长度问题
& N9 g( a% _+ P: N) \+ _9 l( y4 ~ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
: u: L5 n0 y0 R- W7 S2 X' Z: I, @4 f2 s7 k8 F. o5 t0 t
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
, \# N2 l6 R+ {- f. r7 \# G. x
& b, i/ ?( ^0 C7 n, K3 k* ~& w首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)& } j A6 i; U8 p I: A+ D* r
* q- r: m2 {6 M当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。4 R- N) f- U( S+ a! V9 }" s. i6 F, q' Q
5 T$ d" I; d. Y& w8 E F聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
. Y6 G2 I. p5 e) x/ [9 X
/ g- j7 R1 p, o) A; L比如说用户提了一个问题:# N# Q% L* y# Q0 n7 \
4 ^3 b( Y# T4 z( P“What's the makers's schedule?”
5 S; _! P( t# G. x. }- t
0 ]: e8 F% W% d: ~从数据库中检索到相关的文字段落是:8 h8 `# _ a- r& j! s. P
% C6 r* m J1 N$ j3 S% D
“What I worked on...”* @/ A3 f4 w0 @/ R8 O, Y
"Taste for Makers..."
- k( s2 e; {- w* O' E7 q
; ?+ p6 e5 r3 g4 M: |3 z那么最终的prompt看起来就像这样:
6 |5 B3 D/ Y( J" K
5 w1 ]! J: c7 M. W& \( D% S8 D
8 m* i$ W3 j4 |[5 f* b& R6 v/ L# V: H8 @
{
+ C3 B! G7 N9 u# P role: "system",1 p+ |0 M G; @6 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."1 i4 e0 ?8 J' G0 F/ H) s: n
},0 W% w2 p: c3 x% H$ J% K. ?2 i
{
1 v! ^4 r: W7 [ role: "user",
, r1 H4 V" \( u& v content: `Use the following passages to provide an answer
9 D$ d3 h' |$ e0 A A& Sto the query: "What's the makers's schedule?"" }! c* X) N1 X$ ]9 p7 ^* x- ?; {
1. What I worked on...
/ k6 |! L5 I8 V3 |. h2. Taste for Makers...`) Q4 l! L/ n, u
}5 [5 o2 d: a1 F
]
# Y* G8 x0 i1 }) ? % ^* a1 l1 K, n$ P5 P( T0 i. \
" S9 q; x2 G. r5 l
这样ChatGPT在返回结果的时候,就会加上你的数据集。+ R- ~* y/ G9 q7 R! e
% |( T! c1 _$ m- e( u- l具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.
, z: B4 Z1 y" S* G
( i. H9 I5 z* k8 ^, l总结
- W5 N3 Q8 ]3 |7 [大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
4 g' f2 Z# I0 Z7 l$ l+ ~4 X6 `2 j. D( p* \ K
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
- Q6 `# T$ t$ h% h: L
" G. C+ P* O G) V1 f9 c5 A( u参考
! J" T0 b7 P) a- @5 z- \0 r. ]如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客
* Y2 |; a% P f/ |0 g, h8 x
7 G y3 Q, ]% y搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
O: o1 j! V/ p
2 O y9 J4 y3 R- |) u8 U: `( C7 Z: U& F6 }* {3 w3 n
————————————————
; \5 N1 G# ]# L+ n3 Q* q0 Q版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 I9 A6 C' o' _- q: \: s2 _
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
1 E' t0 F" e: v- l |
|