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

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

[复制链接]

408

主题

596

回帖

4038

积分

管理员

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

" n8 h9 v: H. a2 G4 X. HChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
" `; S0 B( S& a- B5 Y% M- j( ~, Q" h2 f% I
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。; i+ `. @3 j8 v2 M- I8 ~8 _/ r8 `

3 o( e9 S! N5 U0 A$ H* O8 T我们应该思考如何让AI在专业领域中释放更大的价值潜能。
4 B: K$ v1 I& I" y6 q# `7 `就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。& h, \; q! S. G: x% _* D
# x; `. H! w; N1 M) n, q  K
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
! Z' w: N! g1 p  i5 O* x- Z0 L% d1 F) O/ e( [
  r/ J. k1 X- `- x0 c
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png
0 S! {9 j$ j/ d! c1 Y0 S9 j, i& z/ \
! X5 M- m7 N+ }3 O. A' @
2 J9 l. h: c) N! b) U2 T
一、微调(Fine-tuning)注入专业领域知识
) {6 h, p2 z. z0 q0 S. e/ `% J7 b微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。" H3 o' L; t! ]- I; v
6 B3 l1 M1 l4 |- V. J, E3 k
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。) _$ P0 j6 ~4 @

& Y( Z9 I( o1 s' O3 N/ l9 y: d如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。  A' S! w( E" a2 C$ [9 t6 }, Y
: f0 z% S; }  Q" i( J  N' O& P
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。! W% l- b2 H: f! Y
& K8 }" i4 Y6 N: V" v4 g7 a
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
+ R) N: S% B0 f( v6 x3 Z1 y2 [
7 {8 D3 n+ n/ f' Yprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。: W2 E$ N* {; k9 Q% i

' Y3 T/ w- k. y; ^' _9 ]' j  Fcompletion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
/ f# v, D2 e) ^! I9 @" s
* ~! }/ m! _+ e下面是一些数据例子:' W& W8 x' P2 r! S2 \4 e8 t
2 L* h! ~: c0 f1 H+ E
{
$ V7 \. Z, g. b* g$ F$ R: Z+ ^    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
' n9 `% W( |3 L" ]    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
% O& b0 c% f' x( _7 r! t. W8 l; I}
9 z* j- k! ~, \( @. t& Z更多的例子可以看如下链接:( j1 Q$ Y! D0 }3 [

: ]' t" x/ S* d; F# |GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
) N  U- _# j4 ]. C  afinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
/ _) L( y9 T3 M/ }' m1 V1 V+ _0 i: H要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。% X3 O! ~' s0 Z- b" N5 {" a

" j: N; d% H1 Y$ E- X$ |; H2 v二、在Prompt中带入知识
1 `" o6 V3 G& ?( X+ p5 G只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
) n+ C# w% Y3 ]9 M5 K. u1 N9 C
: N) |  \; ]8 }0 v% G输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。8 q1 ^3 G1 k) M$ [/ i: s6 r5 q
+ V% S6 Q3 j1 j# `
下面是一些例子:: J5 y% ~- N6 N! v7 |. u' k
3 {6 M2 ]4 A0 I7 s
例1:作为专业DBA,回答SQL相关问题4 [8 {  c( W# g6 B9 D
这里在输入问题时,引入了我们的数据库表结构这个专业知识。( s: G8 M( t# f# G* U. z

1 z; M4 d* ]" _问:6 `2 D/ N+ E( j; a) S1 n

& {1 \2 J$ O& k  a3 I2 K! {我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。
/ Q! i4 U8 r9 L' G5 Y
1 a$ @& [1 W) ]8 a我的数据表结构为:
4 e6 G6 q% ]8 u4 o
6 |) Y; ~+ d  h0 C2 o6 `CREATE TABLE `user` (
: K5 z3 c- h% P/ L' I`id` int NOT NULL AUTO_INCREMENT,* Z7 p2 t+ o$ B/ S. n  p
`name` varchar(255) CHARACTER SET  utf8mb4 $ d: j  E( H; E- F2 N( p  P
      COLLATE utf8mb4_unicode_ci $ S* z. Q, [7 S: X5 w/ }" k
      NOT NULL DEFAULT '' ) R% y, u8 a: c, H  m* }3 w3 W
      COMMENT '名字',; w/ _0 w9 l1 u! s1 K- p) U, {3 Q
PRIMARY KEY (`id`)
: u  _7 G, W# [! F' y# {) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ; `# `6 @' K: Z5 F5 O4 u
      COLLATE=utf8mb4_unicode_ci
9 T+ q( ~% C2 [( z0 C      COMMENT='用户表';
6 v- s0 m2 p, m4 ~* z) U我的需求为:根据用户的名字查询用户的id" R4 R, \4 n% W  @+ a6 O
9 ?( i6 o2 w- M) y; w- ?& Q) |: x
回答
- m& L+ v$ U' j# ^  m# _. I1 r2 _: F! X1 S
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:4 f1 f  p! ^' `1 m3 C) }7 Y
* i( ^9 V0 L, {: Q
SELECT id FROM user WHERE name = '用户的名字';
% O  A4 m2 R1 D) D这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
% Q$ I1 s, f, ^. d# w. L9 J* C& {" ^7 g; Z* K/ G% E  ]) G. z6 K
您可以使用以下SQL语句来为name字段创建索引:2 f" a, p  K! b. I: Y5 ?
/ D$ y; Y0 ^2 i2 X4 F
ALTER TABLE user ADD INDEX name_index (name);
4 m1 g& I# z1 v此外,为了保证查询的效率,您需要注意以下几点:
# i! @9 ~( F" k$ ^1 A2 \, \  S; a8 ?3 x) @7 D7 S
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
% I7 J0 T6 l1 K  q! Z* H# P, y& g/ ^# U) v6 O
如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。
- `9 q6 N" ]- w2 ~
: r) N" N( b8 m" N例2:智能客服  \6 K( E' ]4 o
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:) N, _6 c8 o. ^4 F% i0 K" o

0 z  \  v6 q# Qlanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub5 ]- P% O! {3 l0 }" z4 ]  A+ m
! a1 n) l( s/ d6 O! a
下面代码通过消息对象的数组注入了一些上下文知识。
" k& w- k1 ?$ k, w, R
- M% t' Q- M) p- k6 W   ?, _6 G% a$ t; |3 X( k
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work# v6 u* Y; D% I# D- {+ W3 C. B* p
import openai
, a$ M. a) A5 L 8 K- J- K9 D- z% _4 V! K) ^
openai.ChatCompletion.create(7 H' {. Y& F4 w. q
  model="gpt-3.5-turbo",% ^2 g+ g" K8 V  L5 f) k$ N
  messages=[
) s3 i! D& R+ i- A/ y        {"role": "system", "content": "You are a helpful assistant."},
1 h1 h( w" y5 b* i        {"role": "user", "content": "Who won the world series in 2020?"},
6 x. Z8 o  L( q  }        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
6 Y( m7 Y2 H0 W1 Y! ?- ]$ z$ \& [' s        {"role": "user", "content": "Where was it played?"}. o5 m) x/ M7 T; a
    ]
$ C9 e$ t9 l. p; [0 E)
+ I3 M4 @* _- |' u! a+ Q6 h ( p  @( t3 R5 o5 [8 C) f
其中
9 V2 F2 g! k4 C, O+ u) v! \
' ?- b# p- Y1 T2 L2 r4 z3 W6 P系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
, T# W, q+ f! ?0 |, u/ {用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。% s% V8 s0 `! f: X) N3 v2 z. W
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
' c  A8 [' N% f通过上面的方式就可以完成专业领域知识的注入。! p( h+ ?+ {7 p7 P+ W  A
! u/ }* x5 a6 J% z* {4 ?1 L$ J" [
例3:通过外部链接把内容带入
3 y3 ?+ E( P' q+ T- A0 v" m( y下面只包含我们发起的对话部分,会话结果比较长,省略了:
) G. t+ C7 _  s5 c. z+ c4 w3 T
: O+ Q& h* r1 yUser : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?) F6 W7 f, c! |+ ?# Y6 ?1 I
...
5 {' i( G- |. y2 x+ P4 f4 l( x* PUser : Microsoft 2022 Annual Report3 I( N' \' A% S% z$ M4 w2 R
...) B# e2 D3 k, E# H4 M( Y  e
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?( N/ \6 a' N& ~; l+ F$ @# v% d  Z
...
% ]9 F& I' T3 D4 x+ J( u, Y$ UUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
- D9 I6 r3 L6 h: R! C1 O...
1 e8 T* @- |: y& Y# sUser: 您能否从Nvidia的报告中提供更多财务见解?
$ s; O) x+ \; `3 _; S8 B: O3 J1 @7 d...
2 C5 E( |# l6 B2 {4 {% y2 }User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?- x  A7 Y7 A; Y
....; z9 o2 V- U3 @. U6 I& q
! b3 {. l' L  ~. L9 j( V1 L
User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
/ m# \! e  m3 g( I( V1 i6 J...
# E* ?0 Z, Q$ W  x( ?/ }; ~User:预测下戴尔未来12个月的现金流。
) t% S& `8 y. ~; o4 ~6 \4 _
& K, g# I& m' p) Q6 l这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。8 `( d, G" n. s/ |1 n( l3 n

8 C/ I  o; ~4 i+ ^# ]: G2 ~& ?适用场景对比' h' W" I: N- e
价格对比
3 Y4 C% L" R' ~$ r2 b, EOpenAI的相关报价看: Pricing
5 }2 N. ~# |! g9 y& `9 i& `( f" {9 d' z+ X1 u8 l
对话类:GPT4远远高于GTP3.5。, {% E; b' G. d0 v9 k. _
OpenAI的相关报价.png
9 E) {5 i4 p* ~& Q" u" K9 o( z% a+ Q8 `! J- Y: X
2 w  V. c( g4 I7 U5 N- X; _
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
: {2 S' n1 g9 D: n4 h% Y& p' i) c3 f* H( P) p
1 I! f# m. J, T1 ?: n3 _$ E, ]6 K
Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
9 X2 J0 o5 z4 L/ b( q$ L" n
8 u; W1 m3 e! j, W
; D0 G: P2 y) O# I" @0 X
8 W  s4 G6 j1 @GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。1 w# z& o5 i& H* d4 `3 G2 R) T
1 O& n1 d5 s" i* o7 m
而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
6 G& t( w, U, H" h1 L$ l) `0 }4 b3 ]) j6 Y
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
" l! K1 c" s* i8 z& a
; {" |9 \, y- Y, |: l# M长度问题
9 Y- V; o# J4 {5 x% c- U# W+ JChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
9 C8 T  d1 D# R, u& F, z' ?  l+ u0 M
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。' R; d1 W3 U. L& N0 h" D- |
4 R8 a9 K8 S% H
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
+ d; W5 W9 R6 L# V. Y! v2 R! z( }, ]7 S9 u( L! q
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
, i2 \/ w. Q; d' r8 Z1 v: C1 S2 K8 C/ p0 H8 Y# P
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
# C5 v  O! s( r  w9 g4 e0 x2 `! @5 Q( S! \
比如说用户提了一个问题:# N9 b2 B. ~- T; ?3 }! O

% I( p9 O7 o0 k7 d4 z' y7 D“What's the makers's schedule?”
( I/ b6 R9 Z3 ^2 \0 m" {3 J2 b  v6 m8 U7 d" M. D6 y6 |
从数据库中检索到相关的文字段落是:
9 ?  p5 P, N2 ^
+ |7 i. u  L+ q; |4 Y; X" `“What I worked on...”/ o0 a" c! P2 h/ Z3 Y, ]8 B
"Taste for Makers..."% Z0 s: i0 C3 a: E. ~  X
0 Y: f# Z$ j- l$ X1 l9 n
那么最终的prompt看起来就像这样:
1 `  ~4 \, K# K4 u* m7 H% p( K+ o8 j" y1 [( ^7 C; R
; D3 z  Z' d. c, t( V5 F
[' [) @1 w( R5 T4 P: ]/ [
{
) T8 j/ ~3 ~  J  role: "system",0 a8 q6 w0 v& [5 k
  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."/ b1 ^: s2 a" g* U# X, W
},
, x) r8 C" t9 A3 z  S, k  @: K7 n {5 x1 f" x+ M7 d" l7 C, `8 o& r
role: "user"," b; n8 {' M3 P3 [* s! d
content: `Use the following passages to provide an answer
' }8 Y$ W0 U; kto the query: "What's the makers's schedule?"
- V0 p9 u% `  Q4 g9 q9 X4 f1. What I worked on...0 c& ~$ {- I" T% Q( k( J/ E
2. Taste for Makers...`2 k4 Z+ \: B; p( @- ?8 @
}' O) U/ b  M, K, |0 F$ b: o* i/ O
]4 r6 t# d9 Q! m( G* v7 }
4 O+ L/ h7 j* g* F) D

% S0 v, V: O: N8 d( J/ x这样ChatGPT在返回结果的时候,就会加上你的数据集。
! }- o) G9 t- `  N" n3 y6 c7 ?9 C9 M1 `
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.$ T9 R  v7 L# G4 _7 n
, E, @4 y7 U$ T. }; Z1 l# B
总结. A  B1 }4 `1 E$ M* E9 z6 C
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
- x. i. S4 A' f2 f* q- o2 b
) e- g. `3 {* E而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。* j! r6 a& m+ G) \1 K1 R+ K, X& b0 W

9 z2 [" `4 C& D( M- \参考5 x/ g( z* O5 v( I2 b- }6 j
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客' V/ m2 S& R* ~3 W6 a- ^  f# M8 o
1 u- A4 o0 A9 E
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
' A* j/ o8 s) G2 Q' d0 A4 W
: S0 P. |9 H. D" b$ l# C: S" k
' R; B2 w4 l) l( G6 [————————————————
! i1 e0 H. z( K1 i" s) l版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& v4 k9 r& j0 A' w* |原文链接:https://blog.csdn.net/ghj1976/article/details/1296761578 \$ p- V& N0 @% J1 I# w0 x/ X
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-10 04:36 , Processed in 0.754432 second(s), 31 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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