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

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

[复制链接]

335

主题

520

回帖

3433

积分

管理员

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

, t2 f- ^: `/ I: I  G! yChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。# I3 X5 ]/ S; |4 d" g" U; R

  ?# Y; I2 ~; O以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
$ |0 E! p$ ^: |! }# B
1 y; t" u6 A, x我们应该思考如何让AI在专业领域中释放更大的价值潜能。
' [# H5 A- t" f2 N7 I就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
3 W3 P2 s3 R! z4 H3 C& E( g9 \6 r4 p/ z% k: w+ I
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。1 C/ g) Z$ y  l. q2 O

' r* |* p# f5 Z) p2 t, A, }! Y. Y; P6 q2 A2 P" B4 c! l
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png
% P$ J) ]" W) Q8 Z& W0 V; }' K% {7 B" _/ N) R' F
( F3 g" d* _& |+ Z. m# B
1 W) w8 z2 X& E6 C. J
一、微调(Fine-tuning)注入专业领域知识  I9 }3 S1 |' k0 W0 T
微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。
, D2 y7 O- E/ ~& |: s8 |2 ]$ J# K. E0 T* H
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
: g  y0 v! t% \% l$ Z) p9 ?6 I1 S9 {* ^/ l% T; l5 J7 s5 A4 W
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。' ]+ x, O' S$ W1 s* H
) s4 S* e6 i6 U) P
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。( }$ x% g0 M5 K7 Y7 J5 f

7 q6 ?3 P* \/ L4 a' O" y! p从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:9 U8 J; Y6 P* _1 N  k

! d/ G% E* N$ O" F* J' Jprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
. @$ R$ V2 D& u. D" {4 x% a7 q8 f. T& e3 F/ z
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。/ \  ]+ }  x/ z/ ~
  T/ H5 y' K3 R
下面是一些数据例子:) P0 n# e$ u; ~1 H) O& U* d: h

5 F4 c; C3 ?# W{
5 I5 j& E) v: `! g+ g4 L    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", * R8 A+ S8 n) Q2 \
    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
0 q7 ?' s" E! I/ h* `' J}
4 o; M. J7 e8 a) o! Y: U更多的例子可以看如下链接:; e9 ]# y* P0 R0 z2 q* a
$ |3 l5 M3 s/ g  z4 v. k2 u, H
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
4 G3 z: R7 C8 y+ H5 hfinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub2 `# `9 A9 E7 |6 N9 ~& b. D+ {. e
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。, a: Z8 _8 R6 v  V9 `

. a: D% x' L& B% k6 u1 e二、在Prompt中带入知识
2 I# N, n+ m$ r6 i1 G/ R% l只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
$ i" [% {9 S4 w' `9 Z4 D) f, O. p' v+ Y3 T$ b( ~( m- D
输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。; o) u& s+ H# e/ s

