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

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

[复制链接]

556

主题

688

回帖

4727

积分

管理员

积分
4727
QQ
发表于 2023-5-29 10:35:28 | 显示全部楼层 |阅读模式
# ~0 M+ k3 j7 G6 a
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。% B9 z7 b1 ^6 R2 L
, t; \! J8 T. j; I
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
) S9 Z; A7 _1 `3 t) i) I( q
; S$ R& e4 p+ e6 \* m我们应该思考如何让AI在专业领域中释放更大的价值潜能。
/ q  P  _/ s. Z4 D) [就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
6 |0 X0 p5 e$ m" o( k0 r0 N9 B- z- ]( M6 Y/ h% W3 \' ^8 T
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。) U8 O/ D- x7 s, D. r
& B" f6 |2 [) A0 ]

3 |' {" s. S! W( y 以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png
$ Q$ e5 r# q3 W, p6 a+ o! K& s/ j6 f, W0 ]* j
" X/ A4 n4 z2 n* `4 \# v7 r2 T

9 B1 q$ E5 s2 z一、微调(Fine-tuning)注入专业领域知识
* D, J% q, F6 v9 R9 ]微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。. Q1 t9 p3 z# R& l
- @/ m1 i, }4 S6 R  ]& H
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
+ O) ]) H, m- `8 F5 B) L9 ?( C* P& j5 X7 g0 f: L; P3 p! l
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
+ L# D/ G! u" D7 ^9 d' r; P" f6 V4 X: U* V9 m) z$ T
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。* l  C2 c; L% G& b: b2 Y
: ]% @" q& N0 o: _. q, z
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:) ]3 F3 U. a6 c4 K0 R1 a2 B
0 e) J; g( e, L; s8 m! ~) C
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
: |( ]- f( ?8 p! x3 ?# S# F8 A/ z* Y
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
6 o* Z' R; ]$ S4 x
/ [  f2 n: \( D# D% [下面是一些数据例子:* h6 P7 [6 n, i; n4 r" r- x; L/ }

: {0 _1 s1 Q% p: ]- |) p" a{% e: b  a2 x% O' E  U  i5 p% e
    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
* F# w4 i1 ~2 G    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"# f/ `, v* V6 c4 j2 O
}! P( J, D! a8 V
更多的例子可以看如下链接:
" b! v( L3 c1 P9 h* ^) W; d  u' q- Y) y
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub$ z1 r+ a; X3 c$ R& a- M: Q; i
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub$ {; R4 y9 y+ l% h. y$ n! m2 q
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。& I  k) y5 [- L4 v/ B/ f: ?
7 E/ R5 k3 d9 K& p
二、在Prompt中带入知识# Q- p' E. M1 W: A' m  s
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
! F& s( }( i& K+ {; ]# K3 `
" V& s: [- q+ {: v( M输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
( j) v- t4 V" d/ C
6 m6 A4 A/ c* }. c- z% }9 ?+ N0 S下面是一些例子:: a. `) F/ f8 |0 c9 O# x

. z; n3 b7 H/ }9 M9 C$ k( l4 I例1:作为专业DBA,回答SQL相关问题: |9 m; v& `  G5 Y
这里在输入问题时,引入了我们的数据库表结构这个专业知识。
  ]; C4 U5 F( L: S3 n
3 f. b0 ~! R8 E" [) }. T! j* a. k问:
  b& l, j4 ]' h. N% j+ _4 K5 E4 F& B* }! Q; c" x$ m
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。5 X/ W0 s, z/ [* R& {0 y. a3 E( P7 `

. P- I$ n0 J: v. C4 Q! i) U我的数据表结构为:9 p# O/ E8 w+ [  ^# V' d

! R4 Z2 l7 ~$ c& B  D3 FCREATE TABLE `user` (
. ?: Z$ J4 w9 O/ }" P& ~`id` int NOT NULL AUTO_INCREMENT,% w1 P: o6 k3 c, M! K
`name` varchar(255) CHARACTER SET  utf8mb4 % S! i! `  p: W+ m' M- ~# [: I
      COLLATE utf8mb4_unicode_ci
) x; Z) p) r0 t4 I+ b/ e      NOT NULL DEFAULT '' ( {. S' t& G: K8 t* Y
      COMMENT '名字',
  ]$ e" U2 R& k; oPRIMARY KEY (`id`)0 ^3 E' [% s8 B" u+ d! K
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
" Q, B/ Q+ {; D      COLLATE=utf8mb4_unicode_ci & i0 K3 p" I3 x1 g
      COMMENT='用户表';" S% k1 U. l* y' m- h2 ^
我的需求为:根据用户的名字查询用户的id
$ U( Z/ |" [; P( w' [8 @- Q9 w  M# S1 U3 W1 K
回答
3 |8 L- t6 J: `$ \1 G! W* E' ]  `7 L* z
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
- ?' g+ `; j+ w) a3 W: h; V9 J+ D7 i! j
SELECT id FROM user WHERE name = '用户的名字';
$ N5 G' X0 M1 i6 n这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。1 \" \: {* ^! J4 ~
" H( K2 ~0 m5 O; M/ e+ s6 d: o- q
您可以使用以下SQL语句来为name字段创建索引:" i. `2 f& b! M
3 I8 Q# O& q; o) S3 Y/ w
ALTER TABLE user ADD INDEX name_index (name);5 r+ F+ p9 e! o7 V) X) }- v
此外,为了保证查询的效率,您需要注意以下几点:
& `% v1 q( z- ^& c0 _
4 q  u$ Z; q8 a" S数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。! U; X8 j; K$ x  A+ ~. L$ {6 \

" c( y( n. U, D如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。+ U2 a  e- t( o

) }0 f. \! Q6 I* B- L  u) @/ I例2:智能客服; d- K3 q3 ?2 A4 J
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:6 s! B4 Z7 ~0 e/ l

0 n  Y( H& M& E/ e# a! }lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
! W1 \' k, `4 w, n$ Z# w$ P/ Y5 g9 J& @9 j6 u% {) q+ N5 h1 g5 ?
下面代码通过消息对象的数组注入了一些上下文知识。1 L5 Q  |1 W3 w- r; \# m! r

