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

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

[复制链接]

318

主题

482

回帖

3094

积分

管理员

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

& o) d& T( R5 oChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
! o5 o! m% D0 Y  |. u& }3 W4 K: r* s
. G+ G( u3 [3 z9 O# T$ I0 P) ]: A& Y以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。; p( }1 E4 l& {" v

( F* _# i& l* h' z我们应该思考如何让AI在专业领域中释放更大的价值潜能。/ t9 T; d+ W5 l  m% @7 k2 |# a
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
5 s) P4 |* y: U# }# n, f' F* i( J5 @- k# L  A5 [
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
  R1 Y( V1 i0 i, W, i8 f
* D1 P5 B! N4 B, ]
$ M; o% I5 s# ~' B, o; v( e: l 以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png 5 a; j: k  G' V  i/ w

. z- T9 N4 R/ `
. w2 {  M: Z% ^4 W5 f( ^* T! Y. @! g. b) C4 q# M5 ]- }
一、微调(Fine-tuning)注入专业领域知识( r/ |/ _+ `1 j2 b& f
微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。% [" l: G1 c; O' Y

) m+ y0 ^& Q9 x7 R, O传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。- s) y# F1 c/ O0 t5 j; m+ ]

" C* s5 c9 [4 o3 U6 \( |* X$ b0 M如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。1 m5 _0 m2 h6 R4 e% l3 Z0 D
8 \7 b) s5 q. {" e6 b  \, K$ P
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
1 h) q) U: z8 J& Y" Q2 L" T
+ H' A5 T3 n% V- t从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:% c* A+ A( T7 \
8 V7 W# `0 ?; K1 X& Y4 T
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
" |9 b: f$ o) @7 `7 d. S! Y
7 c$ o& Q  ?; w, m; Ocompletion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。8 T: N4 f! @* H2 o$ D' m

