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

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

[复制链接]

524

主题

676

回帖

4597

积分

管理员

积分
4597
QQ
发表于 2023-5-29 10:35:28 | 显示全部楼层 |阅读模式
0 T% v3 e7 W% L) h7 `; f+ R8 p  z. q
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
# l! C6 \. G6 T& |$ d
* |7 F7 C. l. b) z, x以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
! F& t# ~* ?& C: S* v) ]* a( L- l5 N* o1 B. p  a% `" p
我们应该思考如何让AI在专业领域中释放更大的价值潜能。
" u1 Z) a9 d& K0 u; E  @就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
$ X) \! H0 [* o* Z1 N
4 }3 @+ c, e, w& \, Q以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。* u$ K+ F& g3 y; j+ ^# Z
9 a! {+ B& P4 H6 d, u  d% c# ^

+ N: ]$ j5 @5 ?0 N. E! g6 g 以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png " _. W+ h7 q0 o3 i  g4 y: A8 B
1 [. ~7 m* ~  C

) y& v) F6 Z1 D. D" c& C/ J7 t; u) C+ y# f  m7 ^6 G
一、微调(Fine-tuning)注入专业领域知识
$ V0 j" k# W" p# c/ d) D微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。7 [; L" {" ^9 |# M

% c/ |- M+ M, ]4 e! B& |1 _传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
3 [4 T8 Q) E) w, d! j0 r
9 x) \+ a# i6 Y! ^5 b如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
  ?+ p/ j& V( o& h. B! v/ |: l9 t* P5 n) ]: w% i& T
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
  B5 S! f% ]9 e* [  D
& k% g% r/ x1 u; i$ R6 a7 e' g5 ~  K  C从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:+ }4 {6 f6 G6 V: m. N/ P

1 `/ ]0 G# ~9 {, [. A& @prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。+ M- p$ U0 H4 r: _+ K6 {# S+ _
# u0 l5 L3 x. N- J4 c8 ^1 `6 w
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
) U' U! g+ w- s$ v; P/ V* t9 I  {6 h: ?; o0 U* b
下面是一些数据例子:
, f5 N7 \- Z1 u: O% V0 h7 p( t, ^6 p# t1 V9 o7 {
{* t/ x, M- C, M: `0 L9 ~8 f
    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", 5 i! o( m2 N8 m" L3 b9 u2 Q
    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
4 F- j: N/ L( f}
) x- u/ V8 R8 L3 d更多的例子可以看如下链接:3 V2 E, x8 G- B/ p; Y* A

+ q2 m0 j* Z) ]! PGPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub, V" h( e' T. F# O2 Q/ d
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub
3 u. B2 h0 H0 y, v要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。9 R2 v1 a7 a" K8 u' o

3 A; Q, k: e! q二、在Prompt中带入知识
( Y' {& Q8 L( a8 a2 S只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
% E( E! D7 F. Q9 J% b
9 ^1 \: O8 x  a4 ~0 g' z& u输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。+ a5 S/ Q7 A3 j) b+ l
7 I( T5 a4 Z  u1 Q# _# B
下面是一些例子:
6 T& I+ @3 w% @; s# {7 ^9 n7 c
  _" y  h5 Z4 t8 [& K例1:作为专业DBA,回答SQL相关问题
# d+ i* m3 Q1 D( R! o这里在输入问题时,引入了我们的数据库表结构这个专业知识。
" m: {- l" G9 I$ I! @1 f2 \- f+ O% \& a7 C& d" `, k4 w
问:( g5 d: q& U" E* u+ Y* z

; a( k9 X6 y) h我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。- w* B8 N! O- y; h# l2 E

. s* a  e  i. w) G1 ]% M, |3 W! \我的数据表结构为:
! T+ c/ [& b- n8 I' U
# P4 U+ K: J4 N3 d$ GCREATE TABLE `user` (+ e' D- m9 {" A+ s2 s
`id` int NOT NULL AUTO_INCREMENT,
5 [! Y' w, j9 Y1 U4 O  i# w`name` varchar(255) CHARACTER SET  utf8mb4 # S$ h! ?5 B& E5 t: e& C
      COLLATE utf8mb4_unicode_ci
9 ^! z8 U% Z3 k/ y      NOT NULL DEFAULT ''
- a$ @- l- K- l$ C- V: Z      COMMENT '名字',
9 @6 \" s+ e6 A6 T4 w8 V( o8 @8 Z  hPRIMARY KEY (`id`)
) ^, t1 [0 |7 F1 Q8 l6 U* y) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 3 V0 c8 I0 ?7 h2 i- D+ g. C
      COLLATE=utf8mb4_unicode_ci
' R8 B3 }8 t  Q5 z4 t7 M      COMMENT='用户表';
& b: M, G5 p2 f3 X7 t5 k我的需求为:根据用户的名字查询用户的id
" n2 |- o" U2 b! v. o" W: [( K0 J7 C) V" x
回答
3 f  X! K5 f) V7 C8 A8 `
4 r8 Z! L& |- w  p0 I9 H9 B( t好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
: U8 X3 n, Z0 X4 h
* h2 _. t% b( ]2 x+ Y9 OSELECT id FROM user WHERE name = '用户的名字';# {+ D: J+ |; F6 H' _
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
9 f- F) y" z/ P
' X1 G' ^9 _6 ^9 a# e: y您可以使用以下SQL语句来为name字段创建索引:
5 P& `0 X; a8 H" W
6 E$ p6 W9 h6 H" v& c) f, LALTER TABLE user ADD INDEX name_index (name);
5 Z/ Y  H) K# R1 c: z& G此外,为了保证查询的效率,您需要注意以下几点:* p! k: y/ X8 {
0 K4 I2 V: N' {
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
0 l7 `7 M3 g7 u* H/ H; _0 b3 c% N# A
如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。5 U  U. C4 o) [7 L  ]( ]9 h) ~

# b# K% C& [% u  x4 z# p例2:智能客服& e- U1 O1 G# O' T1 Q* U; i! l2 `0 Y
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:- V1 o& S% h: k: p* }8 Z

