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

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

[复制链接]

347

主题

564

回帖

3679

积分

管理员

积分
3679
QQ
发表于 2023-5-29 10:35:28 | 显示全部楼层 |阅读模式

, @: K5 ~/ [1 }2 KChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
) u6 Q% F, P2 N6 o2 h4 k! m
% v1 h8 d4 M1 v以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。0 f0 G3 R+ r0 D
' k8 P2 M/ b" [+ n4 Z( k
我们应该思考如何让AI在专业领域中释放更大的价值潜能。6 p- T: s- Q, B9 A; [3 d/ g
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
) t5 r7 J# y* S* y7 Y
5 {7 _  i1 t2 C% }" R4 r8 r# u; T以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
' p8 Y7 k' D" t5 U  c. l* N
* T' |9 ~9 b) Z# W& S  E/ Z2 I; _9 e& |+ \/ Z5 J$ W
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png : T8 ~3 P- E2 R0 h* ]" @1 q$ T
# H6 k$ K, s0 {4 f& X8 g3 u

- t, g5 V  x1 Y# ^/ m: p4 D
" f9 U# l: B2 Q, `  E0 d& z/ D一、微调(Fine-tuning)注入专业领域知识
' z# w" m; B2 N& M. R微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。6 w( N) s' _6 m, j* a
5 \( U7 |1 I; A# K  c$ p
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。; O" M0 f$ t2 }6 g" m  a2 X) @; r" |

