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

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

[复制链接]

314

主题

478

回帖

2960

积分

管理员

积分
2960
QQ
发表于 2023-5-29 10:35:28 | 显示全部楼层 |阅读模式
3 q" F! o4 l3 U& Q8 p
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。( i8 z% I; _) z. r3 D) X# {
% y) I" |2 ~, n" z
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。/ Y& ?, \6 s, {( l' N
$ v8 K. [+ w  ]0 }1 u  j. Q+ R
我们应该思考如何让AI在专业领域中释放更大的价值潜能。2 y! @( R, h+ U2 c: r" _' a
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。7 H+ ~( ^) `/ m* G1 m0 x
) Q0 S( G: P$ ]3 A5 o, g, V. ~4 X
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。. h: g5 J" x% y' \0 L, @! }/ m4 m

4 o  d6 t/ v3 d% o
; V1 R& J2 l. E 以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png 6 a  x5 p& D6 J

1 M) G8 H8 b( ? ) ~' V/ E: r4 ]6 m$ Q; ]

3 w  |/ _7 ]$ g3 L( Q一、微调(Fine-tuning)注入专业领域知识, l) E& u- f. W1 E2 I# M5 Q
微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。
) e% L% s: P, a
0 E' ^' G- L& Z2 J7 O7 @传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。7 y4 o' R/ O7 _% T# t- g( r) H
7 x3 ^; u6 i! V/ C
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
1 I( Z* {& m  v4 K/ [. c' {
! C, u9 l8 f+ Z& ^% i8 l$ WOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
6 B9 r+ N. d4 a( \8 l, N% r. g( F+ J6 {8 D6 _' a" F. u
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
# U; U. }% _" \. t9 c/ D+ W; e, q) y( w  W, z
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
. W5 n* M1 @; z$ S, ~+ d% {2 F' b8 Y% z1 h
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
. C5 \, t. b# W0 W4 h) D2 N! w! u  P* |
下面是一些数据例子:: ~/ S( {2 S3 Z( k) U6 X2 @) J

; w/ G  I, C2 u& T8 G{
& W& D  K2 M' d3 d1 z- k3 e* c* e    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", 7 O. D% B. B5 D( |$ P& g' K7 |! d
    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n": p% x2 d( J* }' {9 s& Q
}; X  J. a. z7 ^& S* W. f
更多的例子可以看如下链接:; l% G% T6 N4 @( t

& |$ x) v6 [/ j0 k2 U( @GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
: C. Z  G* Z3 b2 x& Z! Nfinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
5 I% a6 u% e( l- {要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。  `  x2 |, d+ \  V; j

# p, [$ i" J% n二、在Prompt中带入知识& f7 p0 O' j. l  Q: h4 r
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
# \5 e' s* q+ P7 y7 R# k9 `
/ o9 h2 T9 U2 b1 o) h2 K9 z输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。' U* ]/ m7 ~% ^

: _+ E! L4 q, T6 N下面是一些例子:
0 m& ]  c. k7 A2 B3 n! E9 @" C
, N; U2 V5 a  i. H; s# `1 d: h+ L例1:作为专业DBA,回答SQL相关问题  A8 n' f  A$ w1 C  z
这里在输入问题时,引入了我们的数据库表结构这个专业知识。
+ b$ m4 U* p, s, f: p( l% K3 L2 {$ N
问:
8 o/ j; m: E) m3 W. F# X( O8 A- z, y; x" \8 a
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。: p' d4 |7 N5 M# b! q! \
/ z" Q- X4 e% B1 w
我的数据表结构为:
" _0 A: i4 T' E0 i8 j
8 |# |! S! ~# C' u4 N; q9 xCREATE TABLE `user` (# Y' {8 o' E/ `' ?
`id` int NOT NULL AUTO_INCREMENT,
& E9 A5 n. z# Q+ d% F`name` varchar(255) CHARACTER SET  utf8mb4
7 W1 S# Y* z$ y3 R5 U      COLLATE utf8mb4_unicode_ci - [# [0 t* u* y
      NOT NULL DEFAULT ''
' f2 R3 z1 W+ l# B      COMMENT '名字',# {, Z" w# Q; o, V2 o
PRIMARY KEY (`id`)
' F! `* N) V' p9 t! Y) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 3 Z8 L* B6 F8 {  l$ T+ p
      COLLATE=utf8mb4_unicode_ci
1 a: ?2 v  G4 ?2 j1 r5 p      COMMENT='用户表';
, P# k0 w, a4 p  U/ |, r2 |我的需求为:根据用户的名字查询用户的id
0 x, m! M4 X, ~/ m$ A: t+ S+ h3 Z! Y  Q
回答" l5 }5 P7 X: j! y6 R& X
* v3 U. o! X& N5 t; u, T
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
- x! |$ O$ ?2 a# R7 Q# b- `  L
' s; Z4 ]4 C1 b: n3 N/ iSELECT id FROM user WHERE name = '用户的名字';$ @5 k% {# ^+ }' f9 C- A
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。+ R) t# b, [9 e7 t4 y( }3 Y% c
7 Q8 W( L8 [1 M3 p2 @
您可以使用以下SQL语句来为name字段创建索引:
+ }( L6 ], _6 i5 }0 P$ A; u1 l' o) g# R. h1 q* ~: ]# x
ALTER TABLE user ADD INDEX name_index (name);
, b: d, L( d/ J7 S此外,为了保证查询的效率,您需要注意以下几点:: W- ?% @. H( X4 O3 a' k
1 f, x' ^" h, w/ P
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
' _4 Y  \4 \. P& q# y
. o7 ^# c6 z' S& K4 x8 [- p+ g如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。
7 x) s; I* @- z0 }. y* k# E$ C6 y- `6 V' ^: z2 V
例2:智能客服4 R4 ?5 B. ~6 U; c' f  ^
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:0 u: k5 w( g; o+ P

8 Q- c7 j; B3 J7 _0 Q, nlanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub7 ?7 _" Q6 _( Q

: |" H/ N' j7 R0 J. V! A7 V9 b/ F3 e下面代码通过消息对象的数组注入了一些上下文知识。
% b1 H7 r" y, v. k% i! ^8 n7 ]9 P/ Q; A! N# f$ @6 @- i1 U

4 e" P# h. ~1 c* O1 ~& j# Note: you need to be using OpenAI Python v0.27.0 for the code below to work- ?, H4 D6 e! K9 x
import openai
1 H7 h; V- ?6 y" N
* }3 `* I, M. j- K4 \2 U& A3 eopenai.ChatCompletion.create(' v+ U) K$ E- A% v; Q1 Z
  model="gpt-3.5-turbo",+ Q+ V$ d; s$ S0 D4 Z
  messages=[) V; S0 P; j4 j% n$ ~+ ~( S
        {"role": "system", "content": "You are a helpful assistant."},& ]- X( `% ^! J, \/ y. C1 f3 R
        {"role": "user", "content": "Who won the world series in 2020?"},
