|
|
) Y& U) z3 e1 t) e% F2 B2 {6 u
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。5 ?% c! ^& R$ r5 F9 R3 }
, ]9 R( k% r9 [1 Q/ c, C" a
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
9 l* n: w: t( x8 ]' R5 m
# Q. T- g9 t1 V4 k4 d& R1 |* r# ]我们应该思考如何让AI在专业领域中释放更大的价值潜能。! j0 c: a% S( p) a! l2 ~
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。! H- s, H+ i! ^6 E9 t5 y& g% D( }
4 M* U; e3 W& t, a' P$ m5 R
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。+ J4 }2 x& y- [# E+ h
) s, J. W k }! q
$ f/ _4 R5 F4 X5 z7 {* D
" k7 G: s* x! ]3 t! f4 E, Y) `+ g. _6 W7 t/ p" i% }7 u9 W
9 u/ g" l2 h/ I/ E7 Y: V1 O( Q& n6 J j6 |3 j
一、微调(Fine-tuning)注入专业领域知识6 S. M- Q* R$ T' t+ Y; S. V9 ^
微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。
# S. B1 N( h! F3 ^8 c' i# M" M3 O# V+ U* r; z8 @! j- O# r+ D
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
( `9 k8 z' G9 b. G9 p* Y) v+ V/ j* O# {- l0 x
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
: O% \, z& B% [! w
2 ]( m& H S# ^OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。# g7 K1 }2 M/ F
" |' H, C, {" l2 j! \5 V
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
; ?# |" f# I3 g3 r; ^2 H- o3 x2 c; S' A: D% x
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
0 T% ?, p/ Q* }, f- L$ E0 R u/ T T' X9 M: l4 c# b2 o D& B
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。, V$ o% t* s0 ~0 N$ K
- Y& B/ H& Y3 y% G# B下面是一些数据例子:
& M+ p4 _ S" |( e: M$ H- }, g. R9 V
{: h1 m" i0 Q3 A6 C0 T8 B
"prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
) A" U( x' F H9 r. b+ m7 U, Z. o "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
. B, [3 |& m9 E. [( ?}5 l# @8 i/ O2 m; I: ]
更多的例子可以看如下链接:
* _5 U& k$ I$ Q" P) q" A
) `4 O% O+ Q" o6 Q; o6 T AGPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
5 V H# F9 \- K9 I0 E/ Cfinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
) V3 {$ L1 R: _+ M要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。& F$ W4 U- z. Q: `2 O. r H' \
4 D) |* v) Z; ?' x3 x4 i" h+ W二、在Prompt中带入知识: a( b2 ?1 V- P" B
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
4 W$ N' z) k* d) y
! _1 C% A" H" o8 {: A% f; m* s输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
$ E( n" y. u, H/ f0 v$ U) U# h: e, c5 o
下面是一些例子:
4 _- l6 C( S. r! E [3 b; Q6 [5 Z# z( A
, ]4 h1 _/ n. f0 A* {* q" K, k例1:作为专业DBA,回答SQL相关问题
/ G/ A& f0 P4 j0 \4 b这里在输入问题时,引入了我们的数据库表结构这个专业知识。5 W8 q X1 H; E9 g8 o
1 K P% r0 ]" N2 ]问:2 L: X) G! a$ v) N9 o7 g. {' F
7 M$ Z9 ~8 `5 x6 Q6 ~我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。
. Q4 W6 P5 X9 E
% a m6 t1 r- N& y: f$ M我的数据表结构为:# j* ~. j- y# y6 [9 u
6 [1 O8 B( U% @CREATE TABLE `user` (4 Y; M2 c3 r! A* B0 q7 O6 U) \6 o' @, H
`id` int NOT NULL AUTO_INCREMENT,$ Y* N/ G- d4 }+ @, V8 Q! Q" `
`name` varchar(255) CHARACTER SET utf8mb4
/ I8 L# T9 s0 E1 q COLLATE utf8mb4_unicode_ci - v+ e3 d9 i3 A% Q: c3 G$ L' R
NOT NULL DEFAULT ''
( N/ P6 g9 ^) M7 x$ T8 X4 e COMMENT '名字',
3 {& z, b, I9 BPRIMARY KEY (`id`)
9 P( J4 ~# {. r. Q" ~) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
. d V6 h" K( k) _* l" r! R. q0 I- S COLLATE=utf8mb4_unicode_ci ( W' X3 ]8 O5 k5 M4 R7 N# y
COMMENT='用户表';& H& Q/ Z5 N" \: `
我的需求为:根据用户的名字查询用户的id4 t1 k- i" W/ @( Q4 e3 ?2 K- e
9 v: C+ j. b1 V1 G$ l# h回答
3 q7 e ~# b: f; b7 h; V- l5 W) r v1 i! @- {
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:+ Z# d' X' ~- s
) H( f% Q, q7 ^- X# lSELECT id FROM user WHERE name = '用户的名字';
9 Q: {) n: h6 E9 b这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
9 R. q; d/ ]( ~. m( n
% U% N! x" {0 v A4 @$ W$ [您可以使用以下SQL语句来为name字段创建索引:( T' g$ m& D. H# I2 X m
6 d7 T2 w( A4 B/ T4 c4 B, Y' [ALTER TABLE user ADD INDEX name_index (name);
% s" a3 `1 h3 _ J1 v此外,为了保证查询的效率,您需要注意以下几点: K5 ]8 d! X+ U5 G
" c! @4 O3 B! q
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
/ ?0 r8 _/ F, h) W5 k- k
2 A# H, k3 B0 C T) G: V如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。/ }7 Q( d/ L$ f# @: J N. \
6 w$ J N Y7 C) S2 h' I/ C6 d% D/ ^
例2:智能客服( d" p. H+ k( G7 B
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
[9 ^ l' q4 c4 j) S1 v5 l2 h7 a, b
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
* x+ l4 }2 `+ {; {* A' ?* J. t) F2 D
5 A" O$ x. ~: c1 p5 l3 n下面代码通过消息对象的数组注入了一些上下文知识。
" |/ b# b0 U- T! h" n: u) k4 U. ]) Z9 ?! U) Y
# S7 H. N& f2 @; k a# Note: you need to be using OpenAI Python v0.27.0 for the code below to work% |* x0 ~" a( A+ h7 `6 u' [" Y/ T. {
import openai4 E/ b. D1 B9 q% H
; k! c9 O0 f4 }7 u6 Wopenai.ChatCompletion.create(
4 b2 P! Y9 y6 D- m9 T9 l) L model="gpt-3.5-turbo",
! b3 V7 ^) m/ C ^# E$ Z messages=[
2 ]5 p3 e: I9 M! R! Q8 V* B {"role": "system", "content": "You are a helpful assistant."},) H, X- C9 f6 R
{"role": "user", "content": "Who won the world series in 2020?"},
. T% }: W8 W* M0 [ K8 ~ {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
& _' G5 w3 }/ }& Z' r9 F" ? {"role": "user", "content": "Where was it played?"}
- ^, ~ M, _. ]* ^0 g" G6 e ]* c" `: R5 B6 [, p
)
: @' t( @8 L$ n/ p* j! U" J: } * L- s+ D% K7 A1 {. @8 W1 R
其中6 x" @+ [% w/ I* r7 r6 P
3 k( K1 D0 C$ q4 _系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
' s- u& y9 {/ m用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。
. }' \( h7 r& o助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。9 N4 S3 e4 d, a, R) K3 e+ b
通过上面的方式就可以完成专业领域知识的注入。1 e4 o9 K9 E7 ]3 g+ d" D
5 H) s1 Z. r9 V3 {* u0 Z
例3:通过外部链接把内容带入
# K! q. L; N% r( `& n下面只包含我们发起的对话部分,会话结果比较长,省略了:
- D) Q7 \) f2 w# N" N% A) T4 i" {) @) V( a+ z# D" Z. @3 u; @
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?# h- ]" }4 U# F- d3 T# Q- h! l) R6 w
...- e, y9 h+ x4 [& c, u0 M% T
User : Microsoft 2022 Annual Report
) o. B, i0 e' M ?5 @0 y...
. u* n6 [' u3 W' o$ K: O0 gUser : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
/ B0 ]7 \& ^5 E! V...
- c |, S/ D* W! w7 F1 [# RUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom* i, g. T& ^, Z: b; L+ `
...7 P7 N5 p2 A0 O8 z1 Y
User: 您能否从Nvidia的报告中提供更多财务见解?
; N8 W5 K+ S* u" g...# E& X( O- k" g; d: k7 m9 U
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
9 W0 ^1 P' `; s6 C....
1 P& S5 Z& T' ]; }: ]
; o0 z9 w# q0 FUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。* k) A/ y$ Q8 V0 V
...3 l0 P& p, a' L' m
User:预测下戴尔未来12个月的现金流。
" A h9 A- t: |) C2 t, L
9 J; @9 S$ Q: {0 i1 s这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。$ m) y2 g7 D8 a5 G
" X- ^1 \" a+ y6 H' y4 ]$ Y适用场景对比$ Z( G6 h$ x& I1 ~/ _( p
价格对比
- x x. i+ V1 d/ ^& X2 GOpenAI的相关报价看: Pricing0 ?4 h2 s% n/ X
' W! N7 \- I9 z$ h
对话类:GPT4远远高于GTP3.5。, a' D- X. F0 C' g" U4 R
/ W7 H! [) _) z9 M' Q. E
( v! o" J: g4 D7 L/ [
( l* h# H8 Y3 r: l* x) q目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
( a2 t/ ^" R6 V A) s( E f& t4 a) F( ]% C* U
3 y1 F, `: Z; n0 }/ d
# t. F- F5 H: Q& F, S8 ~# l8 b
/ I) x" }4 W. P8 @
- O% V1 \ F2 a3 E3 x: J' v! c, M6 a# Q/ `9 }
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。3 Q. Z: @, N1 h) c. o' \
2 _5 Y% u4 n- W% _8 K8 o* |; K
而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
) T: @) B0 t+ V6 q6 z
/ R8 m6 V! U& N0 s+ S所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
$ } M q/ l. h( |5 p1 K. ?/ o% C* `# M
长度问题
" i) K& C! |0 T$ |. S. c4 N" dChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
( {+ R1 _# U- k8 }6 R1 V4 c+ H$ ` o
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
/ C7 e# Z& I0 u6 J* R5 a0 l7 e2 P
2 U6 Z. Y* G9 Y6 X3 V首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
" n# P+ O3 @& d8 a! E3 \2 O' a; c3 U7 r( ~
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
& L! p! p3 T1 o+ q0 ~( _% c/ ^7 I- J0 ]9 X; R3 l
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。+ N3 w6 H1 j- i8 \" w$ s; h, C
+ x3 ]9 Q2 L: a: H- L7 v比如说用户提了一个问题:
?& c( c; k* @3 `& x Y, o
8 p9 I0 p0 K' ?8 b6 B; o/ x7 A“What's the makers's schedule?”
" Z% {3 f$ t% T- w& @7 R% e
$ C* Q4 z" b: _! S2 o) h% \从数据库中检索到相关的文字段落是:% y9 g9 x; |5 f8 Z
, f9 i% L- l; r8 [
“What I worked on...”8 [" o3 Z- R4 C. i1 X' j* r0 j. C
"Taste for Makers..."0 n& [! j3 O O8 u3 \+ a6 G
+ `3 V. J" k+ e2 Y6 R
那么最终的prompt看起来就像这样:
5 }4 g7 \ [3 r( z% x$ Z
[) c; t0 }& [ . E8 B: q( x( h
[
9 q- |, N f5 X) L. Y {6 k' x) u' A! _3 J# r
role: "system",# n) ^5 r6 U4 H* a9 ~
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."
, {/ m5 O9 o# g2 G! O) v },; ` z P/ T- m7 R1 t4 x
{
% n2 E) c9 Z8 N( z" e. H5 G, G role: "user",
% }$ R3 _& Y: r2 S& e3 B, O5 c7 I content: `Use the following passages to provide an answer
) P5 t- G! K' v7 ?, V. q* `( vto the query: "What's the makers's schedule?"
& _) w# U3 J' l' n( d1 I1. What I worked on...( J+ N& R6 a% A
2. Taste for Makers...`$ ~/ H+ W% P: y
}0 e& _8 o* m c( ~# I7 Q* }( p
] y" V$ \% @- [9 l/ P9 p
/ k! z* ^7 O3 c% U) ] _1 b$ E: ^+ {" V# `
这样ChatGPT在返回结果的时候,就会加上你的数据集。
3 s5 b) {6 r' p6 q: q2 Y5 u8 F# o
4 t: w7 H* z3 Z6 I8 C具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.( U6 q# ^4 Z8 A4 U
& U! v! ?% L* d/ l. p总结
: R6 v- A7 o4 r# y6 A7 w大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。! _$ l9 O8 U7 ^' H! u, ~
4 P, t+ o1 @6 O
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
) C4 C' G$ k" y$ p$ M
; t" F, o8 R1 g参考& l: B! y. v( K. A" z
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客2 }9 _& _: T8 V' d$ ^- ~) I
( J4 q s- g' u& V1 t
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
% H4 o9 ?/ v/ v* g; W$ e- I1 J# H7 z" M$ g+ @
4 ?) y" u' z) H& n- r2 m/ r
————————————————' m5 _/ \# @- D5 g& u
版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
, D2 E+ a R: j( C6 X原文链接:https://blog.csdn.net/ghj1976/article/details/129676157' S0 [% d6 x: @9 P- T1 N
|
|