|
|
1 ~- a7 O3 R" b# EChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
: K: X+ A \( C( z* O! Q7 Q8 J2 L( x# @" ~
* `) z- W6 `3 @; b2 m以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。; o5 J7 x6 s, S- Z$ B2 H5 g
+ z: U2 ~4 k! X4 v' N
我们应该思考如何让AI在专业领域中释放更大的价值潜能。; g! h( R7 B6 ~) e5 c/ s+ X: t5 o
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。, c. M/ V: k: e) K% p
5 @! ?! L4 Y4 h
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
+ t N- _4 q0 p+ ~: |9 l: r7 @- `( O9 E k; H+ I: f
0 m9 Y: r; {+ \+ s, p5 ^
+ o9 w: J* F. |+ U1 e
; h! D6 R' }% g$ U% M* c
/ r& m8 |) k+ c" ^3 K. B( ~, ? S/ X; M
一、微调(Fine-tuning)注入专业领域知识0 q7 h! i; D6 v; T$ U) @3 E0 b; p8 L
微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。7 X4 v. ~2 h6 o
; |3 N. F) o* Y# c; ], R2 k传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
A9 h9 Q* x" U& `* S" Z5 m8 n- O9 ]7 k! K
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
5 @, _6 ~% p4 E8 R1 t* O6 l
0 y' Z3 R! S- h. s- oOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
2 h7 T3 a9 H* r! }* i, a( Q( E7 a
/ w, B3 v5 ]6 F# E4 K( a4 X从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:; t0 A8 ~5 c+ M4 ?3 s0 V
2 y% Q/ V$ O; Pprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。2 \$ z% U3 ~/ `2 m) \4 U
2 L9 \% K: l+ i; ?
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。 Z' F) K+ E* J. K5 U) @
) m. M% `: N( f% U5 C' ?, }$ ]5 g
下面是一些数据例子:. k2 k$ i" E; s6 {+ I- r
3 ^; `5 `, _* s5 _6 v9 m: A{
& j- J4 C& T- O) q4 E "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
% n$ G8 X9 Z/ }: S: g "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
3 J2 l1 u. _: e0 w& N}
8 [4 w0 O5 M5 p更多的例子可以看如下链接:5 n. d n; A9 M$ ?/ n; p
1 h% g& ?0 G% T6 i% }
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub; J& A2 ]" l* A0 `
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub, f% I# D3 J1 G& k( e
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。. g$ ^ B( z! a7 C; ?6 x
" B( Y! t; o5 ]2 z二、在Prompt中带入知识* Z$ ^3 x1 ~$ W, y. H) q
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
! j) V' d! a7 L. g( N" q5 O/ H0 f6 X- a+ }1 {4 ^
输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
3 P& _) G2 e, k7 R& Q2 d. s
8 a; B$ n) L/ g" o4 B( m2 l3 k8 s# L$ _下面是一些例子:
/ ^- C: f& B6 } E% G
3 U; _1 k3 q: k0 G2 H/ h( X/ L W例1:作为专业DBA,回答SQL相关问题8 [( a3 \5 L2 _
这里在输入问题时,引入了我们的数据库表结构这个专业知识。
! {! V% v- k% u6 c. D
! y3 z' W+ |$ n) M6 F# w问:1 m8 L( b) ?1 |% b& K! F9 ?
% @6 X2 V$ ]2 d; Q
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。
" G7 m. H6 g- {" s/ F5 E& H! U' L3 J2 h7 K+ d% f
我的数据表结构为:
, q; Q, M1 q. I" m; k1 I5 z" {9 @+ G D1 v8 u
CREATE TABLE `user` (6 E4 v# d) ~% H# I' h
`id` int NOT NULL AUTO_INCREMENT,& J) @0 F* V, a1 Z" q" i6 a0 a/ s1 w4 F
`name` varchar(255) CHARACTER SET utf8mb4
) w. b+ }' r8 o2 Z8 l8 p COLLATE utf8mb4_unicode_ci
- [ ?1 _) W5 ^0 q0 A- Z NOT NULL DEFAULT ''
4 k# [' ^' D& K3 Q1 m COMMENT '名字', u$ {2 z X% Q5 G( U, \$ ?' X
PRIMARY KEY (`id`)
( [! R6 Q4 o. ]5 i" x) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
- D1 n5 K' u/ ?. t B' L6 B$ D COLLATE=utf8mb4_unicode_ci y' Q- a' A1 j* e+ V0 d: N G
COMMENT='用户表';3 f) x) @& ]2 q0 n
我的需求为:根据用户的名字查询用户的id
( }0 J3 s; G9 n p$ Y- [3 t7 o
6 Z2 Z5 ^% j% l* {- l O6 g回答/ y# E5 d3 m* s; `% w8 \1 o F
4 g5 m* f6 e( p+ v0 r
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
' E8 c! }% T3 a: q% j
' e$ J! K; Y8 z: T! A! \8 U4 FSELECT id FROM user WHERE name = '用户的名字';
# a3 ~5 k9 `: u+ d这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。! T T( L0 E7 \# ?# N' F& I
; t3 y" A* G) l2 m' J0 w6 ~* F
您可以使用以下SQL语句来为name字段创建索引:
G$ ]" a$ l+ Y; e; s# c
3 d+ j9 j8 V5 R) {* f+ AALTER TABLE user ADD INDEX name_index (name);
/ Z# A3 C" d& _" ?此外,为了保证查询的效率,您需要注意以下几点:
+ ]5 P; w5 H; H1 Y0 g; ]
! a- N* N1 F" K: \' K& ]! l- ^) \数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
# }& K3 q8 w" K
, h _' }5 K2 a如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。; a% }; X9 n+ Z& s9 n
4 x, l+ g" y6 H% g$ H* P; ~6 X例2:智能客服: m3 U+ x1 @6 n7 N$ N
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
- k% f2 r- e$ D) {; P' p: }& M% O- L, D) G# U
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub* h! S& v4 `" }9 k, h
: U o; P0 x, Q
下面代码通过消息对象的数组注入了一些上下文知识。
/ ]9 U6 D h1 q9 l. g g" [! g3 Y& M
5 U( T' D8 W1 D9 J# Note: you need to be using OpenAI Python v0.27.0 for the code below to work' i3 E% r- k. F; `
import openai# j# y( q: [2 m! F f% b8 Y- w
; Z8 k& |; ?, \- L% k2 h" R A
openai.ChatCompletion.create(0 l% E; N% o- b" T+ c- M
model="gpt-3.5-turbo",
% z% ?7 h4 j6 q) i! O messages=[, d. a% y' l* v" T7 y' E# W
{"role": "system", "content": "You are a helpful assistant."},
: {4 a9 h, f) m/ `3 U8 D {"role": "user", "content": "Who won the world series in 2020?"},/ B% V3 R# o3 T4 h& q
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
0 |/ q/ h3 P6 B V3 O& q {"role": "user", "content": "Where was it played?"}
% k* h+ B- c6 [) s6 v; S7 c6 M, ^ ]$ i/ N6 {! V) O+ k1 N. h& } R
)) X4 g( }; b3 l9 u
: r, b. x3 ^2 O3 i5 b其中
- }. W* L+ T/ R( n( o6 ]# A I' p+ K6 l# o( q% A* w* k* U, C q6 }
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。& b+ N; O/ ~: n& Y! J) T9 R
用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。
" \$ o7 v+ Y" N- g H+ k0 } `助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。4 m% `; i+ U- ]* r" s$ y+ C
通过上面的方式就可以完成专业领域知识的注入。
- ^0 f A5 w1 N" L) }: U% ~. n* P$ p
例3:通过外部链接把内容带入
z7 L9 a4 N- B& I: }下面只包含我们发起的对话部分,会话结果比较长,省略了:
; k( S+ ^( b7 }" ^) V& S
7 g5 \, H) \& o* X# `. G" q$ n8 F1 |User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?6 m3 h+ k% m; A
...
( L7 Y/ I+ }# E6 B$ a4 V0 s/ NUser : Microsoft 2022 Annual Report
+ [8 ^) C X$ I...( j y6 v( C% |0 i
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?) Y9 D* A1 V; D% d
...
! ^/ b1 y& l2 e$ T8 y6 X7 WUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom( s5 h, ?* A+ P! ]
...4 C) `% A6 F+ O/ B! ` J
User: 您能否从Nvidia的报告中提供更多财务见解?9 n, I7 }- @+ f7 m+ C+ B/ o. |
...
; ?4 @; \/ L! K$ QUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
4 X9 {3 P& X. n3 ?....# o; x/ Q* K/ M. M; F) {
3 S' e1 ]1 z! u4 ?3 O
User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。# i6 w. {& S+ A
...
4 Z0 Y- [/ f0 Z% x) _! N$ ?User:预测下戴尔未来12个月的现金流。
, T4 j" [( p% N2 l( C1 z; D4 c5 W1 g* z+ _
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。
( z x% o4 S8 }2 I* \# X: V6 L
3 i- l5 F/ U; x- ^适用场景对比, B! ^" ?0 I9 t" A
价格对比7 Q, ~# j3 _, \3 O. c$ L
OpenAI的相关报价看: Pricing
* q9 ?( R/ T5 a( @ T. |' V s. ?3 w" q' L, A* J% Q/ c& N: t
对话类:GPT4远远高于GTP3.5。
) f0 d! T* l* a' {
8 t& m* B) z( U6 D2 [; ^& I! G- C9 _& ?0 D4 C$ N) Y% H
& I9 M3 X/ t A
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。7 B# r0 u R6 S P0 q
) D' W% G: ]& R* X- ^# s+ t
$ R# O8 Z* U* J! H
* T8 b% t9 y1 B4 |" w1 j5 T; L" t8 H
U' Y- b* } ]* z% [! v& A
1 V: |8 a( M* ~0 p; K
: J- q* S4 \, p; h8 S$ ~4 i5 w0 hGPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。3 {6 [8 P# b0 g# X" O7 G7 U
. V+ ~+ M2 o% t) G* e而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。, L9 O+ i( ^$ r
8 Q% d) D+ L G( Q
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。- O* i- Z) W( d. S2 e* O0 G# P9 V7 ]
6 o3 J( o7 K8 h, }
长度问题
& ]# k, |! q% s" a, R5 T; `ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
6 s- Q/ E( I- r, H1 t1 `; m. q
# C0 M/ x4 a) ]1 |但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
/ M: p# O( B F6 m: \
) e3 |6 T) w7 P: X) O! }4 O4 M首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。); e& x }9 }+ U; H. p; ~
8 X' [3 v3 s. s& X当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。& q# f. T n( r j( r/ j" l Z; T
1 [/ r0 F" }; s) ^' Z7 ^聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。* o) Z! G3 U" W. [! B. C
! ? x" b N$ g ]/ n# M# P3 ~ S9 j
比如说用户提了一个问题:
1 X% _" q! o4 B6 ~1 ~8 F- L
0 [. r' p! v6 ]" p7 q: X I“What's the makers's schedule?”
( N, |( }4 b, ]% n% H
7 z2 |8 x% Y% D$ S从数据库中检索到相关的文字段落是:4 k0 J! }4 v' \! a" j
) J+ k5 c" E8 _, H“What I worked on...”
4 E+ {% P( {% H0 ~: }"Taste for Makers...", g7 u- N& u4 Q8 o" c& B* v p
3 C" s; ?' h: u0 `: {7 G
那么最终的prompt看起来就像这样:
) j( M' A4 y/ T2 [
1 G; d/ N, A7 `9 e8 y( R5 W
0 i; K/ ~8 h0 M; K[
7 {) s/ R! Y. E- h# e t! } {
% r7 p5 Z# B$ J* o role: "system",
" N. h' D" P( ~4 }+ b* u 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."
8 i) b; P2 x( {, s },& M3 ^" i) B0 c5 e/ f! \
{ i; \" r- U5 ]; j3 R
role: "user",
' s4 G' j5 M& R+ O content: `Use the following passages to provide an answer
$ C1 f+ E$ p1 t- k8 jto the query: "What's the makers's schedule?". ?8 S1 y" Z: T+ @: l& _6 V; r
1. What I worked on...! H& h, u; g- c, B. f
2. Taste for Makers...`
8 n7 f$ ?5 H+ b+ D8 E4 ^8 ~: ` N: Q }3 M- y: j3 \9 Q$ o' h. ^
]2 U- x0 }6 n! v, I3 Q! {: K
3 H9 V! b- A. z0 F7 w" I
& o5 E0 m+ J- p" C) M! A& v$ F: c这样ChatGPT在返回结果的时候,就会加上你的数据集。
; b u8 S, R3 Y/ h2 a! Y c, G) V0 O+ |+ ?- M
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.; n5 B5 v2 _/ D
4 ?# _' u# o0 p5 v1 Q- J" x
总结" F3 r9 ?/ d# n. \% e) f' u
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。0 G, i' t3 g$ l0 _) M
8 }- d* K/ y5 h- [: U. F+ _而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。& B& x! C% @1 {( m# s
. R1 ~9 p$ s4 N$ w
参考* ?: h* H3 `1 Z3 a% k& g( B
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客/ J8 R# f( _. b M* u( [9 O& X
8 z9 a0 N; h! w搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt- G. |6 W: M- u- Z1 M
, V: P! z4 ^+ [9 X( ^) e1 ?& I2 {% A2 F0 H4 Q+ t% Z* N, [5 d( y2 A
————————————————
; Y. }# A9 U8 Q y版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 c w; Q: t$ W2 l! }) k" z原文链接:https://blog.csdn.net/ghj1976/article/details/129676157% L. U( c" W6 B# X
|
|