7 g1 U+ K8 p/ _* v& nlanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
  w. e/ j& t+ B: }
5 o- @& Q) g4 K  h) |. Q0 |下面代码通过消息对象的数组注入了一些上下文知识。
/ d1 j/ I4 W# S( d7 ~4 e8 g; T3 ?) n& ]; N

& ]7 B+ e9 E0 I: K# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
2 T8 G' }" G* r  J. wimport openai
, v5 e1 V. f- X# j/ D/ ]3 a3 N2 A6 c& J
1 L$ g2 x0 Y# U: \openai.ChatCompletion.create(
% n! ~0 E  E0 G0 j' |: f7 Y  model="gpt-3.5-turbo",$ v# X4 @& p) z! x; ]
  messages=[$ y) s/ f, G" S/ g3 W3 G
        {"role": "system", "content": "You are a helpful assistant."},
1 `' G- o+ a! @: ?        {"role": "user", "content": "Who won the world series in 2020?"},* J: z* b5 j2 W
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},+ F( ?% w/ G  O. M
        {"role": "user", "content": "Where was it played?"}! r& J6 Z% ~8 u& `) _6 r8 J
    ]' _$ y0 u5 `; H  O* y3 {
)
* }  Z7 X8 N9 t3 j' Y* Q4 N
9 u2 I- @; n! x) \其中
9 _7 W/ p# j$ `; ?3 R0 a; x5 H; k- o
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
. f* N  O4 Q/ O0 F  ?3 B3 L) w用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。
* \. V5 L* G( F1 Q2 Z2 q' c助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。# w7 a& S7 M+ |; H( I
通过上面的方式就可以完成专业领域知识的注入。: [/ G' I% z# O8 L  T9 `% F, f) g
9 v2 {2 S1 d  t, A8 Z) X) D
例3:通过外部链接把内容带入
% S2 b% w$ d( j下面只包含我们发起的对话部分,会话结果比较长,省略了:
. U. W6 J9 V- O3 R9 {. D8 }7 C1 ^  t$ G
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?# [0 e9 W2 c, N' T) V' W
...) `1 n9 R9 Q) @* {/ z" K- @
User : Microsoft 2022 Annual Report
; Q3 [9 w0 v2 J4 J...
" R+ \$ ]. n" }; OUser : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?: k4 Z( U' s0 D) l) t
...
1 \  z3 _' V! y# ?5 IUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
0 w  S4 J: r% [" ]' Q- \...4 C- s$ S4 Y: j" u  M/ c4 J
User: 您能否从Nvidia的报告中提供更多财务见解?- Y& J. R) J: q5 X$ ]
...
% K2 c+ [5 N, y/ W  FUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
% p& g2 j, o) V- I3 a" V....  r6 _+ Q. D$ R9 b) `  `7 I
  Z( V  v' f/ [3 ^& ?* h
User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。; S- ]7 @: u/ f2 y7 }* k; Y
...
8 `) L, ?+ m$ xUser:预测下戴尔未来12个月的现金流。5 s2 o; E1 J% J& S

* _+ b7 q' h5 i5 O* N这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。0 G# u+ A% \. ^6 q

