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

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

[复制链接]

319

主题

485

回帖

3133

积分

管理员

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

" u" @: f* D$ q& N4 AChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
% D8 q9 Z" e9 a' [8 a: G! C# |9 {/ b/ F! ~% J6 f* d1 o; h
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。6 @' h; x6 R6 J( c, V% Q; b

/ p9 z: E: l" I5 O2 U3 s我们应该思考如何让AI在专业领域中释放更大的价值潜能。2 O9 Y) {9 Y. U3 L+ S
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
+ D: O: Z) F  w/ g& u8 _4 u
7 T3 Z0 s4 n# T0 T) ~" p以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。* E* G1 d4 V# T1 m+ u8 p/ c3 S; U

1 c  U' g' h6 w& o* w
. i6 B4 u: D5 b: c 以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png
6 p7 |8 y+ f+ L7 j
2 q3 I5 L+ P8 k1 \& }% A' g 5 J$ [  g8 j% \3 E! F( ?. `  B

& r4 {  u# C( |7 I一、微调(Fine-tuning)注入专业领域知识
9 e6 N' R( k5 u5 O: l6 J& T( q微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。; H: x0 U# m& {

$ o0 \# b  A, d! e0 S0 d5 Q传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。$ b: v, g, j+ P, _6 L: S6 h

3 j& }& H# P: {4 p  w如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
0 `2 F. H9 ^9 K' \, S7 X1 A2 N0 A0 m2 G5 }3 Z
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。9 _' j& w% l! n1 \  H$ M  w
( F- g# o6 ?% O  E  D3 r2 @' V7 F
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
; q. ]" Z. Y" V- X' M
3 o# G8 t; N9 Jprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。! O3 m1 Y: N: ?( C3 T

0 c, ]( ~  X/ O# Qcompletion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。0 C6 }4 _# w4 `) X( f
/ C- P0 N& g" t3 X( x& |2 y' D
下面是一些数据例子:
% ?9 b/ S8 L5 N" E1 E: e% l8 e8 x6 f% n
{1 ~0 O# T" s9 y7 V+ ]: R( r/ L( d
    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
, z& i3 C& S9 ]2 B9 F) J    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"5 L- m) P+ L: w( K/ v7 _; `
}
7 f/ c9 c+ a( P更多的例子可以看如下链接:
5 j( B$ r* J6 j7 o: P) n. v( M% Y6 l; ]9 S$ i; `6 e
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
! A9 a0 x$ V2 ifinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
4 v0 L: Q( Q2 x0 a要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。7 _# v$ I6 l( x- k; d' d* I

3 x; p5 K: A% V, K) n% H0 j二、在Prompt中带入知识  v, z" ?+ A! B% N2 r( H( F
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。8 L3 d: `7 g3 q! [

- j1 {# t! D- {输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
  f3 ?, C" @9 O6 x1 ~! J! R3 I6 H6 Q- ]' z; @4 G' `
下面是一些例子:
" g: S) B; M. _' Q
+ [* O6 b$ X) z1 f( V  Y$ o例1:作为专业DBA,回答SQL相关问题8 W; k7 j! d% ]$ I* p/ c# I
这里在输入问题时,引入了我们的数据库表结构这个专业知识。+ \4 m, X' O6 G% }- V2 O) @4 O

) F. f; |( ?, r  ]2 j4 X问:' B' G) }; _0 I# m6 i& X) M: Z

  q  @9 v5 G/ s我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。
0 a* b5 i$ a- H. _' f
; z7 ~& e1 \5 S- }4 o1 S我的数据表结构为:* p9 `8 t& B, D/ |6 ?

5 Q* F5 t' ^: y! y/ r# m# A; lCREATE TABLE `user` (
5 q+ [. J( M1 Q5 @' ~0 `+ i`id` int NOT NULL AUTO_INCREMENT,( r: k8 v" n( M( y* ^
`name` varchar(255) CHARACTER SET  utf8mb4 ( F5 W- A, |) U1 U/ M$ H
      COLLATE utf8mb4_unicode_ci
1 C" G! f; Y. W! _      NOT NULL DEFAULT ''
7 X( G1 h% f. }5 I5 _. ?      COMMENT '名字',
* }) N6 e. a+ h% G) b8 s1 CPRIMARY KEY (`id`)
' {5 ~& S, c5 `* v, X0 l) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
- J+ g0 z, P1 I. _      COLLATE=utf8mb4_unicode_ci / q  b7 g( }3 q. x  k
      COMMENT='用户表';
  t! D  i- s0 s, s我的需求为:根据用户的名字查询用户的id- I/ b# Y7 s9 U* `
