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

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

[复制链接]

347

主题

564

回帖

3679

积分

管理员

积分
3679
QQ
发表于 2023-5-29 10:35:28 | 显示全部楼层 |阅读模式
% K$ @6 n# H3 _* h3 H
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。0 E8 O) w1 d3 w0 m  M$ y4 s* R

- x" r, l% Q) j& u8 D以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
" c  W& I* @- H# `& v& }5 C
7 A8 S& I4 a2 y9 R. \' r( t! [8 k1 ~我们应该思考如何让AI在专业领域中释放更大的价值潜能。
& J* u+ J9 U0 l3 S2 [+ a就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
  n1 h: U5 g* \. }' P9 P- `; w: u' t4 f; W
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
8 k, b6 X6 V/ n1 g( `9 H. d
: g# w: s  w( @; i$ X5 z
, W7 X; m4 g- O4 O 以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png
: Y& e7 l+ O. M$ v& f$ N" t" i8 O1 U2 z

5 M: Y) A8 D0 X+ ^% l1 Q* g" G- G5 a$ {, X* t5 a( `
一、微调(Fine-tuning)注入专业领域知识
" Q1 A6 w. P# x; ]- V. j0 ^微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。
' j( G% O/ B% W) h! n3 k
: V6 x( j) T+ c- A1 }2 w传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
- V  q1 ]' T  F+ ?: f% w* b7 x
* N# f" P+ T6 V" t3 j( H& A如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。5 R3 a6 k, `; ~

) I; U3 v1 _( R1 E9 n4 f' oOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
/ c) B' C0 q7 i" {& Q
% {, M0 \; S5 c从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:! k3 D+ q/ q4 |

- r3 \) }! d! m* xprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。6 h$ }! P) G1 \/ t9 u  {$ L; }
( J& f& T9 a: s, j/ N" o  m+ L
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
' F3 |9 m2 Q& s7 {0 V# f6 Q
/ ?& u. k1 n9 L下面是一些数据例子:9 w% D& g7 `# k7 M% y

0 w, b6 ~: y3 z) N{
2 R* K2 L3 N; I& ]    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", ) U# u5 h5 y* e3 q! O" l1 o
    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"" B/ N6 _/ t. y4 g
}
- [, l- d8 i- u. ~2 Z更多的例子可以看如下链接:1 [2 @3 P5 D, Y5 {+ V) t0 a" r

. U% I* ?' Z. V0 {# U3 \( _GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
( C' t% e. j- K, U  mfinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub- V$ B* F6 r) ]0 a, z8 y
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。. g# }& q% J, j% ?5 s
' H1 b; M# ?/ f
二、在Prompt中带入知识( y" j# ^3 P/ Y: Q* Q1 s
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
! p  f/ W( H( E5 U( q$ g: `/ I3 Q4 j/ g; ^* T0 g
输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
- v0 H; g7 F( a1 ?1 n- q" w) l4 ^/ A/ H& k
下面是一些例子:
& f- F6 {, o( D/ w7 ?. O. q4 o3 ^: s3 T
例1:作为专业DBA,回答SQL相关问题
7 P" @6 }$ g) |  u. L% c, Q这里在输入问题时,引入了我们的数据库表结构这个专业知识。# u" B) b4 b1 @: A7 N1 {

  a8 ^7 X- C4 q, F; G' d/ s, H: R' p问:
9 c" {1 w# D  U% d) G/ r. Q* A2 r1 r1 m  n9 ~
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。) `1 S3 Z' {4 Q( m, L2 p2 d& A
$ X  s6 y) J+ a, h# Q/ v6 ]" k3 M
我的数据表结构为:
0 a& r. a# V, p! }( r
9 d7 A9 B: x% t9 I# p2 d1 n' bCREATE TABLE `user` (5 D! V/ J2 j5 C. G: w8 L3 N% S" r
`id` int NOT NULL AUTO_INCREMENT,1 }9 e; v0 [& c) c4 W
`name` varchar(255) CHARACTER SET  utf8mb4 # ?& }4 c: y5 i% G( j
      COLLATE utf8mb4_unicode_ci % h% c4 f/ Z8 V
      NOT NULL DEFAULT ''
. j8 g( N  L. q8 U      COMMENT '名字',+ x2 x* ]8 [$ }# h- @
PRIMARY KEY (`id`)
) D- d% y& d$ _3 u- X) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 7 Q5 P! g2 W5 g* L8 G" j
      COLLATE=utf8mb4_unicode_ci
. p& J1 K! h- c9 A5 i/ I) @9 I      COMMENT='用户表';
0 a# ^# L- j& h+ C我的需求为:根据用户的名字查询用户的id
  l" Y- j5 @  w# [9 r" F% Z' j1 O+ H( K, U/ V2 R  a
回答5 W# V0 K* Q* s. p

1 u6 W2 ]( O* v) `2 J+ O1 Y好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
& a% w5 S: V) ~! k* b$ y/ N& T$ o  R5 O+ T
SELECT id FROM user WHERE name = '用户的名字';
! _! z4 o& k1 S% O/ G8 i* I& f这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
% y0 \6 a- N8 X+ A" f* {- s3 t* r
! m3 K& X$ K3 \- `) R您可以使用以下SQL语句来为name字段创建索引:
/ Y: E7 Y: V5 m" z  |/ l# }' z, b9 L- }: m8 K
ALTER TABLE user ADD INDEX name_index (name);$ e+ B. v5 n% {$ X% E
此外,为了保证查询的效率,您需要注意以下几点:
; \, F) j7 X6 r: S5 Q# Q! H) ], `2 B; z
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。% ]+ \. m; q! }. A6 J7 h9 g

