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

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

[复制链接]

322

主题

485

回帖

3164

积分

管理员

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

" p$ y! N. q" H7 L; {# P# p+ hChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。
  I4 a- q8 Q" B6 n$ `9 Y$ I" I7 ^0 U# w! |" A, V
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
& f" f1 M+ x3 k/ a( h7 A/ s( A  e) p, C' e
我们应该思考如何让AI在专业领域中释放更大的价值潜能。
; X' m5 G! [; n, e0 V5 }/ ]就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。
6 }1 b9 W" x6 j5 j/ }7 w, o; l6 ^/ n8 I& k
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。4 v" d' q! A& K' I

. r+ b+ H; @$ L$ A% H
. n8 ?/ [2 Z& @7 M9 F6 \0 M 以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png
) M" f, j9 ~1 m0 O  x2 r  u& ?$ z1 |4 r
2 |6 O9 X- J9 e: C) f& g  ?& g/ ~
# Y1 u  n2 ~! Z( Q* z9 O/ I# [
一、微调(Fine-tuning)注入专业领域知识
8 q/ e. t) w/ V" b5 X微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。. Y# \' L7 e. }  S
! G" k/ v: h- X5 ], f
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。6 L3 O' x7 n8 f
/ T% v& T& {) k& i0 w& t
如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
/ _9 @4 D5 O& G0 d4 r3 h5 d) k9 k$ i
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。7 g* d& W0 P4 @% P& X$ u
6 l6 O* d% X3 Z/ k2 `. S' n3 A
从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
( {; B- k4 J5 p! [/ Q$ d5 w3 i8 E2 W: U5 k2 V" ]
prompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。
1 q2 p% i: A, h& a% T: {9 i* b0 n0 }, _6 t" G
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。- w3 ]: Z3 j# o# b& h$ i
0 \6 Q' R! h. g( E
下面是一些数据例子:% K3 x1 q& G4 r( U( ?
5 M' b! p  C6 C, a! d! X$ Y
{: `3 V; d6 J' m  e* v
    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->",
