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

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

[复制链接]

328

主题

499

回帖

3260

积分

管理员

积分
3260
QQ
发表于 2023-5-29 10:35:28 | 显示全部楼层 |阅读模式
( t# u' g* |# W+ P
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
/ X& N4 o8 d/ D  X- E& Y
% j: p7 f) W$ k# Y以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。" R6 ~+ M( c: R( n/ L: ^
; z1 e* O# o$ T. O+ H" \& n
我们应该思考如何让AI在专业领域中释放更大的价值潜能。
8 u- J+ _4 c; G% Z) x就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
$ Q0 r$ l; [% g" ]5 R. Y5 ^) o" H0 f- x1 Z: ?; E
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
# _5 ?; c1 q% q4 i/ E
# Y& r& R# C5 r7 ?1 m- h" U' R$ c' H- I3 o; _4 K( s1 x: z9 l6 c& C
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png
: @( p& a/ `+ \9 j5 ?5 y9 K
& r. q) C" z4 F* [' O
, |0 t! e7 Z( f- b) X, @  L* @# @5 M. x  Y0 ?0 M" W+ F9 ?# ?. y
一、微调(Fine-tuning)注入专业领域知识$ _7 m" ?4 y; w. y
微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。
! G6 \6 q- g2 t
# `, t* e' z. ~2 l: c4 d2 e  t传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
% N& l7 [  r8 v2 ^1 {& g
# U3 v/ y5 r5 F如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。1 f( d% v3 B8 o. D6 L+ o% I

4 e( K( W$ I1 pOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。$ a/ M/ m9 V& ]# p: T# c

+ E2 q/ S1 ^9 p从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:2 o! l$ a" k  k* v- ^

/ B# z4 k/ F: z; s* Wprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
2 ^8 O- s+ l: n  @
1 o  d8 w$ a& _+ J. _" G* d- Tcompletion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
2 }' L8 D; f8 n
9 T) m$ n; Z/ {! X6 I8 {4 B下面是一些数据例子:
; j: P" D& V" J9 U6 U  ~, n' V) q5 E; U% \( n+ \
{; V) w- t8 A- o9 X. Q& w
    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
8 a: y6 I0 R5 U3 u, O    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"0 o$ r# k( ]) G* B  w* K1 F) ]
}
8 a2 p% z4 N! Y- @5 ^更多的例子可以看如下链接:. E7 O5 ]+ A) W: P
" R, m* Y: R- j, S' |7 L& q1 j3 D
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
5 U4 Z. e) E/ N: l8 Vfinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
6 O8 `" p& R) U5 B要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
+ E4 y7 U2 ?3 y. {% i' x
( \# t( O4 v% P/ j- g3 j' r* i二、在Prompt中带入知识
6 }' j7 k: [& k" a5 [只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。4 Z! J" z) s( l5 X  v

4 u) w7 g1 h: x+ L* q输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
- m1 q) p- t9 ]2 J  p' t$ L$ {4 v( \# A* G  w8 r; U. y: ?" w! L
下面是一些例子:
) [% }. B* l' Q3 ]: q; R
) x! _9 W' p8 p例1:作为专业DBA,回答SQL相关问题4 a; N0 p6 Y( V4 g+ V
这里在输入问题时,引入了我们的数据库表结构这个专业知识。. W7 f( S; q8 b0 [

  _1 m& h8 k* {& n7 Z2 Y3 Q9 u问:) s. w( b7 z" P$ g/ T( M
6 d" Z+ Q1 a# r! u
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。$ s. H1 f% D( R7 a3 j, r) e
! @4 F; W$ C2 X! X2 o  E
我的数据表结构为:7 Y# j# E3 |8 F

4 v; ~: |% t9 B( Q% hCREATE TABLE `user` (& k, A- Y" P  \( [0 ?* J1 ?9 q
`id` int NOT NULL AUTO_INCREMENT,0 _/ Y. `0 ]: H' ]! n3 ?
`name` varchar(255) CHARACTER SET  utf8mb4 ! a  X2 C' v4 l& N& O
      COLLATE utf8mb4_unicode_ci
& B% h) F3 ^% D; V( J5 \6 @      NOT NULL DEFAULT '' ) M' F  A$ m1 K) M1 g
      COMMENT '名字',
