|
; ^2 N. C. a. |% t% o# T
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
1 f% d- V4 S8 N( s9 Z' |* z/ X' @& K% r. f& A- u# C: L2 k
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
% F" E9 U- s$ A% p, H' g
1 z3 R# _; g& F我们应该思考如何让AI在专业领域中释放更大的价值潜能。1 H2 t6 T2 Q: R4 s$ [: g% |
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
/ c! E0 T' J* }
8 C4 |2 i6 j3 }* A& m! {以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
6 x! t, u+ X& I. R8 ^% `! _4 T- y' O7 M0 A/ L' f
1 d& s3 P6 }( p. p% m+ j
$ m9 b; c3 z( p. w5 H, w; i- c' [4 N: g3 m- k3 L
# v0 u# K( N/ P
5 r# j3 u* U; E q8 U一、微调(Fine-tuning)注入专业领域知识
: A6 j% Y$ |7 T; ^微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。' Y$ W6 ~/ \5 n% s$ x
1 b b1 H1 ^4 L3 n& g
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
1 {3 N& |; C! L5 ? \; V7 x7 i# O* G2 J9 V- A ]
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。* O- w+ }( v7 A5 C) ?
& x) k3 b( ?6 u: a1 T
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。! i0 X4 E9 J1 H& O- ^ f; p3 D
% s( r. H2 x! m0 e! B$ q
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:; p, S; X1 [9 F9 O! ^% q
& _" Y/ [* e* Nprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。9 m: s" \. q, d9 a* M8 a. F6 Q
& u, y2 R) \5 I a) @completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
2 Y) H" A" g/ @! _
; D& ~) ]( ^+ F' w2 q u下面是一些数据例子:
' C' g5 y& j/ \& C8 F. y+ x( t% Z& H: N& B" ~& d/ f
{
/ b, G% ^( p3 i! D "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
; W8 R a7 K! V& I6 {$ v; U "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
4 [( Q. ~0 r0 `5 r4 V U, h. X$ O}
' M: n/ D) j% n更多的例子可以看如下链接:7 u7 p$ d2 D7 x0 q' s7 M/ @1 Z* w
! x4 i1 I1 |% I3 T5 b
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
1 X; U& S4 M9 ^2 j- ?' ^( _' X$ e( `" Afinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
9 O4 X9 p- F) o$ Y# Y4 z( ?6 l0 ^要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
. f; O7 k3 J* m2 Q; \ |% G* ~! T% S: ?; ?. J4 j7 ]' |- F: p
二、在Prompt中带入知识
1 w: U, g7 i& Z1 E2 {: e7 r* W7 }只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。( ^, e5 _* w0 N( y
- J6 V% ]( l$ R/ u V$ o
输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。5 b( X- ]+ u. o5 W- V
" t1 u2 G; W4 C7 [4 }4 D
下面是一些例子:
! M' q) H: T/ _
+ U3 P& l; R2 s1 N; U0 K例1:作为专业DBA,回答SQL相关问题
$ P# H4 l5 `9 G3 B& ^, e* R$ O这里在输入问题时,引入了我们的数据库表结构这个专业知识。
* ]- l$ g: }: e p7 B/ ]5 D- ^# }
问:$ M% x' T9 C" K- e
; J y( Q. L4 l7 c我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。
( p. D( b" c. R0 @% h K5 @* T) E7 x: Q+ r9 V# P. [+ k) k
我的数据表结构为:
( ^/ O/ H( w- }/ R5 R. |
) E0 A" J8 O% g, a# iCREATE TABLE `user` (3 A9 T; r6 _% [& y
`id` int NOT NULL AUTO_INCREMENT,5 ]8 j4 C8 ]) y! R- a
`name` varchar(255) CHARACTER SET utf8mb4 + v4 {1 z. i! b+ {( L# m
COLLATE utf8mb4_unicode_ci 3 F x' ]3 [1 }% K
NOT NULL DEFAULT '' & |( ^; F2 S( ^7 ~4 [8 k+ B# J
COMMENT '名字',1 r, ^& h- q6 i) C$ P% ]
PRIMARY KEY (`id`)6 j# o/ j4 U: I3 ^! m
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
' M9 o4 O8 l! N. R' ~ COLLATE=utf8mb4_unicode_ci ! m) {3 Y& H3 D/ |
COMMENT='用户表';* S' a0 Y% ?/ A9 m
我的需求为:根据用户的名字查询用户的id# q! `5 D; d3 \0 d ^$ T
. S) R7 L) m& a7 g& e& L8 Z
回答
6 K" g i8 ?$ j# K' C& s9 W( h. |
- }3 D4 h' o2 j6 }- k5 P好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:. x. q7 ^, Q1 ^3 f# Z$ S
' [( d1 n! n$ @% WSELECT id FROM user WHERE name = '用户的名字';- y& R' M5 W# a" T, @
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
( @* v* ]' F7 q% b6 [# a2 y) J8 n% n, |! }
您可以使用以下SQL语句来为name字段创建索引:
2 p$ \: c U8 b# x8 M1 H& ^. E: O$ _0 {5 I. d. l4 `
ALTER TABLE user ADD INDEX name_index (name);
* s- C: n5 H5 |% P a此外,为了保证查询的效率,您需要注意以下几点:0 {( P9 T9 c/ x; _
$ j# n# _- L) l- P p
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。0 J& B5 b2 d3 ~( ~1 N- ^: f
: {, ~: e- B, g; G) R$ j: _( {7 S如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。2 k$ ~! z4 p9 Z) ?% h! x( M
9 `5 r' ~- H: p* M$ k3 Z1 G例2:智能客服
( S7 ~1 q8 ^2 J7 \2 z& w2 T比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:7 q5 Y/ y* m5 i' D/ I- X' ^
8 `3 T% f3 j2 i
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub. [0 e b7 n5 {3 O7 o
1 K! x8 D' Q4 b1 b) J1 D$ z
下面代码通过消息对象的数组注入了一些上下文知识。
5 P! b& r7 p9 S8 }' A( o9 a6 }- Z5 f3 z, A" f
U- s( ]! {9 }" Z6 l O/ @7 u
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work. ~7 ~2 X; P" q& N% s# v
import openai
5 B& `* w) p7 v" y1 E4 Q: Q
- V) b# d6 B0 P. j5 mopenai.ChatCompletion.create(% C/ @) g9 v! A8 Y# d
model="gpt-3.5-turbo"," D7 R/ s% ] {# X+ y* d
messages=[1 r3 |5 K: F, a, E
{"role": "system", "content": "You are a helpful assistant."},4 q6 W! a. R0 z
{"role": "user", "content": "Who won the world series in 2020?"},: B! o4 b7 J, c% N( Q/ n
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},- {1 A3 A! R9 v
{"role": "user", "content": "Where was it played?"}4 W; `- S2 ` @% M0 s
]' N7 @6 f1 a; l2 ?" M! I
)( I$ w6 W* F% @8 s* g" R
% j: z9 A* R1 P2 y5 s9 B其中3 y0 ]) S, H' q5 E8 w. d$ T5 {
# c0 V4 g& C; _6 j$ E. f. j
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
( R' G! p- d( `$ I# p2 G: M用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。
6 P$ ~" M+ h4 o; R* J s助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
9 l8 L2 e/ M( E9 g# j; ^- K: z! I通过上面的方式就可以完成专业领域知识的注入。
" g% v0 l! M' Y6 W
' ^' L! }) d9 z- z+ N8 c8 _例3:通过外部链接把内容带入
4 P W8 N0 i- L, z) z/ d下面只包含我们发起的对话部分,会话结果比较长,省略了:
$ y3 Z5 c+ g5 b6 }% p! v. _0 X) I: \) I; ?" I1 b) [6 j2 {$ x$ Q, A
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?
: M7 ^% n' H3 k6 V) O...
7 W! Z, {/ j% N$ IUser : Microsoft 2022 Annual Report. a& w( L& @& Z! ~
...
8 Y2 F9 o5 O5 M! a: YUser : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?& ?1 p- d o: U& ~- Y
...
" c o9 F8 B7 @8 c' L9 c# hUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom1 v4 D6 j* V9 B( P# e6 J6 V1 M
...
2 L. L( t" I4 Q. a1 cUser: 您能否从Nvidia的报告中提供更多财务见解?" ?- o$ U1 n9 s- ?0 z' N
...9 ~4 f9 Q/ _5 C: s
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?0 w, U: U9 T5 k' g: g- X# l3 [
....7 L! c/ ]2 l9 A, }
9 `& C' U- @4 Z
User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。/ C) H$ m; ?! \- i# O* R1 T3 e
...5 W+ ^. b1 c( d
User:预测下戴尔未来12个月的现金流。( ~* L1 \8 ]" s
+ J7 R+ L9 D' @" M2 R这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。
: q% M- F/ P6 j, R
# ?- E0 k6 u, ]' U2 S2 \适用场景对比
; p8 d0 y$ v8 R {# I p9 _* f价格对比, j, S% k! ^& {, k% s1 J1 {0 w7 `
OpenAI的相关报价看: Pricing- S5 q. t6 X3 v9 e7 Z1 R
) f# L0 p% ~) c9 o" f
对话类:GPT4远远高于GTP3.5。
+ a) I/ _- D3 m6 H6 _$ Q1 U
3 t* S% Y/ N9 T- S
4 L/ X) p- d: u) H' ^: m! }+ T% ], k+ j' x
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
5 b2 L+ {2 [- g6 t, ?- P; b4 v% k, j
' I/ [2 \% ^5 _0 A1 d* E Y8 n% t
/ H" N1 |" M5 [4 M+ J: b0 X- y' v" Y
2 x- z! x6 X2 M3 F0 A3 g
/ P/ [( y9 p, b4 j7 `* i! c. A0 t; z9 q# {* C# v9 v9 Q9 Q
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。4 f, \$ ^; T( J# x4 g1 \
1 G+ [( y0 N- A7 R' }' s而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
; ]9 ]1 g* A. v$ Y1 `- V7 x
+ h' e- m% [0 ?% w w1 L所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
8 K' N+ F7 j7 F, w" t* j& c5 {8 c: M2 W9 k2 r
长度问题2 `2 O: @9 U/ I+ t9 F
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。( V/ z+ T0 T, N3 r7 q2 O# r
$ F2 Z- ~- H+ w. q但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
9 N$ v# f/ D* x7 M8 g- {4 L$ H& U. z0 {, o6 L
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
4 {3 N$ S. c( }. ~
% l/ b' l l4 P" |, E4 E$ |4 T当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。3 V D% U* H% E: k& ]9 g' p# S
' S; a' ~' e! @3 t
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。4 y+ a/ K$ U* d
* ?& d, w, u2 m; V/ z" v8 E/ V4 }9 R& @
比如说用户提了一个问题:
6 H% O7 g/ ?% e1 N! b1 Q7 X/ n$ ^. X% h1 g5 |
“What's the makers's schedule?”
! E1 a( x$ y5 R! _" Z1 r9 D) d- I* T
从数据库中检索到相关的文字段落是:
# Z" {& h+ n+ Q% |' g9 |2 z) L+ N
- l9 p4 |; e, ?3 a* H. \“What I worked on...”
- d9 E$ @4 Y2 t% D1 O# q"Taste for Makers..."
$ {9 r& t8 x4 Z1 f1 ?; q( T, i+ _) F3 a$ Y1 S
那么最终的prompt看起来就像这样:
) A( ~* W; g8 ?4 A* S& e2 a$ W( C+ a8 ]
& q9 @1 M9 s1 Z. E1 B[ S I" T7 S2 |) j0 g" M, |
{
0 {; q& U' h/ Z$ v: K role: "system",
& C' k R! u% |, Y 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."- {$ j8 `+ W7 `, [# r
}, q+ O6 b' d8 b6 u
{! B) z% R4 k( }+ u6 H
role: "user",7 N5 g7 _7 p. I) G' h+ E! w; \3 E% a
content: `Use the following passages to provide an answer
( X" X: y2 G* K( U3 F7 E3 }to the query: "What's the makers's schedule?"
! a+ i0 X* p9 U, ?1. What I worked on..., ]9 [2 u0 [. |- ~. {
2. Taste for Makers...`
! f) o$ n# p2 p. l }
/ Y# D' S' B) j/ S" ^- h]3 @9 @9 G' L! f, T
; z( g7 z; r3 q ?; I$ J, Q. O, W6 W( ^! A8 B: G3 q; }
这样ChatGPT在返回结果的时候,就会加上你的数据集。
I9 k1 M/ F& w% D" l4 P7 P3 [4 b3 n! _% n
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.
. p- [ K' h6 V
4 |& `+ k& S% ]( i总结: } A* Y% h% I+ h9 _( L$ `
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。; w. b% N4 I. D$ z
# n8 }, q3 x3 ]5 k/ O
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
- S9 M# h! d2 Q' ~3 u5 i4 D. e1 ?9 x* s: v
参考* y# _3 |: s2 ]* O6 i# `1 C
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客
/ C! c3 d. z* P8 M0 y5 k% ?* `9 [( L7 T& S/ O2 O
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt# V4 M$ M2 p5 g$ g' N1 Y. W
- r3 S' `" Y+ ]
1 Z- H/ H0 U) k& F' u2 X4 e+ w————————————————
! a y7 t; Y0 e9 G: ~$ n% F$ ~8 d版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ J; A7 R& M6 W3 {2 K. T
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
/ p# n' t, X' q# l9 |5 ?. R. _$ q |
|