$ K' M! e/ Z, n7 [7 t. g" t如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。" S* ]& F' k7 i. {2 X& v

6 t- Q& o& }: a' P& |" X+ N例2:智能客服) y5 h5 m& S! _; M4 S
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
- ]8 T- o: W, T. p: i5 z* Z9 B  L' m. o
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub1 v/ V0 f! u) I8 h# G( m

5 x& M: v# C' J# u# ^. p下面代码通过消息对象的数组注入了一些上下文知识。
- b+ B+ U0 [& W9 F* s: w. a! M
5 a- ~  ]8 s: p
  d1 s5 t% \* D$ ?! S2 k. e# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
, a4 g) _0 i( E2 F* g; H2 Q* Limport openai
7 q1 Z4 c* O$ _. ^$ ^5 f 5 l2 H- F6 f/ ^+ p" }8 A4 C6 Q  @
openai.ChatCompletion.create(
3 ~8 S" ^% V  c9 q& r& |! o  model="gpt-3.5-turbo",9 b: H5 @! B1 C* h
  messages=[
$ h. Y! ?( x7 t        {"role": "system", "content": "You are a helpful assistant."},
% e8 k6 t& L. ~7 ?& I        {"role": "user", "content": "Who won the world series in 2020?"},
" I$ E  V6 \; L. P/ h5 |        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
5 x' K+ P4 f/ k, G  L        {"role": "user", "content": "Where was it played?"}" e0 h3 w+ F+ F  H
    ]
* `/ r9 u8 H8 S  b)
$ ?# f8 o3 V  B/ _0 f; @0 `
+ @3 M& a( L/ m7 A: p4 f8 s+ b其中
& ~- Y8 }1 u0 ], `; E# _% q1 \% l9 M6 X8 `
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
/ c* q2 ]% Z3 ]用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。
6 _8 O6 z& w+ \" J% N助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
* F0 h- h5 ^* @3 k% @通过上面的方式就可以完成专业领域知识的注入。* ^, O$ @. G. J, j( I' ^

% k- M5 O; k5 Z; s* j例3:通过外部链接把内容带入. v  M+ X/ R* L0 O! T# f5 N
下面只包含我们发起的对话部分,会话结果比较长,省略了:
5 F# L4 U( Q1 o' U
! F) I8 F' W, e! T2 l( [User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?9 }) Z: P; U) x
...* Y- a! H$ e/ N" u  J: _' l
User : Microsoft 2022 Annual Report
; q7 ?: C9 H0 }9 p...
: K3 _8 p+ |  N% V5 T% J, g5 fUser : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
+ T* S& w; }6 _4 R' G6 J# {4 L2 Y..." l: V1 O6 ]: h# g
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom: g6 r. H# m$ x0 M8 x
...
5 j4 G& E# l# F+ S- ~2 W: M2 j9 L2 BUser: 您能否从Nvidia的报告中提供更多财务见解?1 I+ {- C" H& O6 T4 u/ A7 c
...
% z+ N/ h) l0 x: W. a0 DUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
. H, G6 O, t; K2 C....
8 D- A3 }" k5 D6 k( m: f
% T7 f9 D- Q$ t4 t" B6 t( T$ HUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
7 [' {2 c2 k! F$ B5 l...
4 n& D, ?1 T1 S9 u7 fUser:预测下戴尔未来12个月的现金流。
2 K0 k7 |( J+ X7 f4 C- ]/ K5 B8 ]% [3 p; A7 e. O
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。4 O# s5 `# i. L7 e: ?
3 N, c1 {& H6 ]. J" @! X
适用场景对比
( J. O5 _7 X8 F7 p. A" T价格对比+ M& X) g0 p$ T
OpenAI的相关报价看: Pricing
8 L4 r8 z6 O5 G: K/ G
2 K- `/ D2 T0 x+ Y& r' |: }2 }对话类:GPT4远远高于GTP3.5。
: w" N" B9 |5 U" c/ S OpenAI的相关报价.png
6 E1 p+ Z' f2 _2 }
  G! e- B! p! \( Z: @1 A4 D2 R- O/ m4 m7 q5 i
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
2 u! z9 u4 b* D; `* r
6 ^; E4 a# Y$ G2 \" H) ^( R2 a. r% u$ V
Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png * k9 L8 h, L0 ]4 H" B2 |/ l1 i! f4 w5 L

8 @$ p4 \( y3 w5 o2 y2 b( B, l
1 y0 e& |: K2 `& z, U: W$ }" u/ r& D9 N) w& U) F9 a' r
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
! v" _% D1 X0 c) O
1 }( _% D- X8 E4 W; B6 ?而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
, _8 H# _/ Z6 B1 u5 ?: E6 U) F- \; s9 Q- c. ~' h4 x- K
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。! m7 V0 l' x6 \. X/ c
# i2 ~2 p9 P7 |: T1 w
长度问题( p1 ^1 k! c$ T/ s  U9 }- ^6 S
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
3 Y6 p/ l1 l/ u/ K0 n; q. J/ j: M0 y& m0 E
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
) p  d; T0 f+ ~# j3 [; ^: p! X5 i1 L: d/ `  O1 m
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)5 b0 E1 @* C0 \$ I$ h2 P6 o
( q3 O* ]% M) V$ U- r
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。) V0 _3 h7 L& M0 P6 a