5 W' z$ r9 I( _5 {PRIMARY KEY (`id`)' j) s, l7 Z8 `& p6 b, w. D
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ! i' s+ v/ N3 S5 @' ?" {8 C
      COLLATE=utf8mb4_unicode_ci 4 z6 n/ L# s& w3 _6 B( @$ n
      COMMENT='用户表';
4 K0 V. @0 ]! L我的需求为:根据用户的名字查询用户的id
" T8 j8 v6 |. {$ a% i1 N( @8 [; i, j+ d; |7 [/ o
回答
3 V* `, g7 K3 j( o! b! t, f) K4 A, y7 P3 A: }( d7 y% }( m
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
) ?$ w- o# ~, W5 s
7 m0 _# M9 E2 F9 T# f5 E  U. V( ESELECT id FROM user WHERE name = '用户的名字';- G5 P5 i9 g7 f) X7 V* l( a( K
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
  q( H& @2 s: n
  Y5 o! y( x3 }0 T# {您可以使用以下SQL语句来为name字段创建索引:5 ~, A8 ?5 \* B9 u9 Z7 `/ W: d
( B; p; O7 U$ c% T
ALTER TABLE user ADD INDEX name_index (name);
6 _! B3 b. _& P% }6 x! a/ `此外,为了保证查询的效率,您需要注意以下几点:. O+ z5 C; P2 u
8 J% P. o8 X3 r$ I' S% k
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。- u8 Y1 ]7 H5 S, P' `

5 i, J+ c0 P1 G7 L0 U如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。- o+ b0 E# X' l# A3 g. D
1 j6 e$ j8 M4 J6 [9 Z
例2:智能客服3 Z4 [7 n3 V+ a7 ^& G4 O! m
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
/ T0 a  K& b, f1 V# J8 \: m- K# Q  S2 T' [" i3 b* f
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub0 w* ~' w$ `' T2 E0 V; ^8 D1 R
3 _6 i& V2 U) r
下面代码通过消息对象的数组注入了一些上下文知识。8 Q8 E# j; M2 `( P
8 r3 p6 V) I7 [6 s4 N4 c

% S" N) N( O) R, P' y# Note: you need to be using OpenAI Python v0.27.0 for the code below to work; s+ L) u$ i1 e  `8 m: `( P* E: e
import openai
: ]$ d* q. }" B3 d ( k3 V8 b- s4 T4 Q
openai.ChatCompletion.create(+ N! v- w- B4 N% M3 N: y8 U
  model="gpt-3.5-turbo",  `% `( r6 I# e& c& P; C  ^( j
  messages=[4 ]& c) A6 b' N8 Z. Q  U, c8 T
        {"role": "system", "content": "You are a helpful assistant."},
8 K. l; C7 e* f2 y        {"role": "user", "content": "Who won the world series in 2020?"}," T$ O9 j2 {& w* s
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},) O& B$ G+ e/ L0 I
        {"role": "user", "content": "Where was it played?"}$ H; u# R* r  U, [$ O+ S$ U
    ]
8 B7 [  n7 r, s  G# h)
" Q0 Z+ T. s# d3 E1 u! {' ^( V 5 D- p2 B5 i3 @1 p" w
其中
4 z/ y1 W' }/ b8 Q' Z! d) r7 H( X2 d3 M" Z
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。* b* b) a+ h, U! I
用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。; R7 e& b1 q- H  X$ a  U( c7 O
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。8 o2 {% q1 g& r4 o0 C" q
通过上面的方式就可以完成专业领域知识的注入。  o. ~: j( }. F$ J& Z$ D  A

" t$ H2 o  o7 ^1 |例3:通过外部链接把内容带入( q- W, P' X! h5 H* h" y; D' H/ ~
下面只包含我们发起的对话部分,会话结果比较长,省略了:
% B3 {3 c/ @1 K( v
9 z& L- X4 Z  `5 T1 ^5 `User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?
. c) a9 ]7 Z) b3 a0 y1 N...
  B. ?/ j' P; VUser : Microsoft 2022 Annual Report
2 V' ^3 ]2 I1 A...4 ?! x. Y+ n1 W
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?9 }4 S0 h* Q2 J" i! m
...) y+ G9 T1 u. a) a+ _5 n  w
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
( P3 N' D, ~* g8 W...
7 c3 f! d, n5 l; ]5 D- }0 \( T7 a4 |  qUser: 您能否从Nvidia的报告中提供更多财务见解?
9 m( a6 V  Z; l6 M# r...- L- p! w# I7 N
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?) N8 W9 I+ M( Y6 l. m% S9 ^" R8 G2 _
....
3 q; T0 q+ H5 m! E
6 d( P. M0 [- K, K. rUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
- X; r- Q4 m4 _8 @8 P8 q...
" G! x% _) X& k$ ~! mUser:预测下戴尔未来12个月的现金流。  h3 }; [( k; F" j

- j5 G" m! x6 w这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。; u# W' ^! k2 u; s

3 V3 P" H, I) y8 C, u适用场景对比
! J+ Z% k. Q- }6 R& h2 E9 _价格对比' h3 \: c' @; L8 ^, |1 g4 j) y9 K; `
OpenAI的相关报价看: Pricing
/ s$ S1 Z+ a9 a6 N. \& F. m& u8 K0 L  C0 K) I& b
对话类:GPT4远远高于GTP3.5。8 K) P% c+ Q- }4 z
OpenAI的相关报价.png 6 W+ t% A: d% u; q

; j( A3 b3 i# d+ X$ u
8 Q6 ~( P& l5 ]. b& r. Z目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。& s! H9 X5 X" j. D; T' K

  A2 e7 J/ [- R) K& H  U% b' w7 L- ~9 ^6 d, o' l  A
Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
# Y6 U9 n5 _. R- w5 _1 x; }. b5 D( U! a% y8 x
) p, J3 W4 C; s, `. o. h5 N

, N) U. e% T! G) h" PGPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。6 W+ c; W) P% S3 F& [  v/ n5 L3 y

