|
, J) t! X7 u% S( \
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。; S; M, s4 p! i" G6 V4 {, P
0 m5 `0 ~8 Q" b* K以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。' C$ |4 I; b- i+ Q
h o- [3 O) i) U6 E3 z我们应该思考如何让AI在专业领域中释放更大的价值潜能。
" @2 h4 M* a9 d$ _- `/ G就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
* j" q4 w, T( r6 E3 y
; j" K/ u4 w; i9 X3 n" j' ~以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。- s2 h. {& z7 X! a& C
8 t* U7 N$ D6 o8 n) O" I+ k! I% ~3 i2 _& g, H
U' a2 V( v" x2 R
" U: G6 p( G; x3 T6 I7 z
/ o! j$ S; r9 ^# H
1 I5 Z. ~/ @# q6 K4 v2 y+ l7 D3 O
一、微调(Fine-tuning)注入专业领域知识
7 a6 A/ Q3 a, v( B1 }+ W2 m V$ j微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。
: [$ w2 K: E( I& o) T* X9 O+ y1 e" T! Q1 k, K: K( D
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。8 g) `9 a! g' R2 `
" c! P1 q" ]2 f5 }如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
) C) I. U8 {3 t1 }6 \4 f- T+ O5 n6 I2 n5 a1 ?, Q
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。' r; z9 ?) j: ^4 e/ l0 E6 d7 g
5 K0 o, j9 H7 b' g4 A! O% ]
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:9 x; ^: k* U) v
) R( `1 Z6 ]( P& I9 n# \( t* m( cprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
/ M7 X/ {' V0 L/ ?6 }: h. `4 r9 B$ \
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。# L6 j. v- k+ G
+ Z ~/ c ~- t( q7 }9 X下面是一些数据例子:
; \& G4 K" s; Q" k/ y' H$ @, s& C/ E" C/ e/ W0 V
{" ~ o, ]2 b$ @6 C% d
"prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", 4 K! ]( ~" r ~; U( T
"completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"+ \) L9 f7 e3 q! h# O
}
$ B1 R, y" F5 a5 a3 c更多的例子可以看如下链接:& h: B# x+ k: @& p: Z+ X
0 x( j0 k' }+ B$ P3 H, A" aGPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub. x7 \0 t0 m6 }8 F: {
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub/ R3 J8 H7 J: Z
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
+ Z$ E1 O0 K" I4 e2 b
* w% f# i8 d5 E二、在Prompt中带入知识) _, t1 V! J6 E* W
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。: n `8 K" E) @: [2 X
$ d7 M- C5 C' e" H' t: n1 k ?- L
输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。7 Z1 C- u+ [# [9 f. u( `
$ m, D3 g. J& M7 y. O下面是一些例子:
9 i& G) m4 j) o! H: G" S
1 B* l7 P& o3 \9 r+ n, K8 S例1:作为专业DBA,回答SQL相关问题
, c) b, _9 q) n* z3 B1 R+ ]# _" D& P3 X这里在输入问题时,引入了我们的数据库表结构这个专业知识。
3 H6 A0 H8 \) l9 T% I1 G
9 l0 n0 @& {& Y$ M" ]2 t问:
* A+ K. m. X, Z4 m1 `: Z, B2 j7 w. {8 C* | O8 ^
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。
* k9 A+ R3 |8 u* H% Q, B6 O( r
- ~: U" u5 f; J我的数据表结构为:7 m7 u! N8 q+ h2 x+ ^+ r
3 z' \% Z7 k7 r) \& v @* `
CREATE TABLE `user` (: k. F7 K1 P- L, n
`id` int NOT NULL AUTO_INCREMENT,
- Z7 S+ C0 X' B0 A1 }9 S" C`name` varchar(255) CHARACTER SET utf8mb4
& |: }- h) z# j( A1 N' N COLLATE utf8mb4_unicode_ci ) k9 g# U" C& o4 \
NOT NULL DEFAULT ''
( S; y6 s' f* b! L: q" T COMMENT '名字',/ {; ^ k% L) i `& W- L0 A# b
PRIMARY KEY (`id`)) e8 W3 @( i0 l5 v- U( ^2 z
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
% j6 [! k$ I8 h" I+ ?# b0 S COLLATE=utf8mb4_unicode_ci 2 U8 W8 [& H" S+ q4 V8 K; ^
COMMENT='用户表';$ [! B3 l( `3 \+ \& Q: H7 ?: J
我的需求为:根据用户的名字查询用户的id
Q3 f0 f; C6 D) z9 t9 s U. a( `, J
2 d. l5 U* h' y6 ]回答+ Z4 u' N6 w; V9 _% s/ A
1 w5 D# R+ g# {/ p* a' S- ^3 b/ h
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:$ |7 p0 [! j! T! P
' Z: w2 L" O7 p: {& G
SELECT id FROM user WHERE name = '用户的名字';
+ }) o. X3 ]' ?. p/ _% V- l/ b$ f这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
) P6 _0 g% ]) @8 _, p+ R8 R
( _# A' j, Q- \您可以使用以下SQL语句来为name字段创建索引:' G4 J# N: |/ C r5 ~
1 ~4 W" l# P* ]9 S. y+ T" qALTER TABLE user ADD INDEX name_index (name);) p* q2 c, \& W2 \/ a/ y
此外,为了保证查询的效率,您需要注意以下几点:+ }7 h& ~3 B% S8 c3 p: `3 V0 G
+ s& i2 Z% g: S+ {1 x' n" R
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。 J3 h0 Z/ }1 P( W+ ~
0 J- B1 n& _ n. R6 B2 H3 L: Q如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。8 \9 u, Q/ P3 p+ F; W, y7 n
9 C! Q% n% V X6 |0 k0 j
例2:智能客服
" p. u1 R8 \" t比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
7 x3 @& Y6 Y7 o1 _0 P4 `
: k0 P$ d* y; u& ]lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
2 c0 [8 @! w) h7 `1 n" C4 X+ ?# ?$ x/ x# M$ _1 z4 {
下面代码通过消息对象的数组注入了一些上下文知识。# }+ t+ N, l* H- O+ O7 B
8 G. Z8 L* h" z$ D; ?
* ~& m, p1 m; B: V. a# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
; H, z, E4 w6 G+ L) kimport openai( @5 M3 d5 z. h! X$ ?- e8 \8 e9 D
r# n6 O" \' D# d7 `& B# {/ t
openai.ChatCompletion.create(5 b5 G( W" V; W8 L- x' P1 H
model="gpt-3.5-turbo",2 x5 _& i% a& R5 b/ ^, i% c; I
messages=[
& u3 y* M. n* p" U0 U9 P {"role": "system", "content": "You are a helpful assistant."},* U; k3 i8 y& F; l, E
{"role": "user", "content": "Who won the world series in 2020?"},' I) K1 L% p, F# J0 H$ z
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
! w% F& C. K" V1 ] g; H, U' ? {"role": "user", "content": "Where was it played?"}
8 W0 c9 t& {, Q4 n8 F# q ]/ E& y0 m6 p- m6 M
)
, P. A7 Y* O, I8 M * r! p" }9 h4 d6 d! s! _: c- e5 r8 L
其中: Z( h5 g* m% O- F, Q
H) Z9 W6 o/ l$ U/ f+ A$ K系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。0 g$ S+ Y2 s3 w2 c+ n: B* _
用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。- R$ E1 _/ u; ^. F
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。/ [1 l- U# ?/ M7 M
通过上面的方式就可以完成专业领域知识的注入。) i5 V: X) X" |& w& T
) u; ]/ N9 x }9 D3 U) `* D例3:通过外部链接把内容带入
' c) F- {) V' ]! R! P$ b) p) X$ p下面只包含我们发起的对话部分,会话结果比较长,省略了:$ X6 B, Y4 Z' y7 \2 |" c) m
8 q' c K* |& D# e/ }; W/ w
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?+ ^6 }- L. D' C
...
3 E, s& H5 Q! n/ k- H3 KUser : Microsoft 2022 Annual Report. m$ l7 J) ?0 H( L5 X/ }
...2 Z) i* ~$ J4 n @" a
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?1 E, [7 J2 }, u2 z
...5 \6 N; ]/ H2 ~8 I# n& ?6 [
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
+ g# z8 t) c0 ?3 @8 J& J...
. d$ A# L- b- E0 P5 a4 `0 {User: 您能否从Nvidia的报告中提供更多财务见解?, L- N) C7 J( a# H8 p1 ^0 `
...1 s+ w$ E; T0 W& S( _- Q( u) y
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
% F' ]& V6 _# ^1 e. W5 ?( Q, y! f: j....5 y3 ]8 E$ a) }# e$ j. x4 T; P
* z3 ^: R# k5 `- T# T0 V) L9 b
User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
4 u1 j5 u) K8 j4 Q/ ]: N, F; T...7 c4 S: W" ?# x3 W
User:预测下戴尔未来12个月的现金流。
, j7 }/ n+ l' d" A O1 A' e2 s+ h6 |& F8 {4 i" v
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。3 k: Q( U+ y, V& @- {6 N
X# F* j: ^) ~
适用场景对比
2 O: G3 d& z. y0 U/ Y价格对比8 H6 P9 c# |$ k2 Z
OpenAI的相关报价看: Pricing* C* k9 A& B6 _$ ]6 S0 W, ~) F) k6 @
5 v& l* V& w. c' w3 T7 @
对话类:GPT4远远高于GTP3.5。8 d! `' z1 p/ R' d* z, h7 V7 b
4 C0 F6 Z6 Z+ e Z" E7 o- p* S" M5 N6 G. R1 P3 h& Z. |
) X0 h- [1 v# \' { J: I
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
L0 S6 t$ M4 {
^% R( k) J$ b. T9 P' L# W! J! Q! t. n: ^
- r& L/ e* x a. A4 G' F9 m5 D6 l4 i' t7 l) J O
+ v. z2 A5 S7 i$ T! h' ~5 @1 g
Y. v, U k' _) _ n6 \ S$ NGPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。 s5 l) Z& N9 g
& D1 p W! _+ w* A" u/ G而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
5 V. \9 K' s! B" U) f; I2 M" K
4 k! P8 D/ Z& `! J; w所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
. ^' [3 x7 U# y! W% n v2 b& F4 Q$ y) h; S# A' A F8 V
长度问题1 K4 N0 C m1 D& ^5 B$ d
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
4 E8 I7 U/ @* _
# F' D) g3 { v/ i; [! k) @% V5 e但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
0 S) y" I9 d6 q4 s |* _4 B' P' H1 P. U9 M
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
0 Q/ @7 D- h# V2 L) |$ `) r, A: B4 F: j1 z0 r( q9 |( w0 N
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
1 I5 U/ W$ Z% ^' _) o1 Z# C8 T: E/ ~! W
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。4 w/ @" O/ h; X1 u s4 q. K
) Q9 q8 q, W" _$ A3 O& j
比如说用户提了一个问题:5 p: `& o/ e# w
+ D, U/ `; Y2 f3 f# L3 p( L8 j+ y
“What's the makers's schedule?”/ A8 r9 z! g7 H C$ {1 |
: X) F# \6 Z: C: x- t从数据库中检索到相关的文字段落是:
. o _4 X' F8 O4 Q+ R6 J1 t2 E3 Y. M G& Z! N/ B+ k+ C
“What I worked on...”
5 Y. A, p# v! c"Taste for Makers..."
1 g! j4 @ l) K9 T4 j3 R, \& s
# @9 c0 C5 c) f那么最终的prompt看起来就像这样:) s, e! A V" x4 j% [4 r9 E" s5 ]
. O% P# m: o3 F4 i: q
r# b8 H4 `8 _8 ~7 T7 u% r[
4 [* X4 H5 G: s {% i: {3 C$ K8 B5 e9 {4 U
role: "system",( i" _, F4 x$ W z: A4 N, n
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."/ g: S2 I$ |; F$ S
},3 g! D; K6 {6 V: `( M
{0 X* H9 b l4 [( @
role: "user",
5 r; Z7 ~4 M# Q: L( {& ] content: `Use the following passages to provide an answer+ a7 w, O# @8 W8 r9 ^
to the query: "What's the makers's schedule?"2 C! r* V' f1 ^. Z
1. What I worked on...: u1 q6 K8 y7 y; s" q, O, B
2. Taste for Makers...`) W$ L/ B# g* H8 s& S& c$ c' I
}0 z' e5 }* @: D
]$ o/ e. W: B# M& u( {. g" b
+ K+ u- E0 a1 V. `
* a1 b- T& t; Z L6 h, S. ~这样ChatGPT在返回结果的时候,就会加上你的数据集。* O% |2 x8 W% o% D0 @7 @7 }; k
. D' W* ]; y) j" c" P- \, ]: M
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.+ ]+ [* u' J) H( T% G) F: Q1 p
7 b# M5 k/ o( F- |9 o3 e( V
总结
! s6 L. K# U, g* n% k) M+ N大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
0 N2 G- G6 B. T6 ^; k. |' x# E$ n+ | V) g
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
) m8 Y- _) P4 P1 K% A# L7 e w) I! e2 s1 z
参考
$ `3 f" S# A3 U2 s5 n; n9 q2 j, k如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客; Z: m' n( z& m
. X, X% h/ i3 }0 A4 x1 {
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
# g1 _3 t3 Q- v8 e# a# V& l5 ^0 H7 M! _6 q+ A
/ a- f# r2 |* i" k: D————————————————1 ~2 {1 J, ?2 H3 ~% j
版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
; P1 F3 z- Q1 H! ~4 u原文链接:https://blog.csdn.net/ghj1976/article/details/129676157) g7 v5 X, @8 O: ~/ {8 t" p) v. F) s4 w
|
|