% y7 u7 J& z& }; x2 B: l7 V- z
  l0 z/ ]/ O* [$ V9 w- `# Note: you need to be using OpenAI Python v0.27.0 for the code below to work3 v8 |, ^/ X6 L+ ~- p$ b
import openai
8 u# {- _$ p# B# h/ K* |. A
& I7 H8 T' M. c3 b1 m1 f( U. Gopenai.ChatCompletion.create(
6 @8 @) K0 T5 C! V' B1 V  model="gpt-3.5-turbo",
9 {" W) m1 c4 P" J  messages=[
' T# l, q' k, l4 `' |; Z        {"role": "system", "content": "You are a helpful assistant."},# t; f/ `" @- F3 ]7 Q/ [( V1 K
        {"role": "user", "content": "Who won the world series in 2020?"},
! n$ d; }2 d2 W% k" ]4 c        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},5 l7 S% h0 K9 Q9 E
        {"role": "user", "content": "Where was it played?"}" ]- y7 \4 R) G# F: m
    ]
1 w/ u) K( H; X' H* V! ])
+ q' g/ }& d( P
2 A  i* a" K2 o; v5 J5 D其中# _$ ]5 d& p% T9 U- V  C

4 \& _# ]! l( }3 F9 y系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
# h/ j. c5 d1 T  \3 U用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。' V" b* p& w0 R' W  I3 Y6 s4 z
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
1 i+ {# C' }+ [/ x! P+ ?3 H9 @通过上面的方式就可以完成专业领域知识的注入。
# a! M2 |$ e0 ^  C3 e
; c' O& ^) s7 G7 f! f例3:通过外部链接把内容带入
9 l1 H* t4 }% L0 J* [0 x下面只包含我们发起的对话部分,会话结果比较长,省略了:
* u7 ?+ e6 J3 t# L  u- Q& |) K( t; {/ L: Q
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?( g6 O8 c: }. d5 Y3 I, a
...& `$ ^% W- Q# Y
User : Microsoft 2022 Annual Report
7 }; p3 N: E2 g3 a# P6 N. v6 }3 K...8 f9 V) F" ~( p7 u
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?; H) v6 q" _/ U  q& ^# ?
...$ _+ M. J( b0 S6 I) J
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
, C: b5 l2 a& `& m# \8 C...
+ O) z3 {. T$ @% QUser: 您能否从Nvidia的报告中提供更多财务见解?
6 |! ~+ |/ x- K! T$ S/ _...+ q2 s/ Z$ i  ?- r0 \
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
- A; y1 d9 M3 \....1 @4 P0 @0 g1 e

! S: w- ?# r; ]/ \User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。  K. r; E. C9 X9 O
...
$ `! `' p/ Z( W  aUser:预测下戴尔未来12个月的现金流。
/ `( u9 h0 N/ j$ z$ E- ?; i  n9 P4 g. k" m1 z
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。
( X9 ]' G( i: [% [. }0 H; `
* j0 `" ~4 O# C8 x( q3 h适用场景对比
3 ?- d2 _8 [: ^! y; b价格对比
; C) o- e, X0 B, fOpenAI的相关报价看: Pricing$ u9 B: {0 {( D1 l( p3 W9 O
' P! y6 n6 d, U+ e/ Q
对话类:GPT4远远高于GTP3.5。
2 \! v* w& f$ [$ ~3 R+ R9 N9 z# o, X OpenAI的相关报价.png 1 w! d+ L- T. C; C! x! c6 o
' O& j6 _1 v- @0 |$ e+ I: j

) r; v1 o/ a$ N7 s' P- D目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
8 n. ?% k" q- X6 g; Z
% ?! X$ B2 z/ r0 J" J1 Y( q, Y5 @7 |; u- ?
Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
( y% ]0 o- _1 V. G+ O1 b6 k8 c# k9 F2 H2 ]6 u5 K
, p$ m( j2 b) C; U5 c: b) q

3 @1 D9 w! e7 \: G6 f- Z: QGPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。& G! q! o0 H% Y" \' x. `

4 L/ q' P! l5 C# E- i9 F- H而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。/ E5 P7 g! h9 k
, n( {6 W! p+ [0 \8 G
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。+ X9 K7 U# `# N5 T) I( R$ q

( i. X7 ^. ~6 m. j6 A长度问题) g! z7 h1 _" j' Y1 b
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
" Q! I' t& i: \; k3 y/ G. M1 Z& A7 k1 U% |+ A1 L
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
) p: r2 a$ }0 Z6 R+ l1 d& v
$ i* j- e5 s9 q3 o首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
) u7 b. v( J& _' {4 I
" ?9 F  E, L) a当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
- q, m' w! l4 H
2 E+ y  u, |9 N% O* M聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
% y+ }' K$ @' R8 I% `9 w* C5 F$ [) x/ i" m+ Z" o, }/ f
比如说用户提了一个问题:
1 v# n8 O5 ?$ e) }, S1 s. k8 d
% [" I! U) r/ u, ~“What's the makers's schedule?”
1 O5 z) W- b( W
% T6 d6 Q! x7 D: _5 o% x$ }从数据库中检索到相关的文字段落是:
, i! ^) X# `* G
# x; }2 n3 h+ D& k“What I worked on...”3 r; ~& F* t" s% [, h$ r% ^
"Taste for Makers..."
* F4 ]. C8 n3 ?) W
' q* l" z- |( f7 P那么最终的prompt看起来就像这样:+ R. {2 _) n$ T3 R$ p9 ]0 V

