|
" L+ f6 V* s$ H! ?ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。4 ?0 [6 T' @# B9 m* B; v& e
2 W9 Q( ~1 P$ m4 ?# `
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。9 b2 s; `9 s' p" V5 J
6 \1 S2 s" Y5 }5 }: N
我们应该思考如何让AI在专业领域中释放更大的价值潜能。
9 e; l4 }, O) Z% S. x! I就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
O3 z8 `- c" K- @/ Q- `3 I9 x; Y" v% s4 w0 j' C, `# \
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。* ~2 Y" o+ Q" V$ M. z: Q& c
9 A% {: w( q& @6 ~$ m) k/ V) E) P$ t W* M: |" ~
3 l; i/ ]! a0 Q" W2 {! P4 Z. Y5 L6 j4 m9 P7 _* k. z
1 v4 K' f$ x" L" G4 c) k% u* {9 T2 G" P
一、微调(Fine-tuning)注入专业领域知识
5 D' U4 T- F% e, f, w# v微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。6 g! Q. q) N0 m2 g' W0 [1 U
' h( |8 {$ ], S. F- C
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。" O8 G; j: S* I& y$ r6 B
4 v1 [/ x. w$ F" W9 [/ S. c" t
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。$ N- r1 G. R) n' ]
7 o/ d8 t* n) W, l* o3 w8 HOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
1 x* q5 g+ ^2 u2 O. ^+ q+ `2 j' ` y* @
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:# I2 T0 i0 l6 i* y6 l0 g9 T
; n5 F7 W) D7 {, L0 q- ~prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
, C! ] V8 C0 j( i9 I( O" s
( P- p2 b) h7 Rcompletion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。3 f/ [/ S; f1 W5 z
# l4 o+ |2 D# i( x( m4 h
下面是一些数据例子:
- _ j+ ^' T" k# V; ~9 Q: q: i4 i) t1 N) _+ n! d' q- q, Z
{
; R% L& J1 q+ G# R "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", 6 l5 e6 I" b" ~9 p4 j
"completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"" J! m5 Q* G1 u7 G6 f
}
1 y% ~6 }' Y2 {+ a更多的例子可以看如下链接:
X0 M1 n/ Y8 @' o+ |; r N! W9 \7 n. @$ ?& W9 ` [8 p' ~
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub) G2 ?5 x J, N3 k* h( Z" x& b" T
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub* ?. }1 |( R( ~
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。+ Z, m9 U( i- q8 z% Q: M9 r
# S+ n+ v0 L$ W- Z. v9 n
二、在Prompt中带入知识, ~7 v. s7 Y- y
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
( i0 s. g5 b9 Z' I
1 e/ M: [: a( G) h' h# V输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
! E. P0 t2 ?. t& _9 Y! y" R) W% T7 L: b3 F1 ^" V/ x8 ?+ F/ j
下面是一些例子:( O: X" h3 r3 m0 X' F8 s
: l- n. T" v! x( ^1 |例1:作为专业DBA,回答SQL相关问题7 f6 @5 h$ V5 S. K( P2 C8 j
这里在输入问题时,引入了我们的数据库表结构这个专业知识。0 B; k: S6 R2 T0 X9 n C
# s/ r6 m+ i) Z7 M3 h1 W' d
问:. f$ n, f/ K" Z/ L+ K
9 s* P5 |7 P7 x. r* e) ~
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。
* T/ l# d# E, c0 `1 N2 Q( V
7 D+ N' Y/ q7 X5 r" E( R' x我的数据表结构为:' y5 S: I O/ n) L! l
; h9 d- b- C2 M2 j
CREATE TABLE `user` (
2 K+ D! ^) n1 |7 B9 w`id` int NOT NULL AUTO_INCREMENT,8 q4 P/ u, J9 G9 p
`name` varchar(255) CHARACTER SET utf8mb4
# q# P5 p; K& V COLLATE utf8mb4_unicode_ci
/ t( g* ~! f) C- @, ~ NOT NULL DEFAULT '' . D3 U; S8 Y& U1 m0 ~
COMMENT '名字',
# o' Q4 n# Z2 g& A, H# ePRIMARY KEY (`id`)
9 j* M9 W, R# M# Q4 X2 g) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
. A' C. A8 Z2 k M COLLATE=utf8mb4_unicode_ci
+ K" v7 ]* k2 w COMMENT='用户表';
9 I5 Z6 s' F# ^3 ]' k# L; C' M+ e我的需求为:根据用户的名字查询用户的id
, d; y! m% k' f/ I+ O' s* r7 o; V; R6 m# Q" v" N* N8 p) u- F
回答0 K% w x0 w% F8 f5 t* O5 o
5 l/ W, F, H4 Z; X" w8 ^; I7 [! B# W好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
9 w7 s4 Q6 ^4 V2 ~+ y. X
9 N; I- p0 @5 P! b1 YSELECT id FROM user WHERE name = '用户的名字';
0 m( l6 l9 U5 u0 @3 l- |( Q5 a: U0 |这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。8 e# ~' T. U) i u" {+ T" e: s
2 @" u' s/ |6 i7 t3 M! k
您可以使用以下SQL语句来为name字段创建索引:& r+ B7 v/ _6 P
6 k* o: \5 c5 C4 RALTER TABLE user ADD INDEX name_index (name);
8 T4 @2 ~6 b& ~' T7 I& b4 V S& ^此外,为了保证查询的效率,您需要注意以下几点:& @% ?; t+ q! q- W
. K% |9 L, s" Q数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
6 M( x, w9 v; ?9 L8 R
4 n0 L8 D! N. O( ]如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。6 r4 I% s& y) }6 V5 L$ n0 z8 p
+ d& n; S- \$ z例2:智能客服
% n4 e0 k/ _+ E: E( C. r* a2 R/ ]% t比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:" J% w- W6 c. \! R
6 K5 h! r2 l- {( R$ B
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
+ w% Z9 @+ w0 `. k) I& a
9 _, C) E/ K1 X3 D* [, q, C下面代码通过消息对象的数组注入了一些上下文知识。
( w- X$ Q* V! c3 O+ X5 c: t
% W0 A/ O7 t ]
0 G, v& X5 N7 I# Q) ^+ j# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
; K9 T6 Q% `, C/ vimport openai. Z: o9 d% }1 U! V1 P |7 C8 S
# w, H7 d* {- o0 Z& n7 B& P: Qopenai.ChatCompletion.create(
{+ Z" E- V; x& P) R; F2 X4 H model="gpt-3.5-turbo",
- J! {' S" z9 P% O7 t messages=[
" L) t. }' y; W$ G, Q/ N( o {"role": "system", "content": "You are a helpful assistant."},
# _; Q# ? t, x e# Q8 Z# h {"role": "user", "content": "Who won the world series in 2020?"},0 I! ]; w( g/ J9 n* ]+ Y* ]
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},& W: t6 ^! h7 ^- I! B' T1 G
{"role": "user", "content": "Where was it played?"}
, i: j* d3 d) i+ \! j1 f, p6 A ], k- |2 _4 C. Y9 h' @& w
)- p4 j7 [2 a- a0 s( q' t
0 u1 i& z' N; |0 `* Z* c+ K# |其中3 G& X% y# E: |' ?% e9 ]
7 M* x) D" ~8 k7 F: U系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
) k6 `4 X! S& W7 b. S1 C9 C4 u, h5 t; [. [用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。
, d0 u7 b3 ~0 ]3 ~3 C助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
/ {2 h! ?$ u0 c! y g通过上面的方式就可以完成专业领域知识的注入。
4 T2 Y3 r) Y: I7 D6 g. B/ n
- z p, S' o1 j$ T# }& K- i9 U例3:通过外部链接把内容带入( ^4 [$ L# Y" |! H) a( ~' n& Q
下面只包含我们发起的对话部分,会话结果比较长,省略了:
' G+ v; T1 e8 ~: B& s; W9 l
5 J+ n: l+ k2 bUser : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?( ~2 z2 g- }9 e& @# B- P- k% }
...: k. `1 b/ Q# d2 O6 f
User : Microsoft 2022 Annual Report) Z7 }4 B' {6 b
...
1 k3 b' s. m" AUser : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
$ y* T, n: |" [2 O...) b( Y4 [8 e% z5 R4 V7 I) h
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom4 l8 C5 \6 \* _) z% n1 u
...
0 h d9 ~ v {2 IUser: 您能否从Nvidia的报告中提供更多财务见解?: K( l! z* I4 N; p3 l) r/ \. p
...0 J$ C9 A6 G4 L7 s: m
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
" M+ A; r# T. W: `...." p( g3 p5 g- v" \$ N
5 Z6 B v B0 N+ q5 f# HUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
* q: ~& X d; N7 J...
4 |9 `( ?& e" n: W* {4 DUser:预测下戴尔未来12个月的现金流。. j. r& F8 l& V2 d& \
0 ~: l$ B! l' R/ W7 `- F4 {这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。
. B0 j, g. [0 D' e' a, \: m, N. y% V1 x6 C/ a
适用场景对比
* V d$ V, A7 w% T- d价格对比
$ N v+ F7 Y: @1 t! [OpenAI的相关报价看: Pricing: }1 P" Q# K8 R5 `4 ?, P
3 a. f$ [7 m1 ~8 v* Y3 ^
对话类:GPT4远远高于GTP3.5。# P! L$ C2 F/ K8 ^3 y" f
9 Y6 ]: ~. k1 @1 P
) ~) j- F+ J9 L- l; i0 j: {% J5 r
* H$ L! w7 h, G1 B' Z+ q6 z目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。, H* q$ i6 J; x% \ T" e
# D4 n0 `' d2 F6 U" N2 s1 N# U, F2 t- e+ j/ ~, m3 O3 w+ S( Z+ N1 y' |
# C& z w9 i. l$ J& {% U1 s7 o: \0 f3 ?) f% f% @7 Y8 d
! D/ T5 j" s. i/ A ?5 `4 q$ l& G) K8 v
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。1 u+ c; `& y/ E9 ~ E
6 F9 L% r' @% Y% [+ K而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。8 ^- ^5 W8 k/ O- E$ w
# v' B f* ~) \1 l% |所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
; _9 a) n% L- H6 ]
5 T3 t; h) F0 q: B! i长度问题: X3 M) d* j" f" m# x
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
/ V' V8 z# h# o
3 ?; H, k! J& I1 p1 c. \8 a* \但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。" I6 t# U+ p5 d& N6 y
7 n, f- m- C- D. r
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
: h+ H! S; F6 i; r# S' S! d* _
( h+ a( R" X7 r; T" x当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。' r( t+ ]% @+ p# `, Q z' B& Y
8 R# |+ ^9 Z; G) i* b* B. [7 Q+ t
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。8 y* A# _, Z. |' s7 |( k
& O* K& w7 k8 N' R: n比如说用户提了一个问题:- h4 _" r: y9 `. o; H: }
, i; ^; t$ |7 t7 T. b) W9 i“What's the makers's schedule?”& D3 G8 l& X3 v& Q
( N* G: G* f0 u* Y9 ?& r" p) i从数据库中检索到相关的文字段落是:- { A4 G7 q- E. |: f. r
& s( a9 C7 G/ M6 @
“What I worked on...”
- S+ x* @; t- N& z" j x"Taste for Makers..."! c/ }( q- y6 m0 X8 Z
5 P, Y" J) h' E- m" Q那么最终的prompt看起来就像这样:+ H* ?, ^- J4 V
% i2 I2 @( ?7 \0 |1 G0 w# g9 n
0 x+ g3 ~5 B' y: A4 L9 Y" ^[9 W: ~; b/ L* J4 g% U- a8 e7 v
{/ {( _/ q& x& f8 n/ w7 q1 e
role: "system",
, R$ j3 G$ a4 W% _+ Y- 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."2 y$ y& z6 P! k/ k* q: ^
},. o! {* U, \# M; H* b# S: S* i4 Y
{
2 S3 g- R) @4 l. s+ a2 Q0 z role: "user",
" L! M \) @, R0 f! s8 z+ J' e content: `Use the following passages to provide an answer: {2 I/ I# H9 u" J% C
to the query: "What's the makers's schedule?"
! O' O1 `5 Z) D9 d" `( g; M" S1. What I worked on...
^8 W* @* d, P( k: O5 n$ F: y1 m1 o2. Taste for Makers...`4 Q! b, z) S1 W2 g _! w& {2 ~5 q! x
}
: m; X! x# k7 K* k9 l7 ^]" t4 m( b" Q7 b
; {4 E L; f, ]) D; t: p
1 g. o- Y$ F7 V+ ~) a, T! w# y9 p这样ChatGPT在返回结果的时候,就会加上你的数据集。4 v, S; `+ `% }' b6 k1 v8 n ?
4 M8 U1 T4 w% b; [. E2 i9 o具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.9 A' |# Y9 o% j/ u! E
6 Q: R" u* z/ ~- O# S' y总结
+ a5 D" Y6 K: `# @- P& l大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。5 s5 ]# \# y) e' Z0 G: h9 \' t
/ {, j' d: {& g; F; U0 j
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。7 d' v$ [* v: {: {
2 I* X$ V' w% G& P
参考
2 [+ q7 J# O S" L/ V4 z如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客
$ B" |/ f" P* J9 i* ?, l# { ]( d& `. k8 d% t9 Q% ]# ^
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
# A* q6 i4 C6 a, g5 s$ C2 U) I& m _9 H; U" O3 Z
. Y' q$ n3 f; L————————————————
S6 ^/ V* K8 O8 A- H# L/ d版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; ^, R% e9 w5 J5 G2 z
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
6 |1 T0 l: A" @' u. ~; z- c, ^ |
|