% r1 h# c$ A8 C: ?$ F下面是一些数据例子:
$ S  A* d: z2 C3 ~  T: d( D( f. z; D
{
" L5 u% ?$ m+ V; W  f$ Z    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", 9 n( L, r  L4 P9 Q9 D  W# E
    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"4 t( X# x+ Q" T7 k
}" \; f$ T* q7 c5 h9 g/ m
更多的例子可以看如下链接:
& d/ Q! l, A7 \4 {( f: L
  x8 m1 A0 \  R1 ^3 A1 S( eGPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub' M/ C/ B/ O! g0 E
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub, m5 H- c) q3 j1 B, c
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
* Y! I2 ^) A0 w2 u$ L
5 s# Y" o$ J8 Z2 C/ V二、在Prompt中带入知识& R- T2 y' g+ I, ^6 g: t& A% P
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
2 d9 }$ }" L% p2 a
$ u8 G9 D6 F/ r; t8 W' L0 p输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。* ?$ C0 v7 {  ?2 H$ ?& Y1 A7 s
- h" F+ b" z0 Z3 C5 j
下面是一些例子:+ I$ k5 u5 r+ t. I

- v/ N$ D& p' x' J$ \1 I+ G例1:作为专业DBA,回答SQL相关问题
' }% w9 Y6 p! ~) }1 r/ s% G这里在输入问题时,引入了我们的数据库表结构这个专业知识。2 q& F/ x& @: ^0 O
7 X- e6 s+ \2 x, R" r! i5 X
问:
+ G4 U1 @9 y' _4 ~) F; [1 Z4 z
5 `& ]+ B. l/ ?  i我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。# e; G8 Q9 j" \4 U
8 R7 _2 N+ g7 L# T
我的数据表结构为:
2 G! f0 s7 S6 Q; }" j
3 t5 }8 G2 |$ X  |& j% QCREATE TABLE `user` (
% t" }; H. M: k' y`id` int NOT NULL AUTO_INCREMENT,
2 z, I- Y% P4 `9 v2 E7 E`name` varchar(255) CHARACTER SET  utf8mb4
7 ^" m8 T1 `/ }4 i9 l+ Z      COLLATE utf8mb4_unicode_ci : h* {7 T" h2 `+ J: s
      NOT NULL DEFAULT '' / J1 |2 C9 }* T0 T; F
      COMMENT '名字'," c0 o, Y7 y0 R/ C* E0 |$ H. n
PRIMARY KEY (`id`)& T- H1 S/ t* D8 H0 F- b3 j; o
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
' |5 l: |/ i+ j- i+ _      COLLATE=utf8mb4_unicode_ci
( ]: n( O8 n5 n8 w8 p9 ]      COMMENT='用户表';, X  v  j- [4 g7 w
我的需求为:根据用户的名字查询用户的id
2 d& \" W' C: |) P; S1 U
  x# J! f; W$ @1 W3 }# Z( i回答
# V2 H* I5 @( q1 z, V! t2 O0 m
; X* ^1 p) [3 H+ L0 K6 ?好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:. A/ K. K/ w6 u5 U: w; U
  Z0 @7 w* @7 l3 ?. l9 h9 H
SELECT id FROM user WHERE name = '用户的名字';
  |+ q$ z( }4 F0 X1 A2 D这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
: x" V$ {+ L3 x6 q& e' K& v$ ~+ ~6 V3 u( _2 x: z7 ]
您可以使用以下SQL语句来为name字段创建索引:
5 {: k2 \& g1 V
% a! l+ [6 M- x& {ALTER TABLE user ADD INDEX name_index (name);! _" E0 [5 o/ y: Z$ l& ]
此外,为了保证查询的效率,您需要注意以下几点:/ Y$ @! w) s1 e% s

( K0 F. |7 [/ p6 Q$ L7 J数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
3 S% i1 q6 D% @4 W% T. Q8 t; H6 V% H6 \: Z( |
如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。
3 L( A& }' g% |. c
8 u7 f8 m- n) I# |5 o3 h例2:智能客服
( ]  j" ^! t3 g6 f& w; R比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:! E+ }+ R+ r4 j  m
# u: ~+ t% j# v' V5 ~
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
& J: p7 @1 k9 ^8 E
4 {1 }7 W$ k6 u) e) A下面代码通过消息对象的数组注入了一些上下文知识。* ^8 P6 l! D& f& E3 B' ]
$ J$ H7 S2 c7 o( W! T
2 n9 e9 r& j- U! Y6 W& S" ~
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
; e) Z) O0 n, U: }. D6 himport openai* ]! W, v% P$ E) e% R

: Q6 K2 y, n' X# Y" {openai.ChatCompletion.create(0 z8 W) E' b: ~9 F. \$ P
  model="gpt-3.5-turbo",
$ g$ {; Y) K0 A4 M" G' w  messages=[3 c9 j  t5 Y- p' a, G, g( }
        {"role": "system", "content": "You are a helpful assistant."},
# }" F8 L% C5 @        {"role": "user", "content": "Who won the world series in 2020?"},5 x+ ~* l% v! i- m
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},# Y8 X; b4 C) v; i8 d8 D7 Y
        {"role": "user", "content": "Where was it played?"}! S% f9 R% ^7 \% g0 Y% X! {
    ]
1 O5 M9 o* Y2 y8 k( v)- a+ X6 \2 A' ~9 N2 N- T
7 m: Z5 L  R  q0 k$ q
其中
) u5 @; @: \2 q- C' v& P' A0 `, L* r1 P0 N
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
3 Q! |+ Q* p2 O, T$ C/ L  h/ @' J用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。
- h5 C7 {: n9 C3 V0 D助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。, o/ w8 K6 s/ X3 H1 O+ p9 p( o
通过上面的方式就可以完成专业领域知识的注入。1 m& a0 f/ W- P
* i& D  o+ y) u- @! U: R, j
例3:通过外部链接把内容带入
& s8 ^# M2 |7 I+ l8 h, Y下面只包含我们发起的对话部分,会话结果比较长,省略了:
: F! |% D0 }( l0 t
& U/ e% o, `8 y% y: U6 O& vUser : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?7 B: @6 w! l/ C! y) a0 m, I8 g" n
...' j# t9 j# n2 i9 g- Z$ A
User : Microsoft 2022 Annual Report6 }6 C1 C% S  L
...
2 B2 z$ i0 x) g9 i# OUser : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?+ j" i5 g, s8 d" H, `
...
+ L8 P" c2 O# e  ^+ N1 yUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom( l# M  G. f& b, K% ~
...
, ^% E) ?8 u- ?' ^3 XUser: 您能否从Nvidia的报告中提供更多财务见解?
& @/ d! Y% K3 l7 T4 J( J...
4 K/ _: x: b3 }* Q7 o+ h6 KUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
! e4 F2 G. S0 K: l9 e1 J$ B! U....
& x, Z4 N! h2 G& f/ [! ?+ J$ g0 r+ @& r% |5 \8 u& a' o
User: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。, a% E8 V+ L' g# C: S
...
& U1 s& B( d% X) ]% sUser:预测下戴尔未来12个月的现金流。0 v6 G" C- k8 `. |

- P7 X( X. u  I# K% y$ V# ~6 p这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。5 F9 ~& e% M, H7 m% \* C& j

# v1 @  A+ Z1 {适用场景对比
. `( H! C: f" i# I+ v/ [8 x7 |- |价格对比
4 d% M0 q) [' V* E2 sOpenAI的相关报价看: Pricing
( [* s9 L1 \, n5 U" p( O/ C$ Y. p
6 X# }; @" x! H8 E: L; C9 H对话类:GPT4远远高于GTP3.5。6 U7 O' h# w7 T7 Q5 M. W2 T
OpenAI的相关报价.png 6 ^) ]" J: x( `3 B, A
. j$ m% Z; p, Y9 j9 _

% ~3 m; x. O) q6 }0 C4 k! A( d% Y  d目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
# L! m. P, V9 b5 q; `: a5 H
; K! b: k: v  E. i9 T8 l- x! O1 }# v' d) L/ C
Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
0 {# z7 p9 J& }  c4 R5 L
0 d& z# F, _! W' c# K
& [+ I) }8 e3 |+ T% X. |8 h: f1 b6 Q' ^' j
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
0 Q7 G) N" J7 P, L  Z. b; W8 I% A- r
而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
" C: @4 J( J4 ?3 m  D- H3 ^, [8 g4 ?( ]* f$ y  e8 p
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。0 z- A, m+ W$ }2 S1 N
! u5 b- u( T" V. Y
长度问题
- ], M( R8 r; K, {/ t- k6 `ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。' m! J; {6 \, k4 g
6 z  o7 k9 w) A$ V, C$ J- n
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
3 `' U7 O5 H. i5 R% o- C  A& A9 u, }; }; y  W
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)8 C, |0 _6 w# h7 b0 s
. h1 l. c& B+ ]6 e; s- ?: {# \8 S  S
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
0 S" Q1 ?$ V. v9 r; H; r; z/ G+ H% ^2 g3 S
聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。( X- {' t8 y7 J# O4 y
% X' U+ w: j+ Y6 a2 z% y7 M. K
比如说用户提了一个问题:- u: a, a  ^7 M7 {# L! x6 @7 |

- W' p: S3 {1 B: ?. m“What's the makers's schedule?”
8 a$ ?: w# I) k( P7 Z# v6 S. x- n# G- g8 M& k  [3 w
从数据库中检索到相关的文字段落是:
2 w. s" O% b9 _. e4 Z9 ]. A+ U) ~1 \& n9 W/ E
“What I worked on...”( _9 t3 k, |. m% x
"Taste for Makers..."
' w  W6 H" R5 q) B9 L2 G# g
: h0 {4 D8 p1 A! ^! ^那么最终的prompt看起来就像这样:3 ~" C9 Q& ]$ H$ V- H! o8 E: v2 j
* A: `" b- R$ i4 I. V/ K' Q
# n# l, ^( i0 y' x
[% ?' o# P* _4 n9 F4 B/ Z8 ~
{
5 A* O9 r* A0 T0 U  l. ^  role: "system",# i+ w) j9 x1 ^- ?0 M* f; b/ ^2 ?
  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.": _: V2 S( b7 a$ N- _  \
},, x  W: @5 t4 z3 x
{' t( z% N- Z  s3 g% f: k2 y( S6 t
role: "user"," b( J) P* r! Q( S
content: `Use the following passages to provide an answer
. r3 S2 K$ }* M' w0 q$ ~5 ^: G5 yto the query: "What's the makers's schedule?"
6 {. ~) F  h* h$ n2 A1. What I worked on...
, q- V' f/ k# w; r' q- R( _2. Taste for Makers...`: G( e. H  j, `) z
}, c: _7 x7 R( k( K6 w
]
2 b* z6 O. D, l5 N& w
* _; ?1 P" e0 g3 X. L: e  h* ?; R1 x" ?/ u' ^2 \* r2 p) h
这样ChatGPT在返回结果的时候,就会加上你的数据集。
- u" R" J" `3 D7 k
) \8 }. u9 U4 D具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.! ?, x( P# e. q2 \, k( x

. Y% S+ K' ?  O0 L% e总结
/ H, @2 n  m+ i6 q- g0 z& r+ J大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
' H/ v$ v4 Z( s# b2 l5 z* N, b" K4 H1 ]+ s! g4 v1 o7 M4 K5 p4 i
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。) G& K3 \) q0 X
# D( U$ o4 x( ?7 i6 I% H" n
参考
8 p+ M9 V% J- G/ g如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客
* d1 ^2 i& ?& V( f4 e  p
- `' b' w/ |7 Q搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt7 E# x9 ^5 C3 q9 |2 G. y
+ z0 R- y1 M8 P
  d7 o( _5 a( s  x, m
————————————————
5 y$ [' c+ ?2 |7 {% ~* X0 a  ?版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  ]7 }! H7 i7 g1 X5 D
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157. e; A; e, V5 S& l9 M
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-7 17:55 , Processed in 0.072942 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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