1 L& l8 I! a3 ]    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n"
$ h& N1 p% H1 a, ]" @: ^}5 Q' j$ V! A6 t; c1 u+ O- s
更多的例子可以看如下链接:
& n( X& B+ m1 Q0 ^3 c! C
( A- S7 n# t) U' K( N7 U9 kGPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub" f4 t; u, n  P: m6 D2 d8 G; K
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub. e& z5 y* N$ a+ {
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。
: h! x2 {. V' K/ L- G8 `- a' S* z, [: s) J
二、在Prompt中带入知识
3 D$ a$ \9 t( P3 T1 B& J! g只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
: Y4 n0 z' A9 Y$ Y  N; v
, J! r, I$ X# w9 a. e* K6 Z! b3 j) I输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
7 N9 O. b3 F, b0 b+ ?5 t4 h
) k/ X* w7 `& k6 c7 b+ e下面是一些例子:
- F! y6 K# L# J3 ?$ n/ s3 c7 g% x! P8 z9 [2 Q; b& }; x2 M5 W9 P
例1:作为专业DBA,回答SQL相关问题$ H8 ?  i. F- |; Y! Y
这里在输入问题时,引入了我们的数据库表结构这个专业知识。$ v2 Q+ G# h. H, E5 M
6 E9 r# j: [/ P
问:
! S, F# ?# I' _
* V* j; Z' z3 _9 L我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。  d+ |8 I/ L. d% a

/ m7 K2 I4 @" h# t' v我的数据表结构为:+ w5 N3 z4 Y3 @0 _, A! Y1 w
& l* w2 Z+ e: H3 D
CREATE TABLE `user` (
$ t0 M, \6 ~# G4 ?! S! G`id` int NOT NULL AUTO_INCREMENT,/ @4 A# W, f, b) a. Y# [
`name` varchar(255) CHARACTER SET  utf8mb4 7 Q# e, r+ A" W+ t/ P
      COLLATE utf8mb4_unicode_ci
9 f" e+ }2 g8 \* m& [( E; v      NOT NULL DEFAULT '' ) N( \6 r) l- o4 q
      COMMENT '名字',
# B0 z& \( p2 k, |# ~/ I& ^8 iPRIMARY KEY (`id`)
1 ]3 }1 H5 A  A  U) N( [) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
: `# C( w' F, ?6 e; n" D3 b      COLLATE=utf8mb4_unicode_ci
  X! D  }- T6 i8 r0 B9 M      COMMENT='用户表';9 z, a# a; n' y
我的需求为:根据用户的名字查询用户的id
5 l' a( S/ W  c! @4 _. H0 D6 s! h3 K3 E0 u" R# \+ ?7 Q! ?
回答
; G, y! v3 X: K
( a& b. M( \$ W( X好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:4 g' u$ p, i* A  K% V2 P
% ~; R1 Z/ X$ F# i5 k$ B
SELECT id FROM user WHERE name = '用户的名字';
8 C& c5 k7 ^- L0 N这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。( A( r! {: X9 V# E# Z
- s  H" ]2 v7 s. B
您可以使用以下SQL语句来为name字段创建索引:1 H& H9 Y; {7 H+ f+ Y6 f

" X4 ^& Q$ L4 @  Z  AALTER TABLE user ADD INDEX name_index (name);
) ]+ @! R$ B' Z3 q3 d0 l6 l此外,为了保证查询的效率,您需要注意以下几点:
1 D/ F& `9 H) P0 x0 G
0 S8 R! F) |* q7 z数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
9 O; I: M2 K4 {7 H$ b
& `1 M6 S( o% ^- D' G% |如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。5 x" P) `# l+ b; ~

8 E& E  D; `# @% N+ F例2:智能客服) h$ Q; ~" E! u% g
比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
$ j% B% q' l# N* U* l/ ]) T
6 h" T& y) [( H. ]9 {lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub! Q& p5 ?3 p  j% e, C) Y4 R

: [$ P- D3 F  g+ r下面代码通过消息对象的数组注入了一些上下文知识。/ K3 d  r# g( Q% J# T

, @; r3 x9 ~: {$ U! W- M & s% M) z! b5 n* [% ?# w! N# V% X
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work6 Y1 v- w. {4 r) V- g
import openai: L1 k3 K$ x- t
# d3 i. X- |3 K+ ~
openai.ChatCompletion.create(
: T6 w- x; t2 N4 G% x2 x- g# ~/ O  model="gpt-3.5-turbo",9 K8 ?3 M+ c# P; w
  messages=[( c$ v& j' s+ j- r, S
        {"role": "system", "content": "You are a helpful assistant."},, k: Y: u# P  i5 r
        {"role": "user", "content": "Who won the world series in 2020?"},9 z# n5 e4 a' ^# z- i
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
% n; e) ^1 t4 ^6 B2 a        {"role": "user", "content": "Where was it played?"}+ V7 G! N; S0 m6 \
    ]
  W6 X: h* o0 E1 B' x)5 P- p' V5 k/ w/ k# H0 i* o
" |/ D! N, j- r7 O, g6 K
其中% Q/ ?2 [3 N4 N

' h2 V- \* `0 Z0 [系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。
1 o" F) ?+ s: j' `& w  _  E用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。' |. o6 G$ t+ N4 M1 b& f, W3 x1 ^
助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
# p* j1 G- `0 e+ f* e* A通过上面的方式就可以完成专业领域知识的注入。
4 I7 M9 w2 D; l) k6 [4 p% z- W( E2 G( @+ I9 L4 T* @6 i* t
例3:通过外部链接把内容带入
) z& b0 u- k& b: b/ v5 U- B# e下面只包含我们发起的对话部分,会话结果比较长,省略了:* m9 R* ?3 C+ r/ [+ v+ N7 R5 `
4 [; G% e7 c& U$ F8 T7 M/ N+ U
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?* K; N' F' a4 @! g
...
; P& ^1 D! G9 XUser : Microsoft 2022 Annual Report6 [, t, N3 |; v  a+ z
...2 \. D  ~8 K! D& C1 d- [4 ~
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?# o5 b% T+ _* v
...
9 b- E) G. d6 W' [. ^+ H7 Q  uUser: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom1 [" X! y8 @! ?9 k4 l7 V8 `
...$ z% F7 A* ^) A- ^0 L
User: 您能否从Nvidia的报告中提供更多财务见解?$ \1 a: V3 L+ Y' J
...
7 g" F! z) v! J8 `, |! PUser: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?
* V- }$ E2 S7 E7 a...., d) w  E4 x$ C8 h* Y% |

: e3 n2 [: @0 B7 N9 e$ oUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。; T' p# [+ [% b% L7 Q4 V- F
...
" n" D# M' E6 N1 g$ f# u) D9 A# L, WUser:预测下戴尔未来12个月的现金流。
5 J! S9 J8 \3 X4 S5 i) x7 g; l- p+ B% [# D- X* _  R0 a3 p
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。. G0 T* A+ W0 q5 A- w5 X9 r
! O0 G9 R  U& T5 p6 J
适用场景对比9 S7 d" }/ e: q
价格对比
) k1 Q$ [4 G- V8 B; A9 KOpenAI的相关报价看: Pricing- f. Y2 ~5 h) U, N
2 V2 P" m$ X, i$ N
对话类:GPT4远远高于GTP3.5。! N) M: H5 T# I- D$ d1 M
OpenAI的相关报价.png
+ R9 B& \/ T: v. n8 U8 @9 p) j! u4 {" t
4 C' g$ b- B' C# R; P( T$ x
目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。
9 V$ s: D6 M6 q/ m: M
( p5 K* ^" R: P; Y9 ?/ O" i: Q8 A% V) V4 A2 q
Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png & @3 x  r, [5 G
: V) A6 s% o  p1 U" T
2 s/ c2 R, J) h- ~0 W! @/ e
' y1 g& T" `& H- H6 c( ^' ^
GPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。, O, K, `, y4 D/ R% X

" a. H- |5 D' M而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。0 V: v. I  g: h5 z( C
2 @  q6 V, R7 j% N
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
; O# [# }1 r3 K' g  F& I9 o
1 h6 J! {8 Y- L! {# E. i: o$ q长度问题
- |- r# I( t, s4 K' RChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。
( ?: K; ~3 \! K1 U9 v8 n: Z2 z
, i( X) s0 G3 E但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。! G; p9 i9 u* h# Q; X2 x8 g/ D3 e

+ \( A7 C0 E9 [" q. j" Z首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)+ O6 b( P( P7 k& K4 R
9 t6 G; P0 U2 O/ _: w) d% z
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
. P% ^9 \# d" E7 T+ g; {9 `) r+ `
* r, s; u" ]: D5 C$ G% c* `聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。
* U# m6 ~8 e3 u7 K+ ^7 Z; J7 t$ F$ @) [6 h% d0 _# \# `! b3 }3 ~
比如说用户提了一个问题:
$ B. N1 X* Q- I2 B2 J  T& U5 m& S( ]- `1 M, f: m
“What's the makers's schedule?”
  M3 R) b- f7 \$ b6 M" Y" z8 z8 }3 D7 A* k2 N
从数据库中检索到相关的文字段落是:. |4 G5 N& a" O3 Z. F9 y

" Q% M1 y4 A8 c- g$ E“What I worked on...”
/ g7 D  W+ c  n3 K"Taste for Makers..."/ \+ ^+ K% G7 `, n0 h# `
+ P2 j& F- \: t3 ?: o# ^
那么最终的prompt看起来就像这样:
( u0 t! V4 p, I) K8 L; j
3 ?9 l7 q/ F: d - H3 |' {# d1 v
[
, w# G3 s* g# c( T, H2 e {
; i* ]" G0 m+ m- G" v: A  role: "system",- G3 B* m4 q4 O( I
  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."/ l6 q- y7 k- ]& T; I4 }# |
},0 H) [2 @. [) g* _
{
4 a  f+ l0 M$ w) ?/ K& R3 A8 `( H role: "user",0 H, S( w; b( b# C8 s' n
content: `Use the following passages to provide an answer
( C# }; I$ v8 p! Uto the query: "What's the makers's schedule?"
9 w$ o# Q1 L' t: x1. What I worked on.../ ^& O  |1 p9 @) _2 `- R; n) g
2. Taste for Makers...`+ X, z0 r' U' Z# \
}% |2 v9 Y/ o' D. S
]
& w" z6 L* ~( c) Q. L
2 b/ W6 x# ?& r5 j, {/ P3 \) Q- d& X2 d" H5 w7 m* D
这样ChatGPT在返回结果的时候,就会加上你的数据集。
8 s8 g/ b( p; e0 E' _" ^! u. u& l# {
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.
5 J/ O3 ~; k: r
! _" `9 [0 ~9 m. S3 C总结; R! f! J+ r8 U; H: A3 F9 ^: u
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。
. v4 Y4 u+ \5 u$ p: j4 u% x1 e; j  t7 i, v
而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。  N; A/ V% h) w9 M# X
- W5 i  b7 H5 b  j3 Z
参考
5 ~  m+ u& A9 ]/ u" ^8 O如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客5 q' ?. A6 l, C4 L  m2 P. ]

$ ]1 R/ w3 g3 {& m+ G* l搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt
0 E7 D- p* e/ v5 v: ]; T0 y& z) Z* K
/ Z: U7 C3 {0 O' g
————————————————
" |1 H. ?( P0 _4 B- w" i6 G版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 y8 `/ |" @0 G4 }1 ^8 r原文链接:https://blog.csdn.net/ghj1976/article/details/129676157
. X3 M: G1 @' p! w) m/ u  e9 y  u' d
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-8 18:34 , Processed in 0.082008 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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