% Q0 }. _/ q* E" L0 p) \        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
" j% j& w6 J4 [3 l        {"role": "user", "content": "Where was it played?"}
- d' e$ R! F" ^+ I4 A; w& S    ]
" ^3 g2 h, i6 X- B)& A- O' V2 q. o" }) l$ z! ?; O  |
: G7 D, D; _3 C. A- Z, |4 j
其中' B+ l2 ?2 g1 V& m8 ~- D
: S& k6 |: U' l, t
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
2 ]+ i+ Y, k1 Y9 U用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。
& o" m, u5 L3 `8 i) S& h助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
  b' K' Y+ M) i( K9 k通过上面的方式就可以完成专业领域知识的注入。) f# t& W' _$ b& t
& |0 n" n4 c/ z5 _
例3:通过外部链接把内容带入  B/ M) a3 S. ^- Q! A8 d# }
下面只包含我们发起的对话部分,会话结果比较长,省略了:
) R9 ?+ M$ w5 _2 g  H; b' [  ?4 n# D- h
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?7 q3 m" I8 N) C8 K$ a
...
: k8 y. B. t$ _  ?1 F& E- P. W* hUser : Microsoft 2022 Annual Report, R) o! e! P9 V2 M) M. A
...
# D0 |& J" H2 Q# D! EUser : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
6 \- y1 ?" q2 F% {) p7 ?.../ K. B( z' R, G# R# t; Y( o$ K
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom2 ?; |/ X) H! O/ a
...2 w, w8 d# C: f( [
User: 您能否从Nvidia的报告中提供更多财务见解?
5 L+ Q; _) \& H( R% u...
! M) Q9 E7 R$ Z2 M# v8 ]User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
  w  B1 |4 e5 T! b% k5 \+ k; Q) u....1 E+ G% n/ X0 Q$ {  W

  F' H! L# s6 WUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。7 w1 T. w# g- d
...
4 {' _6 T+ b. t6 U" D/ y) bUser:预测下戴尔未来12个月的现金流。3 k$ \7 f$ [9 ^8 F
! _3 ]4 R) R7 k3 a# `) c; M6 h
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。
8 [5 E$ \4 B* G1 V, q/ B& h2 N8 ]# b1 }" ?
适用场景对比
9 G! i3 T$ o$ j7 V; g, \* {4 O) `价格对比" F2 Y7 l1 r4 ^1 N0 V( b7 L' e- R
OpenAI的相关报价看: Pricing
  F3 U* Q5 h" n+ ?- W; D
& F' N9 d/ X0 \6 F对话类:GPT4远远高于GTP3.5。. k: ^0 \8 m7 ^3 {- N$ Y) j7 r
OpenAI的相关报价.png 0 o9 ~6 v9 c8 X0 q) c

5 f8 \' A9 [9 d7 r7 V; Q1 a0 r
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。9 U& q6 f- K& C% n9 V
/ g' @2 V( y$ J

; S9 Y0 \- x1 M, S8 S Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png ) T/ }1 }# a" e5 G+ r" D
& J% S# F9 ?3 q% w
3 ]: T5 a  |" [$ ]

" S! L/ ^' N: d  h. e: E8 q( SGPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
+ d0 D9 [4 v' r$ H, C" P3 q
! [" D" E# U8 v0 j而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
7 t2 M! B% ^3 a1 ~) A, k. v* v* C( ^4 Y* ?2 O0 w
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。% h* m) f! k8 U4 V0 X& I4 Z, P* m
2 \' G) J+ v9 s1 p# [( D
长度问题0 G" K1 _# n, h8 M9 `, w& m* Q$ n
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。( R7 P4 i; Z% l5 ]5 Y6 {4 t1 m
: D+ f( _4 u+ Z* q5 v0 \& N
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。) Y' w* S1 V9 J

3 R, N. e; H8 r" Z$ Q- K首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。): o  ~( ~- O) a5 q& {7 Y

% @6 G% j" I& f/ R当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
% M( z9 ^- L6 N6 b' K8 g: B7 U$ g0 p+ V3 P4 N- t3 Q1 [
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
4 j7 P. B! h& R, P' h4 K
: r  L) w; V3 c2 n( q$ n2 c比如说用户提了一个问题:* ?) V4 c1 Y& _2 y' ?" N
  }7 I  O7 P6 F( K7 I
“What's the makers's schedule?”; h, X' i; J& ?7 W
3 C/ |* w1 _! J& h1 ~9 W) A+ y
从数据库中检索到相关的文字段落是:
! E# P, h' w0 v5 s
/ j) b: T- g# D' V3 B( x“What I worked on...”9 P: b) b$ k. H4 v
"Taste for Makers...". m6 [) T. J- E0 N1 M: c2 @5 [9 j: `

. \. m( Y+ E- e$ g9 X那么最终的prompt看起来就像这样:
6 h- u1 q* ^$ a# Y* `7 O# O2 I1 `* u
+ e5 e8 H: F& f( z& H; c* j / ?8 e" J8 @0 O: j; ?
[
. L- O% ~) c/ I* g0 D+ o/ M3 i {6 c% S  W" v7 B
  role: "system",8 N3 h: n; T% D( e: L- r
  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."+ L$ t2 g3 L6 ^
},
- k% I% S0 r2 [% ]7 M {. s, n- U9 P8 L  [  f+ \) a6 g
role: "user",- b( K/ Q2 `, _2 ^
content: `Use the following passages to provide an answer* W: @* Z4 s/ V1 F; _' Q% [
to the query: "What's the makers's schedule?"
9 u& r' ?9 y  Q- y  Q0 K( S1. What I worked on...3 u5 ^$ @. ^1 y- R7 \  X
2. Taste for Makers...`
! X0 K1 ]& Z0 s( z$ T4 L }0 b$ g) u. S7 t# s+ Q
]6 }% a7 C  I+ ]9 Y) U

/ o8 t) c4 d7 s, [& M( Y
5 K4 {0 k' M8 q  H4 g2 Q/ q; C% X6 x这样ChatGPT在返回结果的时候,就会加上你的数据集。+ y6 i; H( y5 Q; }1 E$ A- `
8 l7 S, T0 Z  d# ?" i
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.$ @! D  H) G- v+ A1 U6 D- I
3 H4 i# q" i  E& M, e
总结
6 E! l; C/ q7 ]大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。; h. Y! C. T& K" s  L% z

6 ^/ T0 d6 a" m  u而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。/ Q. S: H- t: s
4 S1 l; A) Y. e3 Z
参考( N8 t! V7 n( |( U0 Q: ?3 c
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客0 Z: N7 ]3 Q4 ?& F% Z  Y; F  Q

$ j& E; l: p" O搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
% r0 Q5 C" o) y2 x; I: U" ]" b: [0 f: i+ `$ ]

' e) b1 u7 k" y————————————————
  h) X% t  N( V* d$ N0 T0 ^# ^/ q版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# q. y* @& M! U5 I* [" q
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157$ p7 y8 R+ p8 [  _! f
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-5 02:07 , Processed in 0.087230 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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