|
|
% H7 k5 i- E E. Z6 J4 {
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。' X3 T, r) S0 F5 |! K
& U# i6 T4 C8 D$ R以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。% R' E5 ^9 G: Z# k
" d/ k. _4 b( a( X" b& [1 o8 \- y
我们应该思考如何让AI在专业领域中释放更大的价值潜能。6 g3 `+ D* A3 D# \4 h
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。- l E: S+ I; x2 K
! C0 l5 h6 y5 {7 K5 Z1 M
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
0 R: y* D/ m! I. q2 L1 L( Q$ P1 }2 v' b
+ s6 b/ T2 V. T3 l: j4 \
; F& \) k4 U* p0 S. Z6 X$ `0 A, j4 |! @0 B, M: a# F. T
3 b9 h$ `7 `7 k+ G- w! C
3 }% X* e& C* }一、微调(Fine-tuning)注入专业领域知识
7 U% g5 ~0 S8 u微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。( ~0 m" t/ F0 s: @8 B3 K2 x# w
4 ]! B- t) A2 m: G2 C) R r
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
" _/ T4 w7 N$ K' F! m9 k# F5 H+ \
% ?0 ?- J0 |. \* i! P如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。1 M& o+ V+ d: ]; C* A0 E2 x/ b% |
' g+ W; M) R* j# \
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。: T# d0 Z D1 a
3 X; C6 q$ |0 H
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
/ y; s" ~1 r3 M( F, W7 ? ]# n& l1 e$ g
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。( R9 _6 A! O. C# l6 F6 Y* d# K
- f, }$ u' g/ v! wcompletion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。- @) x, F1 U+ j- I2 |) [* A& X
4 B2 v" w8 y; u3 d/ R/ Q3 M下面是一些数据例子:
' b a" H9 P! I6 M5 m- R3 v. p# ]* | \0 U( _( V6 O- h; b
{/ x, c% t* Z4 q
"prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", 7 x! y& ]; H0 K+ P2 x/ [
"completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n": P6 U5 x$ V; Y" a
}! y% A9 E8 F& k& K; F* \5 s
更多的例子可以看如下链接:
# U3 |$ J: Q# u: s2 L1 r! U
R, T1 A1 f; l6 f ~& @5 {GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
; ?" ?5 l$ X& ~" S/ }finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub9 k. h+ c& G& ^; g
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
3 ?$ A4 T: y w D; B7 M0 b5 i( p5 }5 |
二、在Prompt中带入知识
$ F* Z( |& |+ I! s0 w9 B* U0 s F$ m只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。: U0 p* j( Z! A) I. Y
3 B! p+ y( ~! F9 x2 z! \3 s3 e' s输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。4 Z1 t8 K; a. q$ N0 E7 }
" J, R8 X0 C0 ^. _下面是一些例子:+ A9 P- r/ h* R. n' |
6 q+ Y8 V7 f) T1 h( u& P' p( m例1:作为专业DBA,回答SQL相关问题0 P7 C( K& D0 a( X5 s
这里在输入问题时,引入了我们的数据库表结构这个专业知识。- s9 B7 K2 o8 ^! _, J' D2 l
6 N) L/ T2 z& s& h. O; L6 A3 Z7 g问:
& E. n- {. Y0 z% |5 p* E$ x$ d" t, H' ?" N
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。5 r, k# b+ \3 r a5 u
1 f5 Z0 ^& F' x& V2 Z我的数据表结构为:
3 b! z b9 ]* d% S( C! c# p. S0 \' S& h E! i/ o
CREATE TABLE `user` (7 D' [& C' R3 r1 m1 p
`id` int NOT NULL AUTO_INCREMENT,
4 u$ Y' D/ Y0 s! _( d8 h, {2 b`name` varchar(255) CHARACTER SET utf8mb4
1 u P) x" E T7 D F9 |4 s COLLATE utf8mb4_unicode_ci
1 L% |! \4 Y7 {( d NOT NULL DEFAULT ''
6 j. n% {+ l$ H! x) x; q3 y: } COMMENT '名字',
* Y# @& \0 r' j" T/ |; gPRIMARY KEY (`id`), H- P C: o4 E0 b' Q6 }' c* y
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
* K* d- W$ V* B M5 ~/ `. }% z COLLATE=utf8mb4_unicode_ci
6 }$ R4 H% }- Y0 u( V COMMENT='用户表';& w) h6 K4 D/ _/ U# B8 j
我的需求为:根据用户的名字查询用户的id
! f# X8 z+ X! G5 W: o
+ p3 C- k) S" U. a' t回答
" D; w8 C$ L1 o+ {% x5 W' ^
, e' I3 X X5 C8 P8 @! u好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
, }! `* {( u& }/ A, H7 c* q; K/ w6 \( _7 V0 f
SELECT id FROM user WHERE name = '用户的名字';
, p" N5 o* u$ A0 D9 ~4 A" \这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
* |7 |9 e3 {5 b; s
7 @( E! b( I, Q9 O2 k您可以使用以下SQL语句来为name字段创建索引:. i0 |2 U ?% E5 X: b! F5 }$ H
& e, }' B3 n2 b) CALTER TABLE user ADD INDEX name_index (name);0 C1 s8 R: j% q4 _( m
此外,为了保证查询的效率,您需要注意以下几点:
8 R( i! k; q; y3 U' o i. W% d( x3 C; i9 k5 A( ?2 q0 h
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。- c0 R4 J: n8 A" X. R
; b1 R( ]$ l1 M* c! M- z9 t如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。
& S/ U. e1 O% J
% ]1 K* P% }: I例2:智能客服% r! M8 L. V) r, R& x5 d8 h
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
; d7 s @5 f% ?) w1 H! }3 v5 w: c8 p/ c' V. b
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub7 g$ F; o8 o5 C, s
* V) M7 B' C5 t! s
下面代码通过消息对象的数组注入了一些上下文知识。) X3 ]- u' p1 Y. L8 b- @' n
, P6 d& p4 y( Z$ E; b/ h & M- F6 N. d8 k% Z' h
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work! G& {( Q6 y% h# s3 `; V8 w& h
import openai
- ^/ E: M) q4 D 2 ^0 d$ U- d( m
openai.ChatCompletion.create(- U8 m+ i6 s/ d; \
model="gpt-3.5-turbo",
) v6 N2 U7 O: v4 R2 j: M/ o1 H messages=[
& L0 T- W! v: M" K6 P; f! o: T& z7 i {"role": "system", "content": "You are a helpful assistant."},
' c7 `6 \4 R$ z4 e {"role": "user", "content": "Who won the world series in 2020?"},, n4 E" z |9 J0 ?
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},* S4 G- K- H8 u( P: B$ l0 @9 @
{"role": "user", "content": "Where was it played?"}
5 i( G6 D( B F, l1 k ]3 @# Y! a# P* {2 a: q& y
)# V* X$ A9 Y/ k; d* I5 Z$ @" e" J
! K8 L$ k( C4 ^3 Q* } F
其中, A/ b% T8 W: w3 \
3 \; ~! u( x- d. G' o系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
6 W/ Y8 w8 n5 X' \. `用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。: A5 b G. q7 K2 p4 S
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。! {- s% r, a& ~+ q" G$ v) X
通过上面的方式就可以完成专业领域知识的注入。
: O& z8 L0 M+ ?" c/ w
5 J% ]6 H+ C, S+ z% ?例3:通过外部链接把内容带入
2 c6 N" I$ H$ P3 e下面只包含我们发起的对话部分,会话结果比较长,省略了:
~2 Q, v' a; @7 ?5 M
+ m9 w" l; d$ F% w3 J dUser : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?, o9 t& Q" l! b* J* k5 l! a( D
...
0 S7 F7 a$ Q, W8 Y: _- X; UUser : Microsoft 2022 Annual Report
/ D! @6 r& U, E8 l4 b& Y3 Z( L3 _...4 g N) i" a1 z3 g, k0 v
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
3 j9 [' M: z4 v- I1 d+ P...
- S# j) _- K( [- V' SUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom" T& G) k" o" y% ]
...% w/ L% Q' j1 v; d- e i% ]
User: 您能否从Nvidia的报告中提供更多财务见解?
; i# x9 A7 o x...; H3 S. M& P* z" B% D3 H( R* a
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?: U' s ^- w! v5 c
....2 H7 j8 @2 H- O% H8 n t" c! W5 t
+ _ ~5 n9 F! a+ a: e0 m" aUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。# J/ w' i g! S2 t4 ^
...
+ S, N1 e0 M7 a/ I* p; [User:预测下戴尔未来12个月的现金流。. H$ k6 _, _5 O( R1 j
+ M! s2 B# \3 _ i* w
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。. y! ]& D/ M) \3 p
9 E+ x7 b) r9 i4 x8 ^) g' q! z
适用场景对比
* R" t; D2 w% L& g" q0 }# M' x( v价格对比& C8 S4 |- {- Z; s2 K
OpenAI的相关报价看: Pricing
0 Z9 X |6 ]! \+ j5 x
0 v7 ^9 l' C6 a/ L6 L对话类:GPT4远远高于GTP3.5。
1 L m/ D( o5 G4 U+ K* l
( H: R: `6 r5 W. D+ z6 o: q: {& l' Y J O+ S; g
+ W1 f& h4 [; K5 N' K- B
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。9 o* }3 D& z4 b% F" V4 S d* S
8 L% [8 u3 d# s& j$ ^" [* i: }" K0 k# t# } Q8 J8 x: n
4 T" f4 ~4 t9 ~! T
- [, v5 p: K2 [6 o4 l- ]
% L6 N( Y4 W! v5 ?- x
! c0 g, y- v2 f4 rGPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。% C4 Z) {2 e: P2 u, r! X
. H# Z4 {" ]) ~$ p! N4 w6 U$ S而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
4 p( s# d* M7 U7 f' l$ }/ o! E, A4 `8 a1 q. H2 a5 H2 n" ^
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。1 }$ A$ _% I- \1 q$ T
# t& M2 C; B$ B- Y2 x* ~6 c长度问题
4 B1 k& [! @) n: O, hChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。7 ` R; N. r8 N( M
# S% J. E5 z; ^9 w" Y& F
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。5 l% F" T. S: T& u1 P% n$ ?
$ c8 J6 q: T0 W) b, e
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
% A. Z, J, N7 V; V" I* [7 N$ O& A y! S; y% O
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
* G. K1 u- B6 y v- d' w, ^* Z0 x9 `" [: U
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
0 P$ N( E1 f" B, n% _# D9 M! T+ t+ n8 `7 L+ N+ G& v# ~7 g
比如说用户提了一个问题:. t/ ]6 [4 E. ?5 y6 B
9 P- J) \' e1 ^
“What's the makers's schedule?”& }1 i6 X8 \$ K/ P1 c2 D. ]5 s# J, ~
% v! J; g6 i( a; M% r' K u% @+ [( f
从数据库中检索到相关的文字段落是:* P; ?# Y- T8 C* a! H% U% b
4 D& @. \8 |" ~1 _- A“What I worked on...”. n n. @$ S( H A4 g( R
"Taste for Makers..."
Y/ s G5 }4 o4 \9 ]0 Y& Q% i. X8 e5 m n3 b- h5 s3 w) \6 N
那么最终的prompt看起来就像这样:8 C& ?) ~0 j! Z
! w4 B0 _* ~8 m0 u- F1 s( x& w/ r# u# i
' q- W5 W9 y+ D: S! j: R7 b
[
) ?/ M) q9 q+ C2 g9 O: Z. G {
5 n) @) p9 H: G+ R7 {: _6 Q role: "system",
* H: ^8 S2 K! q! y* Y+ i 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."6 L X$ \/ e, R$ m t
},' G1 @, o N6 }- f/ s* M
{
( Y2 l {( {! F3 v8 ^ role: "user",
1 {9 b7 M/ X$ v& p0 c content: `Use the following passages to provide an answer
9 @9 H& l" G4 \, M5 X( U8 m5 Qto the query: "What's the makers's schedule?"
" a# @4 h( x. H1 a T1 ^1. What I worked on...
9 k8 h' U0 t+ i7 |0 s2. Taste for Makers...`
+ e$ Z% T4 D# p9 ^5 }1 M& L; ] }* x9 Q6 D2 W, I, }: n" S% D
]4 _4 y6 K/ `; R( Y8 M/ \ h
- s R# z( K3 Q7 ?- D% v* j. ~/ F, l& D3 g
这样ChatGPT在返回结果的时候,就会加上你的数据集。
& c- g& s1 y! x) d5 L, g
( K( q c. @+ }/ {& M+ e5 T+ Q具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.$ U/ C7 Q" O" m) m
$ A- Z7 b# E4 n" m) h总结9 r* `! A: B b6 [& T8 z: v3 |
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
" A7 X+ v$ L, \* U9 d/ ]( q- }" s, V: O! F' U: j
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。$ K1 F( s( _; k
4 U5 ~, c# ]+ h8 N& f6 x1 x8 l
参考1 k/ ~5 i5 }- G7 P& \7 s3 v
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客% [# V6 m& G9 b
) v' _$ p" O% m% D" }, r. {# Y% `
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
- v( V# }( e: O3 A6 p* ^# C0 Z) @
8 i3 d/ H& E" V. b! L
————————————————- ]1 Y* n9 G( v! `4 m7 A
版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: Z0 ~6 i0 E' _* q) J; g原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
# y i9 ]9 k+ T& {- j$ T |
|