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

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

[复制链接]

581

主题

706

回帖

4842

积分

管理员

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

. f# n" g9 N0 RChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。' ?) f, Q5 q! v3 l
1 Q* ~0 H4 C7 Y6 {# h8 l
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。5 s9 K$ T/ A6 L' X6 N& H) T8 `1 a- @

" f7 {2 W* P# Z1 I/ |7 I6 @我们应该思考如何让AI在专业领域中释放更大的价值潜能。
  K8 s% M2 D1 a$ w( k就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
* t2 b6 `1 `2 n% t0 x7 h5 {+ d/ _3 C- k. p
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。4 M9 {5 z5 K. u$ F/ T

, e0 S7 E2 b/ ]& _( L1 I2 D+ O
3 q, m$ J) G* E' U. E% O 以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png ) p0 ?  Q, |  m/ c+ W6 F

8 q& ?! R6 c  P+ `* o! U1 Y1 H. K4 H ; ?/ W8 Z6 J  r2 K1 \3 [! B
+ T5 ~/ L9 w9 z/ m2 ~" \
一、微调(Fine-tuning)注入专业领域知识0 W* A: ]& {7 e! R+ @7 D
微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。. t1 b- x4 j9 p4 i7 n" M; q

# Y- B7 Q. k$ f- T4 L2 M3 T传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。. ?, B2 b3 i& {  T" g) k

, i  D) n" M1 F. p如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
! I7 n% n$ Y. z5 l! ~
! J7 n. ]# s( {6 e) UOpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。
9 [6 @8 y8 R2 U" W# z3 J! W5 w9 M: z
9 T8 `3 g3 F# a; U' I从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
4 s* j% K- n, ~% C. K$ D; H
9 J1 z6 P9 S4 A- F% H/ ^6 b( sprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。' \+ y4 D$ B/ K% ]4 o

' j, a; J2 z/ i" e+ n) t3 i# A, H$ _# Vcompletion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。
$ V2 j; X/ E# A2 f2 G( g9 R0 P! C8 [1 x$ Y( k
下面是一些数据例子:
! ~. D/ \1 I" `, t
, }  I6 l$ W& L{, m3 R% H2 j3 a
    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
1 L( S8 V1 p' Y+ R/ S; m    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
! Z/ y+ {7 I1 l) O, D$ J1 K}, K4 n2 _  Z# W& q, V
更多的例子可以看如下链接:
" j9 R; F3 c! a* O. ~$ D, W
) w: E6 I; r7 l, [  T& d' WGPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub  O8 k6 P! b1 I( _7 u; L3 d4 r
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub' V. H# x" d* F
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
6 G1 i- b9 c! y$ m6 d
+ K1 ~* g$ v+ O4 \3 b二、在Prompt中带入知识' m7 [3 e% e* d2 I3 j+ w
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
1 M' v% i8 n) Z& p7 }, J3 W# q+ `( N( w2 P- ^* ~' C9 P% c
输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。" {9 z* _9 d% v" \! W
4 [' B* P4 h% U5 M
下面是一些例子:7 E2 G' M& I, y6 d: n

: _/ u5 |  R& ~( N4 s( W2 I+ a% r例1:作为专业DBA,回答SQL相关问题
! _, P6 I9 E! W  S3 q! e% T这里在输入问题时,引入了我们的数据库表结构这个专业知识。
" b: @" j9 o2 _1 S
4 n# @* H* v3 ^; l0 f问:
3 }1 T% j4 V( X4 O* C$ D, j- p2 _) l2 T1 q& Z
我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。( G2 s$ C8 f) Z8 B

& U: p, }. s1 N  v我的数据表结构为:# g. {) u# k2 R+ |* b

' D9 C0 @% b6 T4 H% O3 [  e" oCREATE TABLE `user` (; Y7 c% x2 t/ i9 M7 _# B
`id` int NOT NULL AUTO_INCREMENT,
) F4 L+ v5 g6 c3 W8 E`name` varchar(255) CHARACTER SET  utf8mb4
; L5 x1 @: h! p      COLLATE utf8mb4_unicode_ci
7 A, x; j7 H/ }; B  F& c3 [      NOT NULL DEFAULT ''
" S" h! J' @/ i' Q: ^% Y      COMMENT '名字',$ \6 r0 W: S, P
PRIMARY KEY (`id`)$ t* K& `+ y9 C7 i% o" K1 o
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
" x5 a, G. e6 R& j2 q( F" n      COLLATE=utf8mb4_unicode_ci 8 p' a6 z, Y& p0 a& I8 b/ y
      COMMENT='用户表';) h$ R: o- m1 R4 V9 V
我的需求为:根据用户的名字查询用户的id. S6 A/ G6 H! c0 d2 F4 X( Q" w
1 w) a$ N0 w% \( b8 |7 p
回答
& U3 P- A5 G6 ?6 y. l$ `1 {/ i# M( Q3 V) P/ w% P
好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:) K* b. z; X$ g; p

! p" g1 a7 B9 Z# Q2 n  C+ _4 d' ZSELECT id FROM user WHERE name = '用户的名字';
( `4 Z/ z* N! a) U, w" m3 y这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。
9 U' }9 G0 Q/ l. u" j$ o! _7 t3 y& d( {1 y  ~- `
您可以使用以下SQL语句来为name字段创建索引:
  }2 f2 W1 g/ A4 \1 L: B# ^  C& {7 K& e$ E8 c4 y
ALTER TABLE user ADD INDEX name_index (name);+ S1 `  m9 d# z
此外,为了保证查询的效率,您需要注意以下几点:( P& C: X0 q: x, p& b

. Y8 j- E. G7 j: ^1 Z- }数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
' ?& D1 O* E! Y2 R! u+ t+ e  C
1 `/ h7 c# @, n5 M  R. @如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。
( l/ y9 Z% K* a8 g: D! h/ u1 O% @. K% T* U) g2 a
例2:智能客服9 B2 {, P; u7 B8 G& C1 f
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:3 Z/ E3 W" K9 Y4 @# ]
8 T' Y$ e( t7 B
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub
* Y, [7 Q7 r+ ?! B% y% [2 F, C& R: V; E
' Y1 R( ?/ e/ I# m( i' l下面代码通过消息对象的数组注入了一些上下文知识。( k5 @( z. {( j( A$ z7 ]. m) u
" H) s  V. [8 U' p' i

' s0 Y; q0 n- ~2 @9 X. a. w) E# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
2 h! v5 h6 y3 a+ timport openai, _% h! O. o) G. ~. f! T

( E1 [9 ~; j# Z6 _openai.ChatCompletion.create(
3 M$ z1 n% \! M+ C5 c  model="gpt-3.5-turbo",
2 p4 O) x7 w" ^, K  K  messages=[
0 Y- |9 o1 t4 ?  h; X        {"role": "system", "content": "You are a helpful assistant."},. \, g% X6 i: o& b! s3 c
        {"role": "user", "content": "Who won the world series in 2020?"},& R1 W, ]) e) p0 m9 ?; E
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},  K2 y6 U+ b+ F$ z3 H" b3 |
        {"role": "user", "content": "Where was it played?"}) w0 ^3 g- h6 K$ ^' v0 ]# k# l
    ]
1 Y3 }( @5 B7 I8 m9 })
8 b) R8 Z. n( @! A" S7 ?2 w1 |9 `
1 J9 u( P  M/ Z, {其中
* c8 t# |  s: _0 v+ l; {- ~( v1 y# m; D$ H" x
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。, h& R5 |; H/ D- l$ r2 F
用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。# e% a- l4 E' u4 P
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
8 W7 m( `8 G- m0 M6 E: E通过上面的方式就可以完成专业领域知识的注入。
/ B% t# V- D+ l4 O" s1 S$ V! _8 j) d1 B) @2 E. C4 j( u
例3:通过外部链接把内容带入
- R2 r" {& q  s$ e$ k下面只包含我们发起的对话部分,会话结果比较长,省略了:2 s9 k0 F, x" {
$ y/ z( {/ d6 g+ H
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?, E* h% G8 ~; A, |* X6 Q
...
! m) ?8 S( T/ }+ fUser : Microsoft 2022 Annual Report
0 z! C  [) _! c, n' l2 _, z) E...+ W: ~% k5 k, P0 n( r2 |
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
9 g9 y* c& ?7 y...
- ?; P8 @4 l" Z0 j7 [, @5 u  v2 eUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom
0 B( i( [- O. p. G3 ]...
" [. E& ]* j  j& P) n) r5 m' BUser: 您能否从Nvidia的报告中提供更多财务见解?
5 t: W& |5 d0 T% y3 @...
; w$ e9 ~3 _* NUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?# h3 f5 [; s. N. z
....
# ~, u/ v2 B% K$ V% j2 y
, d8 H; P/ H: {0 R5 KUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。$ q+ t6 ~' Q; a' V/ Y8 |8 E
...6 J6 T% m( s. M/ D& o
User:预测下戴尔未来12个月的现金流。
4 S% T) o* ]- \( ^  s# r3 ?3 ~5 o' G$ K3 d2 x/ P' A
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。' m7 x7 E9 f5 C7 A

9 p6 j- l" G" t% T7 R/ p适用场景对比( e+ }7 g3 O$ Z$ Q) }
价格对比
6 t4 d( o( D+ dOpenAI的相关报价看: Pricing
( ]$ u. [7 a" \/ H% W6 O% h; u( E6 {3 h, j! p
对话类:GPT4远远高于GTP3.5。
7 y/ b! E: t* u2 _4 T! c OpenAI的相关报价.png
! h) T3 K% g" |. f* H. L; a% W2 j2 S% e: |1 t1 h# K
: Y- f5 J. ]( u: M2 c
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
& W5 }% {# J; M  G$ S2 E- w0 [0 B& \; e5 X

0 s+ }9 J  R. H. k1 A( Q; m Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png 1 y+ c0 B8 V0 ^. ~" @6 d4 O$ b2 r  e

* D6 k0 ?. O8 ~. u( z, i : m- G& |& U! K8 i
) E/ n  B- H8 x2 u3 @8 K
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
$ i4 r- V7 o( ?! @- n8 U
) @1 l( F* V9 v7 Z; U2 R而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。2 v' |! |3 Y$ V7 ]/ J% _6 M" o
0 L7 v, o" Z# D  e
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
5 Y. R( ?- Z: f, {0 r# Z/ _2 `7 H2 U4 _; Z8 s* u0 n4 R$ y; f/ \" ?
长度问题
9 P! D: |3 o3 z# x: x5 }% RChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
  a( [" p2 @) M/ x/ y: k
+ m  j6 R+ [. F- n; z但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。
! h" b/ ]1 [" g: J5 w6 y0 ~) K2 q1 U$ D- Q' b# d, O
首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)
3 g' G6 ]' Y8 u2 |
; O, `0 x1 p% q1 s+ l5 ~8 J1 f当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
+ ^- U8 A4 l# R) K5 p
( J. I& H' ^) \; b% d1 [聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。2 u3 S  k* U5 Y% L0 M

5 w6 O) j- O7 d) C$ X. q比如说用户提了一个问题:! ]7 V2 G1 [; [# B$ B7 N
" d; Z+ e! e& A! Q0 [
“What's the makers's schedule?”
! \: P5 {5 z" c; u. u" A+ R0 p9 P- v7 k* K0 o) k: f
从数据库中检索到相关的文字段落是:
) G+ v8 ]% o9 o& w6 x  z8 e* z: f, G6 t6 ?/ X  V  G: y1 k
“What I worked on...”
5 o1 n  ^5 Q0 K: Z: `"Taste for Makers..."
! ~2 s  k8 e; y7 h8 W# g/ c2 k) v) B. W6 p2 @! }% A2 i
那么最终的prompt看起来就像这样:
) v& }6 g8 P1 ]1 T& y, m% E
+ y; `" J' P* y) w+ s+ v2 m: {0 z
/ K5 r4 R( q0 `5 Y3 {[
) H7 ]% P. Q# z8 j {
4 W& B) p9 ^9 K6 S9 P  role: "system",6 V: H+ A6 a3 z% G! q
  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."
( i1 z: V# @. I& V- I8 D, U9 y },# b: T9 y- ~3 o
{4 L9 v9 w2 k$ [: n8 p8 V
role: "user",$ u; s+ E7 P, a' N
content: `Use the following passages to provide an answer
6 u5 k* w3 B6 Oto the query: "What's the makers's schedule?"
% M" \% C7 _' |: J/ |3 X/ n1. What I worked on...
# L6 v1 o+ T; H  N: F, u+ I! ?2. Taste for Makers...`
$ e4 z0 Q" C0 _% m# y) A1 ] }
' [2 B) ^, ]: ]+ L( E! @]
* P9 R( v7 c' N' X: [ & g) B( t: x/ G, A& s
) d$ s9 K: b& M. D1 g- Q+ O' d
这样ChatGPT在返回结果的时候,就会加上你的数据集。
  A/ q: G0 }% U4 [: d$ L0 x! O
3 U4 M) G6 f$ e2 f; I具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.
; W& P, @# j  s8 R
, z" ?3 j; B2 T总结
- L+ ?6 ^) p* M& ^. l: ~. |: E# b8 X大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
; G* i) K. u$ z2 {0 u' V3 o
  ^" R* [  p2 }, {4 Q6 f而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。2 n3 f7 @% U! b3 t4 \2 x3 f

0 @% N) x0 z( r, w# j0 A4 F参考  d" a" L7 k' u/ T& K& v( S( ~
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客% V; G, v; C" u

, ]% C7 v1 o$ N; A: e( y: v搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt3 O1 d3 O1 M9 c# \" t9 p6 G

! C' z* ~4 s" w1 W7 r7 e2 N- Q: C
————————————————
" ^; Y+ S/ v5 J% P2 P1 s( ^0 H版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! S( n, c7 l0 n
原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
  d8 F8 }& ], n' F% q
欢迎定制:13928122889
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-2 06:53 , Processed in 0.021656 second(s), 6 queries , Redis On.

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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