8 C3 X. _0 ?$ X  s( C$ N. s; [; K如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
% z% b3 Q( i/ o( e' M7 h
) N# A# n' R4 d  S5 m. q* [OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
7 A) k# R% v8 e0 b3 w% U9 _$ X6 i6 P: z
, R( G0 L7 P* C, F& T从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:7 ^( w2 Z2 [: A
' N" t" X! y' u6 a) V: i
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。  M6 P$ j7 S' Q" D! k* ?
- \2 `: n, E8 w' s% H  s
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
' v( u' W" s7 f& n& g$ U, F( a+ O/ n3 w4 i& M, L" F
下面是一些数据例子:
$ p' P5 A$ T- n6 n# C" F* Q, @
8 ?' m; l" V6 Q{/ `$ ?6 M% i, @2 E
    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", * b: X1 \' ]8 F% \1 v, f7 F# i' ~
    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"# ^3 X) Y5 m/ d  M* {4 x
}
. f0 M" n5 F0 C0 P/ Z0 @更多的例子可以看如下链接:
6 X3 H  ^! d8 M; U! _
5 {5 i3 j2 y& cGPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub2 r4 J5 J/ ~5 ?* G/ Q  J
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
$ r, Q4 y9 Q- `( c要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。6 j" v5 d! V! D: o6 k$ T

9 H3 h8 K% u0 V% v二、在Prompt中带入知识' w- g/ l; ^$ _/ Q: q
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。6 x6 C1 t% e, s) Z

! M/ i$ X& l+ o' h: w, p输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
& g% h0 M0 _* s8 c) w7 z4 f3 p0 O- |, ]5 I+ S
下面是一些例子:
- a" j6 w) C  Y. H& A( |$ I3 ]# x8 Q( M
例1:作为专业DBA,回答SQL相关问题
. w/ k% V5 ~# F1 J1 L  R5 K9 T" j这里在输入问题时,引入了我们的数据库表结构这个专业知识。7 B# W* f  T3 u  |7 S

3 M% l5 [9 x+ n# D. A问:$ O. u5 I- b) T: O4 k3 L; O

% Z4 w& p( Q3 I0 f' z/ ^我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。* O3 |" `5 H+ k3 e, E# g
3 @4 _5 [: M5 D: `4 }" ]7 r
我的数据表结构为:
7 q1 ^1 Z* O- }( g7 h( u
  q+ [. s! ^6 A* `: _. aCREATE TABLE `user` (
- a6 s7 d' w3 X) ``id` int NOT NULL AUTO_INCREMENT,
$ x7 k6 `% Z$ M7 M. q`name` varchar(255) CHARACTER SET  utf8mb4
$ z+ m3 k6 F* ]# h7 e, t      COLLATE utf8mb4_unicode_ci ( I6 t$ Q& a& d
      NOT NULL DEFAULT '' ) H: U/ Z7 U- E* y, q
      COMMENT '名字',
/ s! q7 \) u  B/ A/ n& [PRIMARY KEY (`id`)
: @# ?7 _3 {  ^" Z% t) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 # A- {+ a1 t6 |. q, E
      COLLATE=utf8mb4_unicode_ci
3 {/ p; B. f4 P% v" H      COMMENT='用户表';! x- J  Y# w* t6 X
我的需求为:根据用户的名字查询用户的id/ P" O( z7 A; v. D* C9 O$ U

% F$ A( h! }) A4 w" c1 x" K7 c7 Y回答
$ V, W, D7 a, {3 q# E4 l
' K2 h) D! ^4 y/ I好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:1 ^2 V8 l3 `  f6 u% y
3 ]0 g: Q" z1 p+ y
SELECT id FROM user WHERE name = '用户的名字';3 ~% ?  [8 H2 n0 {4 G: p4 X
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
, M) i4 a$ ?) s+ S  W4 N) o* x) O6 m2 A- {! r* I0 R- n+ O
您可以使用以下SQL语句来为name字段创建索引:+ ^3 E' t3 a, E; J+ ^& B  W7 h

3 t! k( K& v5 F% L7 HALTER TABLE user ADD INDEX name_index (name);0 ]9 h/ B0 U/ n8 U* T& e
此外,为了保证查询的效率,您需要注意以下几点:
6 ~/ ]2 N, T/ a% q
, {3 O4 t8 k- \" w& ~- y数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。% ^% ]7 y$ r' O) z0 w/ N
8 q. f$ u5 K* E+ q9 R& g2 K: Q# a% @
如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。' z7 L' Y. y8 ?  `1 y
  V" w! m4 o4 P0 W
例2:智能客服9 I+ o4 L8 `: x* u, l
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:& I8 P) f) N& T# L3 y" y2 I
6 g& u+ X1 ?6 J4 H1 {& K
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub- T3 M4 q/ N7 ]/ j( ^0 }: \

) Q" M- y! P* o/ O下面代码通过消息对象的数组注入了一些上下文知识。
5 V4 u" U' I; X% j* J: \6 N7 f
) u0 B  [6 x- C' k6 z7 R9 N! C: X % u4 O9 L% t8 z2 D+ j* [# ], D
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
: x) l5 z! K$ W8 ]3 A5 H& }( Oimport openai
+ U6 i8 P4 z5 m. d& V3 R1 J0 d* o
- K. q: Z6 W4 V8 x9 I3 Qopenai.ChatCompletion.create(
0 u4 U: j0 O4 U3 ^, w% Y0 o  model="gpt-3.5-turbo",3 W$ Y' }! l9 R6 Z) ?" N% B/ O( X2 Q3 z
  messages=[
; k! \  S0 G% G7 |: s        {"role": "system", "content": "You are a helpful assistant."},
! a" d, P! G& K- h# u$ D7 X3 }5 G        {"role": "user", "content": "Who won the world series in 2020?"},, C8 i3 D2 g, h$ Y8 J5 ?6 D
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},& l# ^+ z/ e" J4 l: X  s
        {"role": "user", "content": "Where was it played?"}) {6 ^2 d  x1 W( W' C
    ]
/ S) T* a0 ?2 D$ y)
0 E& A+ u3 U! o$ K 2 L( A: F0 J7 Q# F3 n) N! M/ J
其中
. P# U" t* y% Q/ T6 _! q7 }
, F5 N# A) R* x, O) z系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。/ |$ G, [: q2 Q2 D( K: B* y
用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。  I  a0 l9 K- R- ~6 y
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
4 i+ }( O4 A" ], g通过上面的方式就可以完成专业领域知识的注入。! ^1 l. e# M& B- ?. z
! J9 s" |& M. b$ {% V9 }
例3:通过外部链接把内容带入$ J8 C5 S8 g4 A% u+ M5 v
下面只包含我们发起的对话部分,会话结果比较长,省略了:9 x6 V3 S, R: t. `  ?' R2 X+ s8 I
% g* p' A( H5 O+ W$ d3 F
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?
7 V- S! {) s: C2 f...
. X; j5 z6 p/ t1 R+ p0 RUser : Microsoft 2022 Annual Report2 k; o5 M  X( n
...' W' d* A8 ~+ D; e* Q: d; }% K7 w, R' o
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?/ S0 T; b" {, ]  E
...
6 L+ k7 ~9 G* {  K' x4 FUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom5 X& p1 D2 V+ m, X
...
$ C6 [4 {3 X$ a: W+ e) r/ oUser: 您能否从Nvidia的报告中提供更多财务见解?( u4 U8 k: V9 P3 F" S: \  W9 K
...
9 ^' w- U  Q1 a# OUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
5 x" i* w# E* D# F  V....
( w. t' g+ h" O' M* g& \5 ~6 N+ j; H9 _+ ~" d
User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。  r* u1 q/ G8 |1 t
...
4 d7 h2 |& b4 D, O- f+ B: ^4 bUser:预测下戴尔未来12个月的现金流。
  T5 @( U5 A( F" u. ?/ ?$ @4 r6 m8 M# @3 r2 [9 ?( y
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。% x& c2 U0 j6 u' e+ U1 f( x3 B+ {
) y: g7 o; u& }5 y5 U0 _4 D
适用场景对比
4 _0 S7 n2 V0 R4 ]1 `7 q& ]价格对比
8 H( o0 K  X8 `5 `1 A) C& fOpenAI的相关报价看: Pricing  e' d# {0 G% Q9 r. Y# n
$ E) @7 E$ L- r8 Y2 ~8 P( `
对话类:GPT4远远高于GTP3.5。
$ S, W+ E/ |. h  s  Y  F OpenAI的相关报价.png + M0 |% x) C4 L8 I

7 M: k* {! p' i1 u4 {( F( k1 d1 }4 D( k: Q2 s& j' p
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。6 V. l, J/ E4 T- Q/ c& y; x
% m: F5 Q3 F1 T
/ Y: p& ^6 q: d8 m5 T
Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
8 {, K3 y+ ~. r# J9 m; s9 e$ {! i6 ]2 F; D- t* R8 {0 z
  |. I: a( F7 H& B! Z

. ?( E* R$ I2 k8 y/ H9 sGPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
  \4 |  X5 z- {+ Q* M% c1 c9 g- {: p6 H  @
而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。# \8 u1 a* c# r4 o# n  w: I

! a. p! F: s! |9 D8 h6 z- y1 E; m所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。( G6 h, v$ _5 ~5 k8 d/ n
0 n# M5 f! a; y0 q( {
长度问题
8 g) j7 w3 l9 {* yChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
5 h& L4 {: w0 \$ _( E$ U5 q( w. O$ r  D9 u7 D) _/ `# `% A
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。  a0 d" s" J* s, S
# a- e/ h7 I( N# F0 x9 F/ ?
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)$ g. x$ Q( [0 ^$ y  \
% O: [( N- v( ~/ R
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
* W# i6 a: s. Q6 c3 Q8 q$ D( i! N6 w3 h" F1 T' `
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。$ _, I0 c' C& Q! Y+ f

+ A  T, O( V8 |6 o3 ~, F比如说用户提了一个问题:3 m2 a- B; ?" J) w& v$ A/ [  Z) |
0 V0 I3 Y& r2 P% ~7 k% R' [; @
“What's the makers's schedule?”8 Z4 X/ D, z- F" M- X
/ ?2 e* r; ~; m/ N/ o$ d
从数据库中检索到相关的文字段落是:
9 T1 r$ C* O& L6 B3 O4 F# t/ i
$ O! b  ^) `8 w) [! O: v4 G, h“What I worked on...”# g. y+ _; H9 W+ g5 w0 t% N# a/ n. |
"Taste for Makers..."  I, h3 m. f, x
6 s+ _! L8 f. _  m+ j
那么最终的prompt看起来就像这样:
$ K6 C5 `$ o5 L2 _- n, G
5 P* B0 E' W# I2 j; ^  O, d8 B2 U
7 @9 K: z6 _% u2 a[
* ~* r1 h: z7 Y* G {8 _' E. x$ |+ ]5 Q0 I4 C
  role: "system",2 N7 k* m# Z% u' b1 H1 V
  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."
+ E4 K+ [$ f  |( m* F },
- U$ }& h# f7 Q; i' j {
3 D, u! P4 Q  N) m+ B  Y role: "user",3 _8 @) h2 S# A3 ~" ]* m. G) F
content: `Use the following passages to provide an answer
% h+ h2 @# u7 \9 B8 M4 z3 gto the query: "What's the makers's schedule?"0 `; h! c3 y+ ^7 K- X
1. What I worked on...
, U2 y; s2 g2 P( F) ?2. Taste for Makers...`' `: G; n% P1 |. b5 t  L8 ~- ?  F  ^
}
  `5 @& u/ }# X8 `- P* h' n]: N! ?, ~& m! t" Z9 s

( p) m' V) e! \7 E8 Z& W
, N! _( L6 w* d7 X! t3 C: t& ^这样ChatGPT在返回结果的时候,就会加上你的数据集。
  n9 `( o! q; j# O# W4 t4 [) T6 ~: f* K$ |2 D& `" d7 U
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays./ D. I: D" z2 e+ e
( W! X, v$ w; z) y$ n
总结
% s4 q) g! n: R# t/ Z6 G大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。" T9 u! \' Q/ a3 E
/ B% n4 b0 X/ r  Y9 Q
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。5 T0 {7 U7 d, U8 W9 K
* H9 L0 t4 K1 F8 g7 r
参考
: e+ u: ]6 j  E7 n) w( ~0 d如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客  k. A2 G. W) v: W) a
1 |8 i* t0 A& g. @5 P3 ~
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
( E' u" y; l4 a
5 d% n+ S7 ^) w  n2 f2 u0 H3 C# p9 v( [
————————————————
" v4 g- V. O- q版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ S! n: q9 H2 |- A$ Q
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
3 O6 ^6 A% z2 b9 l
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-10 16:48 , Processed in 0.014237 second(s), 3 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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