6 J2 h5 y" u  _4 q0 e3 B* Y适用场景对比+ L+ \" O7 C$ ^4 l2 R4 z9 a
价格对比
6 t. [) H# t: Q0 ^1 ?4 Y! uOpenAI的相关报价看: Pricing2 G% T1 [; u3 @  ~" O
" R2 S: L, K6 o( u
对话类:GPT4远远高于GTP3.5。
6 \! h" [! q# U, c, Z OpenAI的相关报价.png 4 p$ z  g9 F4 z1 E7 s
9 @, F' |/ C0 z3 `6 g

/ k9 f; o6 t' \2 H$ ?目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。9 b. B' }8 N5 o0 q5 s
3 h5 q/ O; A* t' y
; g1 h+ \, h3 U; [
Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
, |' h- L* }% R- q
& t2 K& W( @9 D1 @0 O: N6 c 4 q2 h5 F) P" |" E

8 d# \9 n$ b7 ~' tGPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。  V" e- ]$ c7 ^* c1 [6 |
: `0 ^6 c! t' |( c5 N1 J
而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
( T4 K: q+ t1 v% ~9 M
' y* b3 x. q( ]; K. `# M6 O# }3 C  x( ]所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。2 r, k! l& W7 z! `2 ]# Z8 E' C( J
2 `5 K, t2 R; l& \, i) f- |
长度问题6 I3 k' ^: _( D
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。6 B3 c# e7 }3 m3 T0 y

' L: D1 o' u3 q/ @+ m& \5 K. V) z但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
8 k; V1 ^8 A$ r$ L* O# o) S& x+ L# i" \' @; x* w% P& g
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
8 v, I7 [% F0 ]$ y: }* t, C( [; V5 q* D
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。8 R& T% `9 T8 `' V8 e3 |# e! b

3 y4 d6 P  T' y4 q9 j1 x2 `/ q聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。+ S5 ?+ Q9 n7 \1 U: Q% P( G

$ B- A3 L& V8 {2 x) k* U' \比如说用户提了一个问题:, M) @/ e4 C) |% g: A/ H8 r" I
" n: n6 D( {$ A6 Q2 b. }" ?+ P
“What's the makers's schedule?”
* @. W9 S$ R% t% [; o8 \  W8 D4 {* O8 o$ D
从数据库中检索到相关的文字段落是:
4 g$ h  R/ {( i% u+ l* O$ T* {" q& ~( g, W/ g1 ~: Q. ?4 q4 @4 ?
“What I worked on...”3 K; }& B5 q2 M. g' H/ c3 ~) ^
"Taste for Makers..."7 j5 f! A: n! e5 X

- U9 f( _& j2 C. I7 O8 _- ?那么最终的prompt看起来就像这样:+ h" X- f3 t8 @' ~9 J) q8 Q, \
) y7 ]. b/ d& S* J: z

5 z5 G0 i7 j% z5 {2 o+ ][: x( E& B! v1 ]9 e- W
{5 f+ I5 K$ O3 }2 q
  role: "system",
8 ]7 z8 P; c8 F+ Q1 P  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."
) G+ L! c9 A6 Z6 `. A$ c1 N* v, i },( G9 G* G; M+ W: l8 Q. z0 `( I
{
# c1 b6 G( |1 T+ D+ p role: "user",4 }. b& e& _0 l
content: `Use the following passages to provide an answer0 h1 `) V. M2 p1 B& H
to the query: "What's the makers's schedule?"
2 I, v1 @7 q+ F1. What I worked on...( d$ ~* \* H; C3 P' [
2. Taste for Makers...`1 N' N# ^6 _7 Y6 j: W5 c
}0 k" q/ P" X: }6 Q. H1 C& T2 H
]+ g$ W! h) D2 g% e" B% ]
* I- y0 j6 g( O  e
" W2 A) E% L7 K2 ^" R* i1 r
这样ChatGPT在返回结果的时候,就会加上你的数据集。) L1 W' q, F" x) r7 }! l+ f

* S. o3 ~* P8 o具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.( C- H9 U* E, {: l0 m2 M  R$ r) Y

2 m5 u. z9 X2 i6 v! d总结
! u" K0 e! P: [大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
. T! Z3 ]' r& D% h3 ~2 q! |2 [$ A* }+ X! c; l
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。( h$ R' v( g" H* f6 b& W
; z" H4 d3 J2 Z9 }8 C, L( l/ O
参考# r' ^+ C( s( a7 n  r- y
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客
5 }8 D6 O3 c5 u3 h1 M
/ q& q3 Y! [" w1 \1 D$ o搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
+ H* {, u* u# O9 s. D, s3 H, l# @4 _( |: |/ ]' |

) C  J8 T# g4 O- N, ^" R# F————————————————
, X' y  |$ J0 U- {* Y0 D" R版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* Z; ^" p4 M% l1 D! p& x' V原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
% T9 Q2 ?  }+ e& l8 ^
欢迎定制:13928122889
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 20:02 , Processed in 0.030646 second(s), 5 queries , Redis On.

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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