- l( T6 e. H/ A, i9 j
, \0 Z* Z* s0 s, ?' b[  n5 _! C1 T) ]/ h; N
{  p9 b! g* ^; i# ]! |
  role: "system",
/ x) E. `* F; o: x8 D9 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.": q( g/ b: i2 U$ O' x3 g
},
* Z. [) w8 T; S {
7 ~4 }% u. z. N/ t2 p0 ~7 c, G% S role: "user",/ x1 a/ g5 F  X" l, D# P
content: `Use the following passages to provide an answer
# W9 F- b( z; V+ ^1 T- Rto the query: "What's the makers's schedule?"2 X# A- Z" p& O8 y. p4 ?
1. What I worked on...
5 B, `  a3 G2 F# E2 D; I$ n2. Taste for Makers...`
9 V2 i3 K: T- B }. _% O* n1 V) S' r. n" k, b
]+ `* B8 Z. J* F" m$ F3 W' B5 ?8 {' n3 N

: \- c% r9 @2 X- X+ {. `3 i2 V5 M$ [8 V' C% L
这样ChatGPT在返回结果的时候,就会加上你的数据集。6 C, z; e6 X, x7 e; Y

. `+ }4 w! t: B0 Z3 o! h具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.
  O) B6 @2 E: a, v3 F
, L4 z# B( L9 `, d+ A总结- V: \: I- Q: W" E$ l
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
" G. I9 w( K8 J  h
2 S" u$ ^% w) X6 G! @& ?而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。+ E7 W: h- u1 X7 l. d6 C2 y9 b
! O3 ?* i( c- Y
参考+ D9 C& R5 U1 y, q0 F
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客6 P  t1 j! b7 m2 L* K. G
- x* ]/ y% f& F  U
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
: m: R  L7 P) @" ]6 G! _- k
! p1 z4 ~- |" d" [  u9 D8 h/ V, z3 c' L  ~1 J. I  V! a
————————————————
% I% j+ l6 w" E1 A8 R版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& Y! N! n* U7 [0 K5 ^原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
$ I1 b( Q) \, M* H
欢迎定制:13928122889
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-12 07:56 , Processed in 0.022639 second(s), 5 queries , Redis On.

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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