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

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

[复制链接]

336

主题

520

回帖

3442

积分

管理员

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

- O  l. r* v: u8 h2 p4 F0 O! xChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
6 F% ]/ X. J. j' M# I3 y: p, v; k
: M; ^$ w0 q% {' W0 j以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
0 D6 }# N6 ^& n% Q- B+ r8 ?! A
! K; R( a( r" B0 d* R% I0 O$ l( Y' o我们应该思考如何让AI在专业领域中释放更大的价值潜能。7 T# a* b# N( c2 [) `( p
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
4 L1 [+ k2 r- @* Q: x/ g+ m
: C0 k7 X- O$ f7 c以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。% t1 t# j+ @6 J8 @/ `

9 l9 K5 a) M- r- ^
% H& C4 Z  e8 K# [! [$ t4 a 以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png 8 q6 V$ `4 ?$ f( {  l2 \

8 C' O" y+ ?- X+ U# C
! g% K  Z, o7 c" q; t% B( r; q9 ]8 t; j$ C+ R8 D
一、微调(Fine-tuning)注入专业领域知识
! }' [$ k$ c% f% C, G微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。
6 ?7 A: f6 b6 E/ G8 o$ ]( y! s" O- B0 C9 p8 P3 T) p1 {
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
3 q6 p, z) @, U  w8 d$ ~* Y0 ~& N6 n* z0 ~. s. z
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
- y2 D. {6 A* b8 M8 A. Q$ i4 X2 F
& G9 C& t8 Y6 x  F- }% dOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
) N+ t' R& e: R- p* |
% u. F2 d( D5 \' s从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
0 M, `0 D. M/ W0 K- S/ {
' l: ^0 T4 X: [  m) aprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
. {3 |4 d/ }9 p" H5 X$ [7 E2 k# A( [$ s2 R5 B% A0 F
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
) F$ @, S: V4 m$ f( f+ {3 w
8 r. W/ g9 z* F# ^% _下面是一些数据例子:9 T; g6 [. Z$ G1 j* o' L( H
5 g- f5 N7 U0 u+ r! c
{3 b/ c7 a4 h9 _. S
    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
7 Z0 t4 k8 C  r    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"8 ]. X6 q8 a2 j% [
}
( n* t) U$ l8 f: B0 y& F更多的例子可以看如下链接:
* s& w2 `' g/ Y5 C; R0 J0 a/ R, d" ^( ^  ~& q0 `
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
( x2 g6 M$ D' p9 ]* g- kfinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
: i' R4 ?7 v4 |; u: j# K7 g) Q: |要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
$ K, O8 |* Q  S" R& w
6 ^6 f/ |! E6 R4 y二、在Prompt中带入知识
3 t2 T6 T1 b: G' \只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
  @' \4 @$ k* \) y$ v+ n0 z/ Q
9 }+ z4 x" b4 I: r7 D( T4 a- @输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。  ?, t7 `7 a8 I7 m( m3 w2 {3 r

; U' B% [5 o( @; L6 o$ J0 h下面是一些例子:
+ z0 m( \# t0 b3 O( u1 [: C
2 J+ [4 s5 O4 i- L+ d+ w例1:作为专业DBA,回答SQL相关问题
0 T" z* x5 d4 Q$ z' N5 k这里在输入问题时,引入了我们的数据库表结构这个专业知识。
: G# U4 b/ p: {( ], S( v. Y. \$ [  Z, M: T0 j  A
问:
# b$ d+ G  ~: z/ p3 _* R5 }, X6 A- H9 x* ?2 s
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。1 f+ B5 {7 x: x% ?" {

& J4 s. k4 p. o! J# ?, {我的数据表结构为:' `6 s' x* m" Y$ \$ |# Q
/ `  v, T* v  w' T; `8 Q/ {0 [
CREATE TABLE `user` (+ e8 G/ _. a: N0 R& N# H6 D
`id` int NOT NULL AUTO_INCREMENT,
! q, Q% Y2 ^6 ``name` varchar(255) CHARACTER SET  utf8mb4
$ Y' I" k8 Z; M1 |$ h- i6 |1 M      COLLATE utf8mb4_unicode_ci
0 g% d$ |' \3 s% C) J      NOT NULL DEFAULT ''
  u) t7 \. Z, a% x% D      COMMENT '名字',7 J  {" j+ O, L  m3 t  `
PRIMARY KEY (`id`)6 g4 b( ~5 I8 w- z: N
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ' X  l$ S/ f+ V% W3 ~2 d
      COLLATE=utf8mb4_unicode_ci 8 j$ v8 o8 S& c5 x7 B
      COMMENT='用户表';( i' X" F5 q' U  D/ q, }9 Z
我的需求为:根据用户的名字查询用户的id9 V2 F6 r/ a, I! B# X+ V
5 m3 J* k8 b3 u4 s  E  W1 U
回答( r5 p9 C6 A( `) q
; Q+ F* A' {: m6 ]
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
' c5 ^# b* N3 B. M  s, i
/ O! T: l* t* P- y8 [SELECT id FROM user WHERE name = '用户的名字';
% M2 z0 \* {  f6 b0 k0 b3 ~# A这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。: f' z* \% m3 v

4 t( w# z" x% E+ a! {您可以使用以下SQL语句来为name字段创建索引:! {9 u/ G: w8 G, l5 z5 [, L# D) A3 i0 g
) e" B; s; G: G% W
ALTER TABLE user ADD INDEX name_index (name);! c3 [7 X2 A& ~3 U5 {& V; U& M9 ]
此外,为了保证查询的效率,您需要注意以下几点:
7 r1 `, x5 G/ h9 Y: w. _
+ ^* X  V, u' m  N- U+ S9 c数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。5 r$ V% V1 x' l- Q: v
  u6 ~  G! n' R" A5 U0 x
如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。6 e$ \6 ]/ @) l; o1 Y

9 i5 d  p7 `/ x! T例2:智能客服, Y( ?4 R& w7 o% c( Y" x
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
/ j2 M9 u' @% P  [  b2 v; Z. s$ x! f$ O' ^
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub% z/ O) ~4 F/ @/ z: M/ T

6 \( ?' P+ O5 _下面代码通过消息对象的数组注入了一些上下文知识。$ ^' c* Z* B# ^) X
' D# E9 P+ {) x# x7 ]

# b3 [& I  D5 a* B( ~# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
4 h4 v( B. p0 ^import openai  s; [7 V% ?% B" ^! j; N
0 F2 r. H) s8 r2 X! r' @1 o
openai.ChatCompletion.create(- [" X+ t/ I8 a6 J  q
  model="gpt-3.5-turbo",
' B1 u; J) q( P+ _  messages=[
" t! |1 G2 e) y7 O0 m' c        {"role": "system", "content": "You are a helpful assistant."},8 b) I3 S  W0 |" _( w: A
        {"role": "user", "content": "Who won the world series in 2020?"},- ?# a) ]( {6 B; P, U/ F) f
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
7 ]( k4 y0 ^: P! t% f        {"role": "user", "content": "Where was it played?"}
& A- X  `) y5 L    ]
' b8 ^0 A& g5 [2 g: \" R, S2 A)3 K, ^) [$ v# ~

$ E8 R- a) i2 v0 j" O) y/ e* {/ T; P其中$ y+ o4 K3 e; S5 h
! D3 }! Q* J& C5 H, \. A* }& B
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
  Z0 l. K- _8 D5 v+ F3 r1 e用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。! F% Q$ H( M1 K1 I, i' {* `3 _3 j: q
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。: Y) x( I( H5 B1 T& E1 x
通过上面的方式就可以完成专业领域知识的注入。% s3 T& S3 B2 Y% |
4 @, S+ ~7 M+ }" z  K, x) V
例3:通过外部链接把内容带入; j7 Z/ S! d" h& z- V
下面只包含我们发起的对话部分,会话结果比较长,省略了:
2 T3 Q; G( I# j  q7 P
2 \# c" b0 _  ZUser : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?! l4 o1 S+ F8 A% I4 b
...( k9 H3 _7 _" y0 U9 s
User : Microsoft 2022 Annual Report. p) r' x! p' F. k9 s0 O
...  I! j8 V- D8 ?$ z" ?7 x
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?$ ~1 h: a( E3 ?; a/ g4 m
...
8 j1 g0 z  b1 a$ P4 L$ JUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
' h2 Z3 R* s, v  @...3 P( h: p( z' J
User: 您能否从Nvidia的报告中提供更多财务见解?
. u* u& Z8 l, K3 d( C' I3 T...
( |2 M3 U+ ~8 Y) @User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
8 S: c7 S9 ^8 F* t1 X: O....
: g7 p) j+ B2 k+ Q- Z
( m/ C+ x" I- _8 U: EUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。9 Q9 W! O, x5 N$ H: ?/ Z( c6 X
...0 ^4 C$ E0 K1 T% |7 n
User:预测下戴尔未来12个月的现金流。
  M8 s: A6 H" L/ d; \, j% F5 y3 `2 N8 t! q) C
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。
7 K" s* y4 t7 j/ ]; b, k9 Y" M/ u: \* x
适用场景对比& f& N2 Z2 E# C, [* R0 A% V: @
价格对比1 g8 K+ F) e" H5 }6 H
OpenAI的相关报价看: Pricing, o! x6 g% `1 f+ Q+ C

) P& C" f$ {9 B9 r, [* q6 Q对话类:GPT4远远高于GTP3.5。
) h0 }9 |4 T: ^$ ? OpenAI的相关报价.png
; }. |( E% h5 W( G1 x3 r) n" z* Z+ s3 |: _

. `5 ]+ s6 i0 L  i  P: S目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。& ^1 N5 [4 x/ a7 V! M
( x( w8 B) D! u5 d/ Q: o9 {0 e

. l& x2 Y9 Q1 T! w4 j( k9 S- } Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
' N- I! ]- E  P# s* X, S$ B" p1 s, L* M& e8 B( q
- f8 U4 B% a  e, h6 D/ z

1 W1 Z' N% Z: Z* F( Y- NGPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。% e, k5 C' k  _/ P' D

$ s. n5 E- k: K5 a( J) {* H而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。4 b; G2 K/ ?7 {9 h' L/ F* T$ H

2 k+ @1 _  J/ T# Z; n% I所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
3 {$ j; G$ x. s& T6 M9 _
0 u5 K$ G+ O- a9 k* p6 f, P9 e长度问题% {# P* }! N2 d$ h0 p" C+ E. s: Q
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
( _0 |4 U4 N/ {# V2 F! v) @( y0 q
4 {2 k, ?7 E) S但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
8 c7 c% F% D6 w* [, H$ ]
: o* o8 F3 r8 N* I6 O8 e! v" K% }首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
! X7 k8 @! N2 ~1 j
9 i0 Y( Y' {2 G当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。" F* u2 a+ q" |2 x5 ^
3 _) A; X5 L# ~: T: S
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
( x& E( o5 g" c. h2 I" Q$ R% B6 L" p. `6 i
比如说用户提了一个问题:0 ?& D) g: ]: O# S

3 s% [" e+ a  f* ^“What's the makers's schedule?”! B# k% @% }3 \; ]' w# L( b

* h. l1 ?0 U) q0 r9 p# r从数据库中检索到相关的文字段落是:! F) b+ j8 ]- K' G

* Z2 C3 P: _( J( P* H, N: x“What I worked on...”
2 }) ~7 L4 H8 }2 D0 r"Taste for Makers..."
) `4 l- D: ~& o7 Q: T3 r: Y2 V7 ]
那么最终的prompt看起来就像这样:
0 H: T+ u% n9 N8 B
8 Q6 a: e0 \, u3 Q  n( p6 o ) e; o2 e& I6 u2 o: l
[1 N" y6 J3 _2 |1 T& c
{, j0 e/ h+ s' ~
  role: "system",' J+ P: |; C4 S/ i5 J% ]
  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 Y; F* p+ u4 G0 U% H },  U1 B0 S+ N) z8 j+ i# v) P* z4 E
{
0 B  ]2 K3 g8 ]: l: N* M9 { role: "user",
3 K/ V! T4 G; O% O1 ?* R* i) x3 u content: `Use the following passages to provide an answer- t9 N+ m; Z. }( O! }
to the query: "What's the makers's schedule?"6 r* B2 G; V$ v5 z
1. What I worked on...
+ ~4 Y% }6 T  n0 ?6 @) j0 X- y( c2. Taste for Makers...`
; k5 t: T& T; |$ y8 @ }
& l0 z, p) f$ k+ O) `3 }]3 z0 e; X. k1 m0 z+ F9 j6 s* S

" l! ~/ H/ J8 n6 R/ O! t+ l8 b2 j1 Q( e
这样ChatGPT在返回结果的时候,就会加上你的数据集。
$ y, T  `- N- h! }0 _- X/ w" _7 Q) c5 k% {4 P7 i7 O% A+ a
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.
! \1 {4 t9 P# _7 Z* |8 h5 m3 L' |- }# a5 Q4 _' ~
总结6 a% m2 w. R& ~: Y; F2 a
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
9 P0 M. r7 N4 p/ ]
' u' c. o2 d; X: E& @) P% O而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。+ Z2 |# g  H# n5 X0 @" R: x4 |9 k

& u, F- R9 Q# o2 C参考
( L% r; r/ o9 k' r% ~5 L如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客
' v0 Q3 N" |' f, d2 S% s9 }/ r1 ^! R) S0 u+ i! z
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
5 }# q6 V# _  [! T
- m& N1 I) m1 N! x7 i
& ]0 I3 _* T+ X; W+ G& {' t: S2 J————————————————' Z7 {. F6 l# |
版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 |7 ]: W- G% S6 O9 O8 F+ l原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
% Q, h& m, U8 H. ]# y2 y( G  w
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-18 13:02 , Processed in 0.019673 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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