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

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

[复制链接]

322

主题

485

回帖

3164

积分

管理员

积分
3164
QQ
发表于 2023-5-29 10:35:28 | 显示全部楼层 |阅读模式
2 D% M) L  W3 p' O% I, _
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。* w' b7 U  K& R6 m9 c7 Q
- ?# n+ x4 r3 o8 x! g7 H8 b
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。7 ^6 B: ^3 d) L; u$ x/ E

* w4 Z7 Y$ L/ `+ g3 Y: K我们应该思考如何让AI在专业领域中释放更大的价值潜能。5 u0 c& w- T* N; P/ w8 j' X
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
: m6 q) m+ N- j; k& `
5 h9 i' \( p! A# H- ]/ P以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。; p3 k7 z3 q* U" k( _8 b
$ A5 R& F! n8 M' Z" R% D/ [" Q3 f
* c5 J" s# W2 C0 v3 t
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png
* d! j' r; C3 @% S& W% l# G' K' b5 n6 u: K) D- J( g, s( T

5 s3 l7 ~& q$ n7 E1 s2 u! W( |2 b4 v/ o" j  d% N; r
一、微调(Fine-tuning)注入专业领域知识
. S$ r' a9 [+ M+ R7 F% I微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。
/ y- d3 l6 V7 w+ E+ t& t4 s3 Y4 B# P) F6 p+ {; `. e
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。1 g; c* k6 A: z& Q7 K* q0 h
/ G0 J- I2 O1 z8 O
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
3 ]3 W" U; N# K) |8 w7 T* C
& R, h+ e& h+ \8 x- _0 h( w( nOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
4 L+ i& o  Q, w' r" o% @& E, k5 C7 G
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
( W7 X; A4 N3 x3 f- [0 N  M- \2 h5 }4 f/ a- m
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
9 ^; v3 z+ g1 k8 a9 `7 |) [+ M& |) y) y" B- `( X0 a. w; a
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
4 Q: R, d' J2 O9 G
/ d, C( g4 b6 v) k- g下面是一些数据例子:
! f, t4 P8 f1 ?7 c. O
. j# \- l- v. G* I! q# u{$ l) D0 r3 u: X2 r) \9 U9 K, B1 W
    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
1 \: G3 K! b' |0 N7 F9 a    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"0 T. A/ I& n; |7 I+ J
}( X& o# ^! m" Z; |2 w: u( B/ M
更多的例子可以看如下链接:/ c9 j. C: O' U+ S  C0 C

% Y+ g# w/ L: V; ?, A$ T& JGPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub
+ [/ L" c1 f1 Q$ Qfinetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub+ H- B$ i8 P+ M0 F6 t* l/ {" r
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。# e% n7 X% T, x$ ^. A4 u- A

2 P+ E' [3 O  c0 ]" F. u3 J5 O二、在Prompt中带入知识. I6 L/ [  w# v
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。) U5 T' J( i$ ^$ p0 \# Y2 y
4 V7 F: h# e8 d& z, ?
输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
( n7 a5 s" _( O6 e/ F+ K5 A: x# i0 I' E/ O8 W  A
下面是一些例子:8 H* y# o& u( f0 e

. L8 R4 c, S2 `% N5 [例1:作为专业DBA,回答SQL相关问题
- w# u2 i& h# G5 s: C- c. W这里在输入问题时,引入了我们的数据库表结构这个专业知识。
( F, [# v0 [# f; k; A) E3 V; C' d; Z. ^9 F
问:
8 e  B3 H$ E$ |1 y5 S" [; V! D% v' D6 [3 _2 x. F' Y
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。5 `! [* v# \7 |- i; f
. v$ ?. ?  W: L+ x2 Z. h* T
我的数据表结构为:5 S8 J, i& g. M( i: a

+ ^- h, Q  k" kCREATE TABLE `user` (# [1 {6 D- u! `( ]0 L3 ^/ R
`id` int NOT NULL AUTO_INCREMENT,
1 [1 e* B; D7 V+ j`name` varchar(255) CHARACTER SET  utf8mb4 7 u4 j( I$ ^, R" g" H' n4 p( J
      COLLATE utf8mb4_unicode_ci 8 B& W! v) V# k
      NOT NULL DEFAULT ''
; d8 d' u; y& J) N5 o      COMMENT '名字',& o1 z! C, u% Q6 y. |
PRIMARY KEY (`id`)
5 V6 E+ g. o! Q# w  s- x/ ^) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 6 |5 s3 [( X1 C  p, }: U9 A
      COLLATE=utf8mb4_unicode_ci
1 t# E$ T5 c6 m: o      COMMENT='用户表';* Q0 {& L) U9 n7 n
我的需求为:根据用户的名字查询用户的id
: `+ a' Z+ z3 h) m6 Q
2 C0 A' p: o9 J/ \% D/ x回答
- L6 P0 Q/ i. d  H7 q2 {
4 `0 A& u* E3 c5 o好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
5 }  K. d0 q1 W, I
  R9 Q) h9 y3 l  ESELECT id FROM user WHERE name = '用户的名字';1 a& E* i! d* r' p' ]: d1 z
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。, c/ l+ o' N7 k! T6 {; m+ G+ n# D
6 A. D* r4 Z9 @; \- ?
您可以使用以下SQL语句来为name字段创建索引:
/ V; ]& M2 g3 f  P5 W
; k' O7 [) y' LALTER TABLE user ADD INDEX name_index (name);
% l/ m/ l4 e: f7 A4 L: o; {& R此外,为了保证查询的效率,您需要注意以下几点:; n; L1 G0 r( v6 k$ n; e
7 v8 J3 _  l7 e0 Z. `
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。9 D# _- f5 k. ~$ R' j

7 k- ~8 e' [7 D$ _$ v0 Z如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。
  r; l% ~, e+ Z/ c: B2 d) A, M0 s3 W- v
例2:智能客服" c" c5 ~  |3 ?5 w
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
0 H$ G/ f2 ?/ @$ J0 w0 p' Q! ]. n. q  o- D4 r4 d% U
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
, ?4 q$ I) U3 N( X4 s' P- ^* {4 q: N* j* l* S0 [: B$ V' A3 o( X1 k
下面代码通过消息对象的数组注入了一些上下文知识。
) {! C) k* \! R7 B1 x& F( R  i# ]: C6 r4 w4 Z/ P0 p# ?

* _6 x0 ?' A/ ?( N" t# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
! a, J- F; X' ]4 J0 c( timport openai# {: L  s/ j; P1 H

2 S! L0 X# C3 U- Z+ h& u# t) gopenai.ChatCompletion.create(
+ m/ T. Q* W" T; \2 `  model="gpt-3.5-turbo",: W, J7 S. x; z8 J. B
  messages=[/ \" m% b7 w) Y) J" a: x
        {"role": "system", "content": "You are a helpful assistant."},
2 w/ p6 Y! t! Z; \        {"role": "user", "content": "Who won the world series in 2020?"},8 R- d. Z- ^3 z* z$ s
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
  U, `$ ^* j5 A0 q% I( }1 H% S        {"role": "user", "content": "Where was it played?"}, s# }6 r. [( e1 B1 K) k
    ]3 t4 O% b! S$ I$ \
)
) G1 s) [) X  y1 |- V $ f' |; [8 ]9 x# [
其中: ]& J% u3 T: m+ C" {5 T1 T0 M3 B- c

4 s9 e- W6 E& y系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。" T( q4 I) z9 ?" n
用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。
, d, E2 d% a- }: h7 v) W助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。/ o0 `. A8 @' Q! p4 L' R: I  |
通过上面的方式就可以完成专业领域知识的注入。6 L- @* l* K# r2 B

4 K  H3 x' V; e& x" I例3:通过外部链接把内容带入
3 Q( M8 u+ G. m+ Q" n下面只包含我们发起的对话部分,会话结果比较长,省略了:
+ ?- i5 v% l( m( G
; [( M( x1 B( ?3 @, T8 MUser : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?
6 ^2 Q$ I, @  V5 k4 q: `& E...
& t1 S- m$ P% y; F) B+ \& }User : Microsoft 2022 Annual Report
; m7 O$ o8 s3 O3 H0 x...
' x- p+ v# ?% B4 x9 d" s; `User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
. c! z0 ?( j5 N2 c' O& _...
# U, f3 k. ~  }* W% w& ~User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
0 _( N5 @0 J& g  J...
3 r2 b1 M0 L2 T6 xUser: 您能否从Nvidia的报告中提供更多财务见解?
* j: T3 j$ F! z4 Y. E! \& ]) `# s...
5 p9 m3 k% {- R% B. E$ DUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?1 h, N. h8 d  R: h8 B8 f
....: i; C+ n7 I4 m7 \

2 H2 P  t0 z% f) E& {3 hUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
0 A% m' w, Y9 s, B* c4 r+ x* F! y...
$ ^6 N# z* k& |* h4 UUser:预测下戴尔未来12个月的现金流。
  @' b- N( l+ E9 V4 U! I+ ~8 w
% s: z) Y4 H5 n9 {* r, u这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。
  r' s  g; R- x& s, {' V; M" P
3 b( O5 N% T* x* A" [: D) r. G. J6 y适用场景对比0 J# O$ L% _  `4 K- o
价格对比8 S, ^! u8 c4 @/ T' J& C- V
OpenAI的相关报价看: Pricing7 T  p6 V& ^, `9 ~% B, D. s

5 c3 M2 ~* F* e& W$ X9 U对话类:GPT4远远高于GTP3.5。
. M3 H0 Q+ H7 o) K OpenAI的相关报价.png
% z- @1 j5 v! Q+ C* ~! h
" X/ s7 G- q6 x, H, z  ~. F0 ]' I2 V0 q5 i8 \9 y6 n; |2 c
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。, F; l) y+ ~7 r3 K7 ?. r" {

4 ?$ K' A0 x6 W3 D- L- W' `( A" Q
( C7 y/ V% ~% k Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
" f  j* ]+ E, u( k# X
9 S$ j! K# ?! N+ C% Z ) ?) w8 j6 S. M" L1 G7 \

7 w. q) C" j* ]6 ~6 l) H+ ?GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
. q4 N  [* r1 O& V% @$ ]  F5 G( l$ b( e, N- b+ w
而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
/ l: R* U, @& a! ]$ o7 L" l
2 ~- k  T: V+ h! ?所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。5 T; q/ E' e* A; O2 y$ o
( m8 M. v; s) t; T
长度问题3 j! i+ W9 j7 j" n9 @- h* |1 Z
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
; c+ }  L  E) |) Y* C4 O  ?; G+ j  B5 Q; [7 r, ?0 i: a
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
3 S/ H: N2 m+ R* C4 x. q3 x/ r/ j. K8 U+ w! }
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
' v0 ~+ D0 a: x. |7 y; c" t4 O7 Y  n8 @" L6 m& ~4 m
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
  F' G$ a% s$ ?2 {
/ ]" u0 `  t; I, U; ~- A( m0 m6 o聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。4 ^& }" w1 y9 }! ?8 \
$ M' D  a! K. R, z% i1 c) M
比如说用户提了一个问题:
5 v* J+ Y  Y  L9 I7 p7 \, L
# @2 N1 N& ]3 y  B' f4 ~3 Q& n& ~“What's the makers's schedule?”+ Y9 S& i& a# g

0 y, W( ]1 `3 \$ u( U  b$ L+ x. v6 x从数据库中检索到相关的文字段落是:
, D  I3 X9 w0 g/ _6 f/ ?6 U- H, K- u, o. w1 W# @+ }
“What I worked on...”9 g" e  m) C! ~! h6 f( a
"Taste for Makers..."
5 c7 l) e6 |' i2 }- Q- X3 z5 C, q
# I9 l6 u+ {/ u' S那么最终的prompt看起来就像这样:! E* Y% |0 K7 [+ K7 z

! c. f3 a9 K4 ^! D* h* J5 K7 s( l; b 1 _0 B6 s; B* B; g& g
[
: A- U& ?( c  d3 h) t {
3 q* f; N" g& g2 I& F  `8 s  role: "system",6 T# Y* X  Q* p% o
  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."$ Z% V" [: s$ T5 [
},
5 e/ c# X. D% M) Z9 i {
0 @* i5 Z& g, t4 C  ? role: "user",
% c2 o* I, J5 D: Y* f1 ]! A/ w content: `Use the following passages to provide an answer
( B( T# {6 D$ C: uto the query: "What's the makers's schedule?"# q1 D2 B4 G/ N0 `. m$ O
1. What I worked on...
* E" y: J7 `5 e* ~% |2. Taste for Makers...`
# {7 n! C- @& l3 p, D }
. K& e* Z$ B4 H2 ~]/ [' v' P  s/ _$ @% w* P5 j6 o

# `2 |7 q' V- c3 R' W7 b4 l; D5 p7 \2 i, `8 K
这样ChatGPT在返回结果的时候,就会加上你的数据集。
7 R* a' z! ?) z
# z1 k& V8 _) d3 v9 Y+ f/ I具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.# F# c. h7 Q; r- @' W  g
# o+ ~) p5 C' _# I
总结& h4 p) k( f, }9 k. ?6 v- J
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
; v5 ?) e0 T; e( m( T
: O- i. Z2 B0 M/ d7 r# ?1 q而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。
+ ?# x- K% o/ n) Y' L8 K& ~: S9 o. B7 F: m6 M+ D9 Z) |) [
参考
, s- R* D& ?: b" s4 K$ u* ^如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客# ^) n) v* M  o5 f/ {7 K, a1 N
# v& u3 F8 u" K1 o1 Q& S
搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt% U1 i/ |0 w4 [; O* O# F) @  W

: _8 i: U( W6 Q6 b" |6 @8 l1 Z6 ?3 ^% a1 m( Y
————————————————/ J& ~7 N, @  t# p# `8 n- L5 p9 g
版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 F: T( P  J' S  S: |2 g6 `7 Z
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
2 N. h) _( |" z4 S
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-7 21:39 , Processed in 0.081616 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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