; s6 g/ q) \3 q0 F' g# `6 Q5 T. `聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。3 \$ U# \5 V/ o! c6 c" G. C% z
6 a  V' \3 g4 r! a& V' d
比如说用户提了一个问题:
/ D, Y3 y9 f$ a" F" T8 b+ x8 d5 K2 F7 R& i* x: N/ O
“What's the makers's schedule?”
: u& z, x2 Y. _7 _& U
/ a% D0 p5 P) e3 U2 y8 J# w从数据库中检索到相关的文字段落是:
2 m% g" l8 M5 X/ N' M" S  H4 e2 S( m8 n! b
“What I worked on...”3 Y) \9 z7 f( H
"Taste for Makers..."( Q; Z7 m+ }- i' U9 r0 v' X* i
4 c* ~  ]0 j5 r* P, T* P
那么最终的prompt看起来就像这样:
8 \( J8 M( H+ x( x/ \- f5 `. M( K- ]! |  q$ ~8 t3 K9 \8 S
* n' t8 e6 C/ V' u9 ?
[
* z# k7 `* S  E% \* A {' A2 V; }( b4 d+ K. [, q) {; h7 f
  role: "system",- X, u! C# M( c+ l! w) E
  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."- m+ F/ W0 u7 n$ v' W. k; C. C
},
/ A( c" O0 {7 ?( h0 v; i+ \! H {
5 l/ `/ Z+ }( V- A role: "user",% D* s) M, J/ }: n! P; F
content: `Use the following passages to provide an answer3 r$ s' ]2 X% x; X& J5 Q
to the query: "What's the makers's schedule?"
4 p8 R4 e) M( V+ P1. What I worked on...& J- W$ C, D& N; }* v6 t
2. Taste for Makers...`/ p0 R/ Q% }0 U2 R& o' g
}+ i4 h5 K6 o+ {6 ?4 H  R& F
]9 K- C0 V4 N5 U" _7 Q* w
$ r& ?1 V4 \8 p1 Z! m5 r
" N  J) e3 N+ n$ v. ?
这样ChatGPT在返回结果的时候,就会加上你的数据集。) j: g' f, \7 _  |$ k
- H# a* |9 j' g3 v9 c
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.% ]0 ]1 P, @' L$ @+ [

+ H" E1 S) |& }* m总结
6 K8 d: L3 N' y* c) t7 f0 R2 V4 e大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
+ Z  @$ G5 @  ]  I6 M7 `+ C! O3 t1 Q! a" U
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
* v: Z5 y5 K& F" \* ]8 ?' J% m0 J# R; K$ ^8 A
参考
" U: V9 X, I  C+ B* G如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客2 y2 Y1 N! i* n3 Z# b

* x3 A% H: m/ p2 y/ ], `7 L' @搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
; r# J/ A0 j8 v2 T' D: y* Y8 F) J  g! i( K
' p5 {4 L7 a7 |2 n
————————————————7 W; y  m, l/ K6 G& {
版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 j0 H% h- Y3 B. ]' I
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
4 Q% u9 |. s: ~2 [; J! R5 M
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-10 16:27 , Processed in 0.016370 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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