3 A! o/ X' r5 S) j) q
回答
" _6 m+ O+ @, b0 \7 D# M; C. z4 K1 d  R' r3 R
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:7 Z0 E9 }. z0 U. E" m/ r$ t

  ~4 h, Y% E- ?2 e; ^SELECT id FROM user WHERE name = '用户的名字';
6 s/ }# `( k/ S( ]这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
- g0 J! X: t! C: J& t
/ v1 L9 N6 n- s; W+ s7 y- G您可以使用以下SQL语句来为name字段创建索引:. C) m$ `% s) o; c' {7 D9 }
% O+ q+ |) G8 u+ A3 N/ N
ALTER TABLE user ADD INDEX name_index (name);9 [# l' X2 A6 J' w1 P
此外,为了保证查询的效率,您需要注意以下几点:+ q' Z( a5 B  C& ^& ?

% n; B7 ]% R% X/ f数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
, G+ {  o4 c8 e
, M) o9 {$ H0 e7 Y( R如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。/ _7 _' `3 ^1 s& D" ^; z1 G
- y6 [" \5 A% P/ }0 j( U
例2:智能客服  Y0 V3 A3 }5 s4 [% k
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:( t5 A% l; r5 u/ a3 \' a& A
+ R! s: {1 _* w5 c0 e
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
0 y  L: y: J4 ]# H9 z9 A; ]# a$ p% l
& v- Z3 y+ G* Q# x: F* N下面代码通过消息对象的数组注入了一些上下文知识。
2 R: {# o, U" W
* I9 _6 _, C/ }8 e. f & w0 ?9 Q6 y' N: [* {
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
+ B% n& w! q7 U1 l) m! L5 oimport openai
! g8 c; C: T# R4 \2 X5 l% c9 T
9 I; x$ r# N3 @# yopenai.ChatCompletion.create(' o4 L* B" V5 u/ K* a
  model="gpt-3.5-turbo",
* x3 d' G% A$ a. k6 N6 i  messages=[
& S& `. B9 @+ J# z0 U        {"role": "system", "content": "You are a helpful assistant."},
+ J+ a2 M5 R  Z( [9 d3 p2 v- u+ M        {"role": "user", "content": "Who won the world series in 2020?"},6 U0 G$ N+ v& n, O% }: R' y' W
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
8 A+ n: I* R7 G        {"role": "user", "content": "Where was it played?"}7 C2 i9 V# y: N$ _1 q" [
    ]  t) S8 }) S- ~/ M
)
# Q, a; ^. X$ H; }# f9 | ' S4 n4 ?/ f* ^) K& ?
其中* B0 i) }5 j& q# S
& O& g+ X' ?+ @
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
3 O! }# C) x0 F" @" H用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。
- \0 m$ E3 F  o  o助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
. ^* V; z1 s3 f3 |* `2 h; f; j通过上面的方式就可以完成专业领域知识的注入。
9 A1 W- s% u6 q5 z6 s
& v2 n# d$ \$ ~3 ^3 e/ N7 d例3:通过外部链接把内容带入4 x3 i% g: n- x
下面只包含我们发起的对话部分,会话结果比较长,省略了:4 |1 d. Z% J+ X6 v

: I( ^9 a. f3 L! S6 FUser : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?
  W/ K8 q9 D7 ~& i& R/ S5 |- j...
" l7 N% V% K  Y& [4 Y' MUser : Microsoft 2022 Annual Report: E9 g# a5 m, ?! {* I: W$ [
...
8 h! Q) v& Y, a7 Y; o) ~User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?" o  G- G6 a. W8 ?- O  v: w
...
$ E) @1 `+ p$ _0 kUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
& h& n, @9 ~2 C...7 V* o% L4 L3 o; a6 i+ m) o
User: 您能否从Nvidia的报告中提供更多财务见解?
0 k) Z& \- k" R  J& Q' x2 z$ ]...
: W$ G: f5 x* R* H  u5 pUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
0 E9 Q3 M0 ]  N( P4 k....
) O9 j. y; ]! ~1 D- ^: R2 d# s+ F
User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
: S" R  w2 M0 Y9 s...
: {  L! D- ]% F( [! MUser:预测下戴尔未来12个月的现金流。5 x# F9 ~5 h' l, ?$ Z& c) V6 P

8 u/ Y$ W1 C6 Z5 g" J这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。/ L+ ^3 L. V8 J) r* e

0 r; n6 B3 L+ X! Y5 _适用场景对比
/ d# Z. x5 i" O. |$ c0 m价格对比
, G4 \9 \( L: ]+ N& h! POpenAI的相关报价看: Pricing% K* k( m% U* A; _" ~6 F  p

8 C; b! K' f; A对话类:GPT4远远高于GTP3.5。2 Y, l5 |* n8 Z. N! `' I
OpenAI的相关报价.png   ~2 n6 g- n/ U' |9 R6 r
# w' o1 j+ l% D7 n' E( g: }: g
# f! k4 i! A8 y  V# @0 @" n
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
8 A' [$ j7 D& p- G; ?6 y
" {+ p2 l: k$ {: f+ R* H( T4 T5 P$ R8 a' J
Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
5 y/ C, |5 g( ~4 o  B, M/ Y2 {/ X) t. a+ L3 j8 |

. i* q3 T- Q) L6 \' @7 V3 }" A! t- f' y6 s7 E$ f
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
# n4 ~4 S3 Z6 i; P0 h/ |0 I
4 i, Z4 h0 s8 j: X5 m# `' y9 u而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。! k9 T, w# W- s  k+ r7 Q8 S- y
  Y$ f0 K; K/ t
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。: q2 p8 Y. |; t

  A2 N( `' \$ g7 K4 N7 ^  o长度问题; F/ |: [% d1 Z0 U$ k  o
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。$ _0 a. n7 [+ k( O

1 L. ~" B; O) j4 d( U6 s但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。. F" ^3 E) N  v

4 L1 e! X' k: {6 |' A首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。); e" L- ?: f: P# \6 i
* [8 c# Q. k; E
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。* E4 [) u1 n- {, C9 q/ V

: O5 w; N  T  [4 s聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。  t3 g5 J* m' H2 Q$ ]

! b/ L# i( r5 Y  e& ?/ a* R比如说用户提了一个问题:
) d0 r! t$ V  x# Q4 i: h! m5 X* \# l8 a2 y
“What's the makers's schedule?”
, k  l4 w( o; _- H! f6 o3 k+ y
& r5 @% g1 h# Q% {! }从数据库中检索到相关的文字段落是:
; w- o4 ]3 i; V
7 m! e+ ^0 U. n* R“What I worked on...”# O: Z- C. l- |5 N, m) ?
"Taste for Makers..."6 F% X% `, n& t$ g3 J. J3 R; o
; S' `  o% v# }1 q0 _
那么最终的prompt看起来就像这样:4 ^" `" j  o7 T* k0 i6 s
, B; X8 _. z5 w6 [( O6 k

) d3 a' [8 \2 l: M) {1 p[) e8 o, r, C# G& W+ q
{  d/ k/ w5 ^: ?$ m4 B  }9 e! Y
  role: "system",' K( ^. l: B9 ?& t8 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."
+ p$ x$ v& r0 ]  m' t  v },. [. v- M7 D$ p- }5 U) t) t
{
0 d% K/ O' z7 s( L9 s- f4 b role: "user",; [7 O  _4 e' F# }# h3 T- p. L
content: `Use the following passages to provide an answer0 Z2 J4 P7 t$ x; G1 ?
to the query: "What's the makers's schedule?"
& u) t* s& b3 E: p1. What I worked on...6 G4 e6 S/ m0 `( J
2. Taste for Makers...`
* r" s1 X, V0 C# E5 w }
( G  Q* u# I3 n+ F7 E- h]
7 H& M( {" y4 B) c 6 ]* p9 U4 Q# P) ?
. A2 k2 c& d3 v+ g2 b
这样ChatGPT在返回结果的时候,就会加上你的数据集。
3 y% u$ x, Y3 N' k9 h  d
+ a9 o% C- W7 o5 L具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.% i# z( A1 k/ y
4 s7 H) u# ]  n( m1 x- k6 Q
总结
, A$ A4 K+ s; v3 M- R- w2 N大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
; H' E+ s  m8 i3 c  C0 N$ M4 Z, h) f% \& _: O1 E
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
2 ?- h) C! S/ c' x  H0 M& G7 I2 A7 j; |
参考
6 R: u# }) f8 s! q0 `如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客
7 G- H+ j, ^( w8 w5 _2 w0 o1 f, `; r' c
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt9 P6 `; S: s, B
) h+ M0 E, u' C

$ p4 A- s& {# M0 W* H+ y8 y————————————————
8 x& J1 y% G, L& v0 v! c. l8 O版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& F) |. n- M+ T/ n& z) K, N  Q1 U原文链接:https://blog.csdn.net/ghj1976/article/details/129676157- I" q) \! G0 X2 C5 Z# a, g, T
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-23 14:20 , Processed in 0.082619 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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