找回密码
 立即注册
查看: 1910|回复: 0

如何把自有数据接入GPT大模型?

[复制链接]

408

主题

596

回帖

4038

积分

管理员

积分
4038
QQ
发表于 2023-5-29 10:35:28 | 显示全部楼层 |阅读模式
# G0 e: [( Q# ]: ]8 X
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。4 W, J5 n0 b6 o6 P% y* w$ ~

7 Q) Y6 T& p+ [" M) l6 j以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
* f* P" D# b0 [  U. k6 h
" V6 k6 f# n" ?/ K5 Y  _我们应该思考如何让AI在专业领域中释放更大的价值潜能。
6 H- W( I+ N, p  k2 c' U, {4 ?  h! t就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。  c2 v% }9 Z+ M! x& h% e
* x9 k" a# |- a
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
6 b" P7 W, l/ ]5 i& I! z, b: d* _+ H' v0 i& b( h7 l
. W3 V* ~2 L& W' G4 t* K
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png
* L; Z" R: x5 F0 ^! y' X/ A* V' \4 z3 T2 d/ D- P( f2 E; j" b

, v+ v9 M3 O: B+ @
, v! S1 [6 g5 ]; v% D一、微调(Fine-tuning)注入专业领域知识
1 K3 j- g0 U" d. T+ v9 F* C3 d1 l微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。  O1 C5 f1 W- [" ?

+ _1 {6 W4 Y) V2 e传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
6 t2 H7 t; _  j+ L( Z+ P2 n. I
$ [' }1 K: l7 ^' H& o9 T$ O4 B6 X如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
( _4 B9 }$ ]  V3 T# H
$ {3 n1 A( X' R( x( xOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。  y* `- a( S; {# ~; ]) s& F. m: z& b

1 S' l) q4 A" K6 G& r" ^& }从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
. q- w* z9 M& w& X( h
5 g; T, ]" r) Iprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。; F, Y# l) @6 Q( @6 W) n

( A7 h% T. h( x$ }9 ncompletion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。2 h2 W3 F- F4 j/ A6 ?) m

7 I7 J, r4 m# y- s! G5 R; J下面是一些数据例子:* |8 W% y( x9 s6 X

; q. F: M! r, K5 d) t, P3 Z, W{6 x/ S% U& d: T/ |' }# b  ?
    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
$ b6 l5 f0 l! _' r% H" M4 g    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
1 J* [* ^* Z4 W2 Z" \  d/ f. t}3 l( Y5 O# T4 H7 t2 q& ~/ j
更多的例子可以看如下链接:
$ V: L% ?# j& ?
' Y1 g& t9 }% b" `( l1 d: AGPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub9 J: e/ U' O2 X  z9 ]5 z
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub& h1 m& z3 _7 G. r: k7 @7 O
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
6 f$ S# W, x: C8 F: _8 l0 k: J7 p
( s8 l; u9 L! d二、在Prompt中带入知识6 j$ V* P: K3 v/ o: J6 M
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
$ O4 K5 f" r' q; x! v7 d1 a- R7 T& R3 O. R  b& M; f3 s- I& _+ A$ s  }8 W! A
输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
9 }' n3 r8 a" n6 d! |
3 g, r' ?/ w/ c2 v* w* Y2 d8 q下面是一些例子:. ?$ G$ g& C( l* L

; S; x% L6 F6 P  b  e3 e例1:作为专业DBA,回答SQL相关问题$ [* K7 }" u. P9 i2 P! ~' M
这里在输入问题时,引入了我们的数据库表结构这个专业知识。
5 p1 o% U# ^! L3 `* s' k  d1 {) x) K1 }1 @
问:
7 w4 y* K) K% r: w
. s# x$ z. c+ U8 y/ Z4 R4 V我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。
/ G' m5 o7 y0 `& k/ G, E3 q, H0 m! Y  e; h( d; F% u# y
我的数据表结构为:! j2 T3 n  p. P  ~( `

. B) q% `) b. i4 BCREATE TABLE `user` (
& H9 n' u, ^' G% M0 u/ S9 K`id` int NOT NULL AUTO_INCREMENT,1 l, O2 w; H0 k- i
`name` varchar(255) CHARACTER SET  utf8mb4 , b# }4 {- g4 }( o& k
      COLLATE utf8mb4_unicode_ci
9 Z2 x; d' T/ ]/ u: S8 I      NOT NULL DEFAULT ''
; P% Z& O* h& R# _' d7 ]" m9 O      COMMENT '名字',
3 ~9 X$ l# p" ~PRIMARY KEY (`id`)" i! N4 I, U' }9 X, I8 ]7 O# l# b
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4   B7 j" A* R$ o8 ^
      COLLATE=utf8mb4_unicode_ci
1 g' X7 A3 j& m7 m, Q* _      COMMENT='用户表';
7 c7 F& l5 T9 U, C/ g: m我的需求为:根据用户的名字查询用户的id
6 z9 C+ }2 i% S9 {
  e" E# [. F; |/ j; Z回答
" v  t4 |' F+ G' u* ]4 @0 C* x; v7 `: m1 ^% p* e
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
$ ?& G# q" ~$ y3 r: m& U4 R, \1 w  I
SELECT id FROM user WHERE name = '用户的名字';
( h2 t" }; D' |3 I& Z这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。9 M3 g: R8 k+ G7 ]! ^- m1 T2 R

3 V  E9 x! I) S/ e/ P# v2 b( a$ _您可以使用以下SQL语句来为name字段创建索引:9 |( ?/ r/ h$ G  J. F, S

8 P: u- Z' B" i/ e* a) b7 QALTER TABLE user ADD INDEX name_index (name);
6 B" V% K% C& h5 G此外,为了保证查询的效率,您需要注意以下几点:  t6 B' i: a6 ?7 V
! k9 g% D$ N( D0 Y/ X. q' D2 ^
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
& r- W0 y2 V1 V7 q4 ^. T7 l0 X% S& u! X% i
如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。  }$ k: Q$ \8 y. |+ G4 n) x4 Q  h+ R
1 b& k5 c+ N- U% C+ i" U; ]
例2:智能客服
6 Z( I. Z- V" v: Q( N& V- D7 y8 m比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
! Y- v' j9 x1 w" j2 S
, J; M; @, ^$ N5 o4 \- M3 Wlanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
5 O% p9 Q4 Z! @8 ^; r) C- |" X. `( A* s
下面代码通过消息对象的数组注入了一些上下文知识。
/ W2 F. _6 Q2 e. k; w4 A6 B2 A9 i; D  H1 l  \
+ {, l: T/ G, }8 l: |; C
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
8 B  o) q% o) \( timport openai2 p, i2 l8 b. d

  w7 X/ `% _/ N0 Sopenai.ChatCompletion.create(; s2 p1 m4 w( n: r: q
  model="gpt-3.5-turbo",
3 F5 j3 _5 K0 ^  Q4 O  messages=[1 l+ U1 ?1 M/ l0 C0 W6 H
        {"role": "system", "content": "You are a helpful assistant."},
) ]! \/ y6 j1 N, y' Q' j9 I        {"role": "user", "content": "Who won the world series in 2020?"},  j, @+ Z# P. z( @0 a/ z4 m" n
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},) n3 W4 c- M3 J% Q
        {"role": "user", "content": "Where was it played?"}3 p  U  c* {. t
    ]
2 c9 m. f3 `6 S! K9 {0 S)
0 m5 E/ [# G0 v
7 y1 W# W3 V$ s其中
' ~# U0 B& T* c8 _: K; d* m' ~) l
5 }& h; v" m8 C' d0 Z系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。5 e4 c3 U3 J2 c. A0 C3 |
用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。4 h2 \- s) r' U- ]8 e- }  Z
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
1 P$ C0 ~; H/ ]! d8 Y通过上面的方式就可以完成专业领域知识的注入。' I0 A( j9 [  y+ x: p, w
8 w$ |7 ^3 ~* a. i" y, L2 ?" O% A) y! s
例3:通过外部链接把内容带入) s' [* j, r1 f  c8 c+ P/ x
下面只包含我们发起的对话部分,会话结果比较长,省略了:
" ^  V9 J& W, k3 X" }5 F; B( ~! S4 n# \0 I/ }
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?
- m& V: z* F  A1 q: v* x.../ O+ n1 F, L7 ~/ l/ ~0 ~# t, x$ i! [
User : Microsoft 2022 Annual Report6 _7 A: ?; z5 ]! S) k
...7 M8 d3 y! C! V/ X/ P0 @& t) t
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?+ l$ g/ d2 p3 D+ O
...% l/ Q$ m3 R5 [3 i  m& G1 x
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom& N6 p/ P8 I, g9 [' F: z; A
.../ r* c4 X; A; H0 @; v* y
User: 您能否从Nvidia的报告中提供更多财务见解?) w6 M! V6 T* r( m
.../ y& w( g- e# B/ n
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?' N) d' ?5 B9 D1 t7 ?5 d
....' f& f( C, f( t6 s2 T2 r2 b$ x

+ T# v" I5 U$ K% h- J* i7 CUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
: c# k( i1 ?; J* [3 p...
" }5 G* n+ y3 ?- MUser:预测下戴尔未来12个月的现金流。3 H' G1 N) \" ^* L  t
" w9 b- y* P4 F& W6 s2 e/ Z
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。. |1 [+ J) t1 _* f$ [- m( S) f
8 b4 l8 I7 ^4 T
适用场景对比: b1 M9 R7 K1 h8 P0 j5 {4 v0 d% }
价格对比# r" s0 ~9 {* X1 d
OpenAI的相关报价看: Pricing
; |4 W) v5 a) E4 @& ]+ f/ R4 i% e  z! F
对话类:GPT4远远高于GTP3.5。  P1 v( i* l  l( N2 b  A3 U
OpenAI的相关报价.png
" _) F8 {9 q) Q3 p6 u1 c, s& D
8 p7 U3 O! r6 d3 q. x$ n6 }  d( H' E- }, D  S* e$ N* Q# i
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。7 K8 v# N* \* `& j

* a; u% D: A5 ^! s( ~* ?6 ^! @2 s7 L6 }" ?- f4 }
Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
# t- H& Y! B/ j# h2 Z0 r. D8 K; m$ q8 S8 m2 f5 r

8 u) i, L$ S" D3 C  S/ E- o0 C  A- r9 n
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
* p8 k4 D9 d/ i! ?0 O5 M% G. u3 J# j( q# m: t
而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
0 q4 K, I7 X# p' Z6 h( K# F( R7 O/ p$ c+ u( M5 T4 q" b
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。: Q3 F" X3 j" v) Y

4 {5 Q. k( u  e+ h5 i5 \" l, w长度问题
7 J# o4 q# l  k& T' @4 m! v/ l/ BChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
8 [3 }- U+ y5 G: T$ ~; w" r8 L) f' {# S5 w
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
( y  u$ s) E2 s+ Y* c
& K  o. ^1 m) N# Q, {首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)* V  L# C7 J$ H
) r$ `( t$ ?2 B5 q3 w: L
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。% {$ S  c7 D# E; ?* a6 l

  T5 t4 s) |- o2 J5 |+ e聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
0 ^* v! \" w9 y0 S: n$ T% x9 O( v0 W* ]1 Q/ Y4 k0 V2 V8 D- u
比如说用户提了一个问题:
( f7 j7 X- e  w" Q' Q: J
! P: [7 _8 A  Z: \7 ]  n3 a“What's the makers's schedule?”' |- a; V6 ?' Q, M
* X1 T3 I' d1 o& ^% i' s8 f! O
从数据库中检索到相关的文字段落是:# r) n' t1 F( u7 K; D

2 ]5 S" T, g( R% }* x“What I worked on...”2 h" i, R" H# h
"Taste for Makers..."
( y" V+ S5 d2 {; `7 }, R- u& U4 t8 j7 c9 u
那么最终的prompt看起来就像这样:& p: S+ d8 a5 C$ h
- n( P+ L7 p1 U- {, J# d2 ]
* ?# [2 A/ U8 q# K7 L
[! I: y+ }& A# t8 Q) r, P# k
{
! F5 l  U' K# |- s  role: "system",% F. i& s! G) D; u0 d
  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."" s6 ?+ P: X2 @! I2 r# b' \3 d9 q
},
3 Y% q% d$ S$ g {% A( j9 j) W6 |% s
role: "user",, U3 N1 l" _9 B) M. A
content: `Use the following passages to provide an answer5 E$ c3 u* l% I. D& p
to the query: "What's the makers's schedule?"3 d  F  J- ~; |/ O
1. What I worked on...
- C! f0 s' U. D7 f  C0 U: g+ L2 R2. Taste for Makers...`5 t  e! m: U5 A  e- Z  ~
}
2 i3 i. p1 S! w9 z]4 r* }% T" t5 r2 r2 o* D
/ `: d2 U/ |5 U. Z4 O. m" H

7 Y) J/ v+ T) R: W) R这样ChatGPT在返回结果的时候,就会加上你的数据集。
7 B) b* a3 j! |$ U: l4 v2 J) m0 o# \
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.
/ C% {7 N% v- g4 G$ S2 Y
5 o& U3 l% h+ Q总结
" e% p5 G5 e( x9 W( q1 G( L/ Q- o大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
7 U! S2 u& c1 {- R+ r( n% C2 F+ e
" v) W% ~. E! W0 v而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。; E; {9 |9 C! U' a! ?- o& N# P

" [1 s5 c1 F. T9 v" n7 i; Z参考
3 y7 }8 P6 D1 H0 j" k如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客! p; u% X3 g  B8 t3 @
5 U' _2 y1 ~$ c6 C$ m$ o
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt0 C: ~0 ~4 m( O, ^8 x

9 P4 N  B; A5 u9 m- B4 [8 \" Y4 _; u6 @; E) X
————————————————
# H8 v: C& l2 U: O" J6 A版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& R# }, Q! e( z
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
) `8 N$ ]+ K6 w# l
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|通达创业无忧交流社区 ( 粤ICP备2023021749号|粤公网安备 44030402006137号 )

GMT+8, 2026-4-10 04:32 , Processed in 0.747826 second(s), 31 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表