3 p. O' |+ O7 m4 z: o  X% ]而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。- C1 _0 ~* A2 J6 w& Z

) `' z5 S4 U: n! b5 U2 C所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
3 R4 z/ p! S; I9 P. s* ]7 u6 r9 E: m  y1 v
长度问题; ~$ s6 w& [( s* N$ n. H
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。) K& E, {$ L; B* n$ e

% a5 Z! ^$ T% j: R* V$ K但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。. S' ?' F0 @/ U' Z/ [

! z0 N5 ?+ x* g" E7 [* n2 h首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
) y! o1 A9 v9 C3 |' k* |9 x5 x, j5 W7 |; O0 h" V# i4 |& Q: t. O/ b: o
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
' Y5 h5 o# t9 t+ x: d- X3 ?( n; V, n; _
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。# a. H& N9 ~2 f. @# S

! e$ I/ r. V5 i5 b  R0 r# @比如说用户提了一个问题:3 {5 x: v6 B  ]2 K* y9 d+ n3 M

, u, k5 A) n6 n% O/ B“What's the makers's schedule?”" u9 w" `4 B! ^" r6 G
( G' C' ]( S5 M5 }! {" b
从数据库中检索到相关的文字段落是:. h+ v( K, p! r# R2 C$ T

' k% R0 ~' ~4 j4 m& a* x' H" U“What I worked on...”5 V9 E  M! _& _9 `1 W
"Taste for Makers..."  h7 X' @& Z  m8 o

" ~' {3 A3 J- @& B" e" ?那么最终的prompt看起来就像这样:0 c' t1 w. R! P1 p+ o- S

2 f0 P: _. ]" g- Z- J: p % _. p! W: P- |' Z$ {% @# I3 L
[9 Y: a3 k  e( k
{3 j: n7 O4 j8 c; J1 `( K: W
  role: "system",: i% {' Z. R4 L8 X7 Y
  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."
* Z9 p/ [! i. X4 _# F! f },
& R# @5 Q1 n: W1 R1 ] {  O. b  b" M* {. L8 o/ D* n1 W
role: "user",7 Y; _- [- y' _' B0 m
content: `Use the following passages to provide an answer
  o* [3 t3 j; L, ], E( n. \to the query: "What's the makers's schedule?"" n; ~: W1 s' [; ~/ X
1. What I worked on...
4 t1 S5 H9 }$ K: L2. Taste for Makers...`4 U4 n$ q) v! i* m
}: s. ?% X% r! e3 l
]' W& d/ E: N* B2 L% F

* s) t; q! C% y! ^4 i: ]3 h% m1 I- [
这样ChatGPT在返回结果的时候,就会加上你的数据集。
+ l0 L" F' k, t6 c, O( f
0 g0 y$ n% `6 N& y. [( _具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.
8 ?: x" k) q, {# \9 I
# F8 J5 U2 n& W总结
; g# K1 n. P1 \( V1 L+ {大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。: @2 @3 Q# d. o: L& y

" f0 ?$ Z* m3 O6 p* v而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
# Y# m1 G7 Y0 b% J7 K' Z
) g4 F8 V. f6 V8 l$ V# S- w参考
0 W( e8 g$ i5 l8 e" ?如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客0 C% B; H  B4 ]0 v
* g& e$ [% }, I! u4 t# m0 C  n
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
7 c8 B! x  _1 h! Q6 u1 ?# g# K1 B+ C# G5 U  Z( P# {' q
+ j/ s+ x- r$ B1 I& H
————————————————: h; x! v# u$ c+ N
版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
/ y0 C' H2 @2 y! S6 \6 `原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
  E8 Z) `: H( e2 Z8 Z) k8 s
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-11 02:34 , Processed in 0.078463 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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