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

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

[复制链接]

314

主题

478

回帖

2960

积分

管理员

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

! i' o, J( Y' A/ n( a, ^, a8 N4 g; ^ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。% o( n* D' h* z. T+ W, \

* V' n$ ?# k& B5 ^以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。/ [% l6 {( c6 A% M7 _, C1 X
- R% m( ^# X8 r9 l3 Y/ E
我们应该思考如何让AI在专业领域中释放更大的价值潜能。
, p& i6 \+ j" j6 i5 i7 A就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。' T' s1 c! ]5 T' o! E+ @* l

, o+ s& Y% [1 F$ g* v: v$ l3 s以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。% `/ s% b6 Y6 E4 p0 g

  r' Y9 z0 z# N* _0 A; }8 B
4 I) f5 U* u' j$ w8 R% i 以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png
* _, V+ \. \& O+ P9 A! p- s" j4 p

; m; K8 v+ f: y1 r1 R! `: O
+ j5 Z3 D! N1 J" Q& X/ L一、微调(Fine-tuning)注入专业领域知识
# l9 J* J% ?+ P$ r5 o, c" s7 j微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。7 i: m0 B% f; J  t9 j7 r2 H

+ [5 `& \9 g. G% B/ H3 N0 D传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。8 N- _& s5 w, T; G2 h% `9 ~
( K2 J8 g3 X1 f* p- N7 p
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。. t- Z8 X# Q& q+ ]4 e' ^
, ^0 R1 B" ]( e
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。* i% h% E1 p- S1 k; M% x9 s

. o, t' ]% j* `0 w从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:: E& e' k$ Q9 N
1 M: f- [6 E4 j/ s+ W
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。7 e+ i9 G8 [* c0 D

  w: j) {+ _9 o- Z6 d) Z  E- fcompletion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。; ~; h  T  B- Z# d
& h. M1 J% c. Y: @9 M5 r7 g* i. a
下面是一些数据例子:% y' D8 G& R) t/ o. v
' T2 P# R: w( F& D0 w
{
2 I9 l5 V& k' }$ `' B' _    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
+ Z! w- G0 Q. S- j! F+ E    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
, J% N$ o( }1 e}! r1 _7 C$ s: l; y. y3 ]2 ?
更多的例子可以看如下链接:
! c8 c# E( C% n9 f
$ L# V& d" O) @) MGPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
/ q' w( |7 t9 q* |. x9 K6 J3 Rfinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub0 [. Y( A: F! ~' K+ A. J8 i" D
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
  j: U( n1 w) H; W6 h* v1 ^& l, e+ i( |+ Q8 O- Q0 K4 K3 b& R
二、在Prompt中带入知识
4 V) \0 ?+ n$ p# M1 D1 o2 t$ G% I只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
0 m' F1 a% j& _$ u
+ r; N3 [4 Y: G输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
6 ^' {4 E- g/ \$ O, Y$ P$ V. e, ~0 `2 }% z4 ~8 K
下面是一些例子:
3 u$ P  `, G; R. G  k" u9 Z! b! S6 L. r, q* M
例1:作为专业DBA,回答SQL相关问题
, i1 y" f/ z0 N这里在输入问题时,引入了我们的数据库表结构这个专业知识。! `3 ?( P  b9 {# ]7 A7 M0 c, B% ~! I

( `4 z' u9 X3 K0 |8 F* ]+ b# K问:
9 _% H+ ~0 Q# |' C9 [
2 o% Z  F" }5 j- ?9 f) W我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。
, u; q0 o9 e9 o) S" K3 [. r0 y. ~0 i# E0 J
我的数据表结构为:2 Y# ^6 j  X( H
3 C' E$ {+ S/ j4 }
CREATE TABLE `user` (8 n8 w( O  i8 f: W  P4 }& n
`id` int NOT NULL AUTO_INCREMENT,, B4 H$ ^2 r2 `
`name` varchar(255) CHARACTER SET  utf8mb4 % u" H; z, W; x, T
      COLLATE utf8mb4_unicode_ci
/ L( q* u& {, j$ o* }1 p      NOT NULL DEFAULT ''
& R2 v! T" w8 S, g      COMMENT '名字',6 s( N* h/ p% Y" @, n. f
PRIMARY KEY (`id`)' _, G8 p, X5 v3 p0 ?( v) a6 I; ]
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
7 ?& v: \: i3 s0 k: _* o      COLLATE=utf8mb4_unicode_ci
# V& V8 g! |! ~# J      COMMENT='用户表';
; o; l0 A* @  f. R! M我的需求为:根据用户的名字查询用户的id
0 {" u: T) S0 d* o6 a/ @0 T6 V9 M) e' e
回答
5 j( ]0 L' R8 d# l' Z5 _, b2 c+ q& D1 V, ~% i- [  ^
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:# c& n  H' w4 Q* n

) X- ]0 ]' v4 d% \SELECT id FROM user WHERE name = '用户的名字';$ r9 `3 i1 A, _6 M: g2 R
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。& C- j  W- w7 }- H2 ~1 G' w

+ W8 K/ _! _8 |您可以使用以下SQL语句来为name字段创建索引:" n7 U9 E% X3 t1 U6 g, _
- E5 S% F6 r3 e0 u, n' X# M; z
ALTER TABLE user ADD INDEX name_index (name);$ s1 y1 E( E1 Z. a+ \$ |4 d, {3 |
此外,为了保证查询的效率,您需要注意以下几点:
; R% B* M2 ?2 Q; k  t' j- `3 }
; S' F: M+ x. E" \( V0 W8 E数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
* K8 M# S8 `6 M
$ f( x7 N: s1 k) v5 M) ]  Y如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。
! @0 U3 l$ q  E/ t5 y1 `) ~: n
4 V+ b. w6 I  F3 F+ [' Z" \! e: M例2:智能客服
4 D7 @: G* O8 i  U比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:7 v0 x( a$ s0 {/ ]

2 a1 Q1 s4 C: q2 I" Slanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
% x% G7 j* h$ |& d: j# h  [% O/ k5 E/ t) A$ T5 K
下面代码通过消息对象的数组注入了一些上下文知识。. M) x0 e5 Y7 n

+ u, L# y1 K: n2 V6 z$ d
- V+ T2 `. f; c" `( r9 N0 Q# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
% j2 ?2 }7 `6 X- O+ {import openai4 E+ J# v" f" ?

8 s- D# v! C+ a  p- F5 |openai.ChatCompletion.create(" k- y4 y. Q+ h& g0 x& {, o
  model="gpt-3.5-turbo",
, X9 R8 s. c" L- M5 Q8 e6 c8 F  messages=[3 j* o) t1 K4 s) F/ {
        {"role": "system", "content": "You are a helpful assistant."},
# Z8 c! X3 \2 @+ t% u& p        {"role": "user", "content": "Who won the world series in 2020?"},2 F2 l+ B, \& e* o, Z
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
3 F$ C: h! m9 X% b6 s" J  K        {"role": "user", "content": "Where was it played?"}
4 M# [; _1 C% x  q, e- b4 Q    ]; i8 C0 O" M& d1 i. ~9 E. E
)! f- V% [; I' K3 i# n

5 E4 L& ]3 T2 \) M6 H其中6 t* F9 F/ k$ E& K9 V

( {- S. Z  ]. Y# D2 u2 m系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。: w1 x3 y9 N* P2 P2 N( e% ^
用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。) e! R4 T% h# D6 i/ t8 L9 r) B) r
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
& ^/ [" u) }5 {7 _通过上面的方式就可以完成专业领域知识的注入。- F" t, z5 D+ o

; X8 D7 @& M  B; u例3:通过外部链接把内容带入
! B3 U9 T( V& L2 ~6 }' l: K2 E下面只包含我们发起的对话部分,会话结果比较长,省略了:
; S9 H4 K0 h/ c7 C/ t
. R# x/ E/ P5 Y9 v0 oUser : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?8 f' m' r3 C; {
...9 L8 `' J8 m9 P; `& ]0 p
User : Microsoft 2022 Annual Report
. g$ e- |6 T( S* U4 I& V4 d...- s2 T% J  z. d; R" V* G( }. W% A
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
0 R% c; D4 X% x( R..., g  I; I" ~- V( |
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
7 S( |! P' ^& U2 t...
& [) A2 n4 @6 A8 D( T$ TUser: 您能否从Nvidia的报告中提供更多财务见解?
+ @" S3 u. z, ]' C8 |...
8 p; R' Q4 c, s* o# L! ?, eUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
' n! [, f6 R( U4 i6 o* b5 C# X/ Z6 `& V....
( H2 I; r7 b; t/ [4 m! ~$ y+ y4 ^  ~) \8 h2 e
User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
" _$ Q: d# K( o* G...
# n3 X3 e1 s& DUser:预测下戴尔未来12个月的现金流。
( e1 J  r( R5 p# z6 s, l5 b. H0 C8 x: _/ ~
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。, g1 [/ D" U& z- z. m- l
) ^- [; j& _9 k/ p
适用场景对比& X1 k* s5 T2 A( `8 j; O1 Z
价格对比
: A) e, W$ e7 d1 ZOpenAI的相关报价看: Pricing9 {+ C: I, J7 D  @* O4 n
) ]# U7 w6 G# S
对话类:GPT4远远高于GTP3.5。$ B3 v4 O  E/ `" k
OpenAI的相关报价.png
/ C3 P3 q/ O* c3 c
, z9 F2 V! l- W6 w# m
6 ~5 M) Z! B2 d. i. K. B目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。" n4 _' @1 x; l( J* P6 g1 z: d/ }

! V1 @1 Z. c1 M8 T8 G3 c  U. _! r# n# ]: W# }& s; Z/ ?
Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
1 Z' S% h" _7 k7 q& R; R& r( F6 x( p$ M/ b
% A' i6 P. M9 j

, t3 D) V3 U1 {; \GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。$ K4 n2 ]4 S% t8 C

# m6 S+ @$ Z* P$ r/ `- F而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
- `: O& B& {9 B, B% _# A* }$ G! {. D5 x. d$ U0 @
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
  R/ U! Y6 W0 x3 E4 O/ x$ U- I5 G% w
长度问题
2 [- H' s- `9 R- ?& l, p* \0 C$ ?ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
# S5 T- E- }! E' d$ `4 b3 ~- t* [$ V$ k! w" q7 q
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
' y8 b2 i- T1 e" r& H% J2 X1 a+ t) a; g' T
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)4 q; E" ~/ i8 Y

. o; }4 P4 r5 ^, I, j' M当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
6 P7 g$ y7 l" Q$ l9 b+ E2 n$ I% a, [3 f5 o
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
1 _8 L; v" Q; M! w4 p5 L6 K- ]5 `: Z# r! @5 j6 A# t
比如说用户提了一个问题:
% {9 |/ a" N: ]6 z- R7 t- {6 x4 s- _: f' x
“What's the makers's schedule?”
" p# u- |8 l- d4 p* a- S
* G1 _, v  U8 o6 W3 ~从数据库中检索到相关的文字段落是:! {; {7 O% w8 L4 j" y
# v  Z6 Z+ {$ J7 F( D0 E6 Q( c5 p
“What I worked on...”
# }) F- P, r/ T6 n"Taste for Makers..."7 T( E% [+ l5 M4 q' d4 m

1 t7 i/ \, l3 U2 D% u那么最终的prompt看起来就像这样:% P& m- d/ M9 X8 e* q+ ]4 s5 n# _1 n0 X

8 p/ U  r" Q% m5 P1 ~ : q4 ?! M, O% C# j8 P7 ~4 l
[
1 e2 X# B. X3 B4 J# [+ I {
0 [% e% V; `5 N& g) k  role: "system",
7 \" P9 s8 O+ w' I6 c  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."9 B$ d$ r6 H4 D( H* a' r
},% }1 M/ p/ |" y# v  G
{
8 O+ `3 Q' Z" J! c: x role: "user",
7 U0 f, j1 I$ z/ _7 Z1 U& Y* G' \ content: `Use the following passages to provide an answer
) y: Q2 W3 V4 I4 ^to the query: "What's the makers's schedule?"
6 H' O4 G/ t2 a% P! Q* [1. What I worked on.... L  Z: I% A+ ^! a* b. [& }3 u+ J
2. Taste for Makers...`
& D: m8 V/ S6 a* i8 m) a! F: }! W9 w }
* _: u) i, f2 X/ [' X7 {]+ Y; g+ `7 a1 n7 e; z" g

) O. G4 `0 D2 }$ ?% p) B% ?1 r
1 Q) f' N) w+ a这样ChatGPT在返回结果的时候,就会加上你的数据集。
! ^: b( H  n$ @! @) {5 b* o2 V
, ^$ Y' \" H3 S% t6 g5 H具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.4 C5 ?, b) z2 Y. E

" S1 k. w# C( J; D* A总结
$ Y: L) d- E7 O2 a9 _大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。; K5 C& e7 [4 _; Y  u% t& f5 d( G

0 v2 p$ n0 R- ]$ ~, V而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
0 J2 `2 x3 Z: F1 E' B# H
: r+ L3 g5 E# h参考, U( L3 O6 I- W9 J/ n& r" P
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客& t: b9 y; _0 [# [) Y  h2 H
+ q$ Q7 e: a) Z6 F7 g
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt) Q9 D( w$ g! z' n9 E# q

- A% \7 p& C0 d, T" X: Y7 v2 j+ o* h/ P2 t/ l7 {, V7 M
————————————————
; x( g9 I4 R2 l" Y1 D1 [版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* K& ^# g8 i5 c6 f
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157; h; y$ t" ~- C' T
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|通达产控投资 ( 粤ICP备2023021749号-1|粤公网安备 44030402006137号 )

GMT+8, 2025-4-5 01:53 , Processed in 0.078653 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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