! J: r  V% u, l( N2 O下面是一些例子:
& j. i- M6 K9 @$ q3 c
! C/ F2 n7 C+ ^" y, l5 e例1:作为专业DBA,回答SQL相关问题
2 C3 l$ V/ l* j' {8 Q% L5 g  J) D3 k% z这里在输入问题时,引入了我们的数据库表结构这个专业知识。
( m6 X: y" v  F/ Q3 p" i) d2 l2 q! z7 \8 U
问:
$ X% O# c5 P$ A$ h3 G- H
- }' B7 L3 l& O3 r2 |/ I6 f我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。1 w* R/ i; i' D3 o7 J( z
: [) `' l5 m/ }# d2 W7 J7 `
我的数据表结构为:
& J$ {2 P/ ^# _, [6 A8 O
2 H' C) G, E8 a$ A8 i. OCREATE TABLE `user` (
* ]$ ~  {: x6 J, N`id` int NOT NULL AUTO_INCREMENT,7 X# n. Q. ^1 X* H- g3 \5 K1 m. {
`name` varchar(255) CHARACTER SET  utf8mb4
: U: h" T* W7 h6 E7 [      COLLATE utf8mb4_unicode_ci
6 {) e0 }: E! Q5 k      NOT NULL DEFAULT '' 7 z7 _* `6 o" I$ T7 B/ \$ d2 e7 Z
      COMMENT '名字',
. }. f. u7 l3 v, oPRIMARY KEY (`id`)- z- w4 a" z7 |, J- V
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 \2 h3 ]( ]. u4 J      COLLATE=utf8mb4_unicode_ci
4 ?! n! l! {5 ?7 ~" S) d+ y* ?      COMMENT='用户表';
4 |1 J  U* \' Y- h6 ^5 R我的需求为:根据用户的名字查询用户的id
9 N2 b! V7 a" T! h2 b2 Z% |6 U6 U; c! l  W( z) b
回答
. I. I, a8 W, d2 ^6 V0 [
, h* V  I/ a, u, t& ?3 ~. R& v好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
* d% s% j( h# ^0 N- V# Z, s: L3 D" u% E. o5 U+ u
SELECT id FROM user WHERE name = '用户的名字';
8 F/ Y2 [2 S5 t" i; ^) O9 F这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
5 z9 }1 N7 Y+ }/ `( e- B3 f6 V1 z, Y" Z: U5 q5 J
您可以使用以下SQL语句来为name字段创建索引:
( ~6 O7 _& Z) k6 B% _! {$ q0 F, J+ u6 ~! V. x5 |
ALTER TABLE user ADD INDEX name_index (name);
& x! _+ e* h9 {. r7 z( z3 n此外,为了保证查询的效率,您需要注意以下几点:
8 s/ |5 s5 s* f$ d
& E4 v3 V) n, D. @  c; [6 b数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
( a, J6 Z% k/ }6 Z1 P% `  j* q8 A& D: E
如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。: ]. O6 O4 d: }  m

4 ~% H7 s/ U! Q, _7 s7 T6 M例2:智能客服
- E$ Q4 v9 z5 `8 s9 e$ y比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:! c/ n4 h% a! k! H/ S0 i! `

( i" Q! q4 ^1 \lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
5 i+ c- e, p0 ?2 e) e, b; X
" {6 |6 P* Q' A下面代码通过消息对象的数组注入了一些上下文知识。
" ~- b  p. f1 Y
" P# j4 t+ X* h1 K3 {+ ]4 K
9 z' n. _4 m9 ^; f5 l8 \" j, t  l# Note: you need to be using OpenAI Python v0.27.0 for the code below to work6 Y$ x# h( O3 \1 I. B* @) Z  F% I
import openai
. K* g/ t2 C5 u" L9 {6 ^" f6 t
; ]/ M0 f' f$ n) z# K1 a( h! }/ ^openai.ChatCompletion.create(
0 e) a8 s/ }  R2 c  model="gpt-3.5-turbo",5 l  `2 V5 r9 f0 ~2 W! e3 k2 e, f3 v
  messages=[
. a! T- a# Z, Y0 ?! u. ]        {"role": "system", "content": "You are a helpful assistant."},
- g2 M6 V2 k+ c        {"role": "user", "content": "Who won the world series in 2020?"},
9 _( P* O+ I# L        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
" U, _; t, X. R2 |1 m( B        {"role": "user", "content": "Where was it played?"}
4 J( O5 }. Z9 r- b2 @+ g" h    ]5 u- ~( `( _9 F9 K1 W
)
% W2 ~' B. Q9 w; h
1 E3 Z2 G) x. X( B其中
/ B% K7 h. ]: H/ ]7 n+ s7 l; j' q3 m
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。: b3 J! y$ p3 r3 J& \( ~" u
用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。4 @0 C3 x& L$ u" w; v
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。; I) z& Q; c2 B# d* a
通过上面的方式就可以完成专业领域知识的注入。0 t; h8 A& n; G5 q$ q" d9 d$ I
3 {' H% t* o" f2 [- E, K* I
例3:通过外部链接把内容带入
2 q5 F7 L9 n) z下面只包含我们发起的对话部分,会话结果比较长,省略了:
! p& m, P1 ^. z6 [4 Z# {; V9 L' u- _  F9 D* R4 @
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?
; O* I4 w* X) j" |) b% v: y...
" m& y' q- x; P" [$ u0 F9 JUser : Microsoft 2022 Annual Report" Y, K. a, q, n, W( C2 Q8 I0 |  }# [
...+ r* `! o8 j' a; T% }
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?. u! v, L( a" o0 ~
...
. ?7 o! Z% `. x" UUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom5 C# S9 ^& G& e
...
! S0 Q1 N; x% N# }& X9 p* ]: KUser: 您能否从Nvidia的报告中提供更多财务见解?
4 k. d7 u0 [4 k  M+ X...
, w3 t8 x% i& b" L# P6 y0 A3 N: \User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
  [6 a! J2 c" ?. J4 V, }" G4 \$ O....% M  c/ ~. v$ {% y
5 }9 H1 ?4 q  }. n
User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
9 }1 ?; G8 L0 S  o$ }.../ T: y9 w; Q  @' {/ P, p
User:预测下戴尔未来12个月的现金流。& f. \/ p1 q& D; @) W

8 ^3 n( \7 q. }6 m这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。  P0 s  }. F1 y9 k
9 n: q/ |% P& @) Q  U+ i" F
适用场景对比
3 j- P0 U4 ?: `0 \0 C价格对比
7 ~7 D$ ?, O1 ]8 j7 Y, j3 A5 _7 w8 GOpenAI的相关报价看: Pricing; r0 p8 S" X: m, Y0 x# `$ ^

# k: D% G/ N. M+ G' J对话类:GPT4远远高于GTP3.5。1 q  W" Y$ d; e  `: X, r
OpenAI的相关报价.png
4 O! b+ u9 R2 @5 U5 E" ?( }  \! A* `  Q

+ y$ [. U( o. f目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
: l1 N' n5 r; g8 z, ?+ r7 j
. E2 I/ W: h* ~( I& x
! v% b- P6 i7 P; c. ? Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
* Y3 w: i& p- b2 y0 t9 ~( d7 w: o6 r& T1 K# Z6 H$ I; p$ \

1 f; p& g6 A- N' n9 }+ P* H9 Z( C" j& M; y& ]0 b6 j. p2 K
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
, p4 B7 v3 C5 i' r0 h) H  h+ R4 @; A- `
. R5 l: y( E# i0 ?而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
  f4 z, V4 Q( e) p, g; K9 |
( g# P' w1 a; C( {5 Y4 r所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。1 G( p# V; k$ n0 _7 O

$ I: P% N' Y* d$ B0 p长度问题$ Y1 t3 b6 O% Z! E9 C9 F
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。8 h: ?) ?$ y3 o( T/ |+ o+ a

& k4 e' U7 Y- J8 K  c0 Z但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。' d5 s& [2 q% L

9 y3 h+ {% q  A0 e首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。), D! @7 e$ R* T5 [, K
" h: y1 W' g. d8 W( P* E- S
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。4 b% j' p6 P( q, t* Y" H' `

( N4 e3 v0 ~$ `" m, F聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。: d1 e6 K1 o: ?# {" g" x2 c
; |+ G" y) g7 n. G2 r
比如说用户提了一个问题:% A  M2 J+ P% Q# W' a) \/ D+ i% G
$ a' B! V2 A/ g" B  Z; h7 ?
“What's the makers's schedule?”
2 R  D1 v+ i+ n# P& z3 O1 F' X1 z# r2 F6 G
从数据库中检索到相关的文字段落是:& \+ B% s0 b9 L+ {2 ^6 t( }3 _
* Q' p6 ~8 O# x- _/ E
“What I worked on...”
  R0 v* S. X1 {. [7 N"Taste for Makers..."$ W8 r4 J* _$ }, X- F$ l9 G) x3 s
$ ]# s5 a( \2 E/ g+ ^! ]
那么最终的prompt看起来就像这样:
; ?: Y3 ?- u3 T- i
0 M9 ]# w# }( E ; ~3 g9 o1 m) [  t% k
[) F; q) V/ y4 x
{  t" Q/ L% ]: J! ^
  role: "system",; c2 Z- g& F! C) i$ A# 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."
& ~+ Q, y* z, A1 A9 u6 m+ b5 V },
! _5 ~( R; H9 E/ g( C. K {0 L7 ]. e9 d* _0 c, F
role: "user",
8 M- L$ P1 f% b& B& j content: `Use the following passages to provide an answer. f* m" z. b) I/ f* t3 f
to the query: "What's the makers's schedule?"
; r! h, F( L& K, H. b2 E* ]% P1. What I worked on.../ a1 l& m* z: \/ r: r, d
2. Taste for Makers...`
# k6 a9 {0 `% P }  Y) \; a3 d+ o  \
]
: V+ b) ]1 @$ S; v5 D
5 s7 Q7 ^$ F  X& V& u
8 d  Q% ]! y& h9 s; b* c这样ChatGPT在返回结果的时候,就会加上你的数据集。5 F7 Y6 s. w8 Q

/ \9 X. Q4 q/ t( O( I: _具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.
' g/ ]" y2 l5 s) P, C! b1 q
3 }# R$ |, r6 E2 O总结$ I) _" @$ r  o# A$ b( {5 _2 X# F9 D
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。! J) L$ D, P! e0 n* z" f

  o# N0 {/ ?! p. j而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
( m' I) l( p. S) S( z# U$ N1 B6 D9 ^* ^
参考% e- g+ E: A# c# x( q
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客7 c8 c2 b7 X6 H! R2 a( w7 V
# q* o/ ?- t$ ?3 i4 C* R
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
* @  U( L% T  Y: r  w
% e( O/ [% f  }$ W( W1 G' j; @" _( a9 w7 `
————————————————; E+ v& `; o9 Z8 d3 Z) w4 ]0 E
版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 U5 V* w' f' _
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157! f3 a7 u" a) \8 y) [8 @; x4 G
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-16 21:35 , Processed in 0.079546 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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