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

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

[复制链接]

348

主题

566

回帖

3710

积分

管理员

积分
3710
QQ
发表于 2023-5-29 10:35:28 | 显示全部楼层 |阅读模式
2 [; P$ W/ B! X, I1 U. u
ChatGPT引发了AI革命,大家都想探究如何让它发挥更大价值。. V: f' G$ `- t' c
0 T  b7 f2 E# A$ d% ]6 I* T0 t
以它为代表的大模型并未完全掌握所有专业知识,这也正是我们创业的契机。
! T* o4 K& a0 k' M. m  o
' h  I; }) `. ?; V% h我们应该思考如何让AI在专业领域中释放更大的价值潜能。* y2 f" |7 h0 H9 ?+ |' H" y; r( o
就像开发者挖掘出某个鲜为人知的资源一样,我们可以开发出AI在特定领域的潜力,从而在市场上脱颖而出。8 J6 X% F; |1 T, \' w
; y$ A# _" L- D4 E/ y/ X& |/ n
以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt。
7 V. p! j, W* ~0 z4 V. ~
# h, s; H) T3 F4 m& M4 a5 w5 n: x
/ J5 d# y+ [6 k. o+ U, m+ g 以OpenAI的API为例,让大模型支持自己专业领域的知识,有两种方式:微调模型和封装到Prompt.png
% E8 ~! h; D. O! |/ z4 D' P" T- k& R& V& W8 G. `- a
5 w5 t3 ?1 K) j8 A- i1 f

* S/ _7 e" z$ F4 b- B- e4 q: n一、微调(Fine-tuning)注入专业领域知识
0 V: z  R$ }# c4 V# }: p' u微调是在基础大模型训练成熟之后,通过Fine-tuning模式,利用标注数据调整模型参数以适应不同任务需求。2 |0 t. L5 u7 t* r' L/ g/ A! t7 ?
  V/ w7 E; \, b) ^5 s3 G
传统的微调需要做调整损失函数、增加额外层等工作,但自2018年以来,随着预训练模型的体量不断增大,预训练模型Fine-tune所需的硬件和数据需求也在不断增长。此外,下游任务的丰富多样性使得预训练和微调阶段的设计更为复杂。
" G; o' U4 a8 x+ W- t  ~# [: X8 @: N1 U
6 k" X8 f  s3 q; H% q" V+ U如今,像GTP-4这样的模型已经采用了一种新的训练模式,即单向语言模型预训练+zero shot prompt/Instruct,它不需要在预训练后进行任务Fine-tuning,而是通过自然语言指令来解决下游任务,这为模型的优化提供了全新的可能性。
1 N2 R* {% w1 u2 n% M% L( j3 X/ X  S, c
OpenAI在GPT-4上花了6个月的时间才放出来,是为了使其更安全、更一致,而不是新的专业领域知识的注入,新专业领域知识的注入耗时非常短的,也就根据数据量,几分钟到几小时。3 ~" @) q% u" x

" V2 ?4 U6 \' x9 L从OpenAI的微调文档 https://platform.openai.com/docs/guides/fine-tuning 可以看出,要准备的数据包含prompt(输入文本)和completion(输出文本)两部分:
. E* V; @  s( v& Q2 I! P8 R
1 a+ t1 R' D3 M7 Gprompt是我们给模型的输入文本,它可以是任何文本,例如一个问题、一个描述、一个开头、一个例子等。prompt的作用是告诉模型我们想要完成什么样的任务,并给出一些上下文或模式。& _$ C8 o6 [" v* J. o' N
( B. j& U( b) }! A0 n: y
completion是模型根据prompt生成的输出文本,它可以是任何文本,例如一个答案、一个续写、一个列表、一段代码等。completion的作用是尽可能地满足prompt的要求,并保持语义和逻辑的连贯性。$ B! u, V$ Z+ F5 v

6 |# d9 _# w9 n0 S* u下面是一些数据例子:) S9 c, [: D: s9 L

! c, H4 C- k. |/ Q{' V( `1 Y% w. X5 l
    "prompt": "对以下商品进行夸赞:彩妆中的口红品类,卖点为颜色是正红色,能提升气色 ->", % M, V2 x0 ~/ [% k
    "completion": " 这口红正红色太好看了,完美提升气色,日常使用特别棒\\n", g+ R. [- S# G' N) S4 h) Y
}0 Y; Y; A- u5 H
更多的例子可以看如下链接:
/ \& m& y: U8 u# B* b) c! d* u+ [8 `2 o
GPT-for-E-Commerce/test-v1.1.jsonl at b6dd9d018dce670efd28448dbd0dde0edecb3e42 · Royce17/GPT-for-E-Commerce · GitHub! j8 K) g" k: I( d/ R$ e
finetune-with-openai/faq.jsonl at 334a69224d7e87a92de09b0d627f616be4ffa43a · A-baoYang/finetune-with-openai · GitHub, x" d; m2 B" l
要微调的效果好,就要使用更多高质量的示例进行Fine-tuning,我们应该如上面链接例子一样,提供至少几百个高质量的示例,而且最好由专家审查过。" e5 S8 u0 }: |2 m4 D9 i
0 F0 f# S, o$ `  m& |
二、在Prompt中带入知识- Y  `' h5 ^4 B7 s% q/ ^
只需设计恰当的输入,就能让ChatGPT在上下文中生成有价值的答案,而无需修改模型的结构或参数。
& Q$ A+ S' N  ]" ?( d# @0 U8 ]7 }: n
输入问题时,还可以引入相关知识,使问题更加全面。这种方法的局限性在于每次输入的长度有限。
" T! P4 f' @2 w9 D! p$ a; n. o$ s- y% O0 b1 i
下面是一些例子:
) N7 ]5 ]5 |% N6 C2 t7 F5 }
8 D4 ?$ w. F8 Z例1:作为专业DBA,回答SQL相关问题5 U. `/ `8 U* d
这里在输入问题时,引入了我们的数据库表结构这个专业知识。
( K$ J6 u+ b! H0 v9 R
/ @3 H$ Y( }' [2 g- m' Y% l# `问:
- T! k1 j+ y- }7 v+ e9 @' H& I( f; K
! i. a* T( V" \" R我要你扮演一个专业DBA。我将提供给你数据表结构以及我的需求,你的目标是告知我性能最优的可执行的SQL语句,并尽可能的向我解释这段SQL语句,如果有更好的优化建议也可以提出来。# _- M3 R$ G: M
; C4 M2 }+ m" z: N$ M0 z0 r0 ?0 d% L
我的数据表结构为:
4 x' s: ~+ Z9 i. \3 t) v8 s8 ^
& W& s5 \: L. Z# RCREATE TABLE `user` (
3 B4 e  a- q/ @/ Q, |# o$ s/ e: k`id` int NOT NULL AUTO_INCREMENT,
( N4 u+ p  Y" R8 }, Q# F  H* S2 Z`name` varchar(255) CHARACTER SET  utf8mb4 9 X' e/ a2 L# n& D! M
      COLLATE utf8mb4_unicode_ci
  E. R2 T% U* @5 a6 f" b7 B+ [- r      NOT NULL DEFAULT '' 5 N5 l& w2 B  v2 n
      COMMENT '名字',# g$ o1 l8 e/ y+ F
PRIMARY KEY (`id`)* g! [- t  j) ~3 k4 n
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
0 N2 {5 u  @7 [$ T; m& J      COLLATE=utf8mb4_unicode_ci
/ ]' C/ l; U  I% E9 V4 r      COMMENT='用户表';2 E0 m# V- r! `) P$ Q, t+ O' V# G  j! b
我的需求为:根据用户的名字查询用户的id
% D( D2 x( C* F8 \4 [1 I: V
3 C/ w5 M4 i9 `6 R4 u9 z回答
3 d. h2 r1 z3 R" N& \, w& E
7 ~, l4 {% R% Z9 b0 y# m好的,根据您提供的数据表结构和需求,可以使用以下SQL语句来查询用户的id:
# t  I3 t0 c, F! l& G/ j: h+ K3 X% ~0 \5 L
SELECT id FROM user WHERE name = '用户的名字';. \! k& C3 C. h7 ?( b3 t8 I  x
这条SQL语句将会在用户表中查找指定名字的用户,然后返回该用户的id。为了进一步优化查询性能,您可以在name字段上创建索引,这将会使查询更快速地匹配到所需的记录。" l' L7 S$ p7 x$ m5 P# }$ U

) V3 Q  B9 @* y- a2 P您可以使用以下SQL语句来为name字段创建索引:
: y# F+ c2 Z7 v' L( O& J5 K: a2 c: a' w2 e" p
ALTER TABLE user ADD INDEX name_index (name);+ J! }5 B5 }3 C; g  o) B* G
此外,为了保证查询的效率,您需要注意以下几点:
8 S/ H/ m6 U" v8 G. O; ~3 V& ~2 w' |; N* |3 D0 F( z
数据表的数据量过大时,查询的速度可能会变慢。如果您的数据表中包含大量的数据,可以考虑对表进行分区或分表。
0 V0 U* ~7 F  p) E* z" `9 c2 }8 L: Q: q8 g) B
如果您的查询需求经常变化,您可能需要对数据库进行优化。可以通过监控数据库的性能指标,识别哪些查询最耗时,然后对其进行优化。
/ F5 U3 j8 g, W8 o0 }( k/ b
9 d& h" `; N) C& B% S4 Z; d例2:智能客服
/ E  L, R; R1 P* Z5 v8 |比如我们要做智能客服,有一些客服准则(ChatGPT做智能客服的十条服务准则 ),对于OpenAI的API来说,要注入的知识如下链接:
0 \7 g/ w: S1 u7 v) m) a- u9 Y: ]' U3 }8 u) R" W/ X6 n' [
lanying-connector/openai-xiaolan.json at master · maxim-top/lanying-connector · GitHub( g& S1 t* P/ O9 Q. a( ~

2 \9 r& Y9 f2 u1 I下面代码通过消息对象的数组注入了一些上下文知识。
% t/ y$ _1 x+ o, c# F9 ]) c0 c% T; U  \/ ^5 @
: h3 H3 t* J" X4 B! Y
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work7 \% j: L; c2 i
import openai' C9 L" T, E, ]
% ^+ I; |$ Y4 l9 J$ O3 V, o6 ]0 W) F
openai.ChatCompletion.create(
) M5 l' u4 H7 _& v! y7 ?; C  model="gpt-3.5-turbo",0 L* ?% p4 D! R8 J9 ?  c; k
  messages=[$ p0 k* w: M2 ?% L5 E% [+ w2 b9 h8 M
        {"role": "system", "content": "You are a helpful assistant."},
7 v+ v! u2 B! l3 K; m/ d" ?        {"role": "user", "content": "Who won the world series in 2020?"},
" q* ]$ X2 |2 Q& X& a7 k        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},, [0 E7 h- j- }+ S2 ^( M+ p; \
        {"role": "user", "content": "Where was it played?"}8 e& y! B" w& O. J9 X! ^! [2 W
    ]4 q' r. q7 ]* _7 K; G5 i
)2 c* j, U. k! E$ G/ \: I$ |6 t
! W+ O+ Q- s0 }% W1 U3 X
其中4 M' ~/ q4 G4 @8 R( D( r
$ K0 J3 e: ?4 x( s
系统消息(system)有助于设置助手的行为。在上面的例子中,prompt被指示“You are a helpful assistant.”。, s9 p2 {" p, Y' {& a- i( f
用户消息(user)有助于指导助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。在上面的例子中,用户的最后一个问题是“在哪里比赛的?” 就是通过提前设置的对话消息来帮助回答。由于模型没有过去请求的记忆,因此所有相关信息必须通过对话提供。如果对话无法满足模型的token限制,则需要以某种方式缩短。
+ U/ c' E# L( J  ~助理消息(assistant)有助于存储之前的回复。它们也可以由开发人员编写,以帮助提供所需行为的示例。
4 _8 h' [9 {+ v$ [通过上面的方式就可以完成专业领域知识的注入。
2 r! c7 V# f: Q' J- m7 s
3 M4 h  G& G  b2 K: i例3:通过外部链接把内容带入
9 k1 K6 `6 h$ O; i9 V: r7 e下面只包含我们发起的对话部分,会话结果比较长,省略了:$ B5 g2 U- k5 A2 i( C. S
" v9 t" F& D3 O" x
User : 您是一个金融专家,我会向您发送微软的年度报告,并在我向您发送链接后反馈给我微软10个利好和10个消极因素。你明白吗?2 E' p, T& O9 L2 c$ a, R
...
" j! ^, l& Y. F" A5 q3 wUser : Microsoft 2022 Annual Report
+ \7 D2 a3 h. p- `2 Z+ b...) Y# G, x4 I9 O6 q) `
User : 我会把Nvidia最近的财报链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?  V. I: |& ?/ g2 S2 v- x
...+ n/ V% g; I" v- D
User: NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2023 | NVIDIA Newsroom: v0 d% }# G1 ?2 B
...
; R% J) Y. d) ZUser: 您能否从Nvidia的报告中提供更多财务见解?
) Z  Y# |! K0 F, F. J...7 r& |5 I; ]) X
User: 我会把戴尔最近的财务报告的链接发给你,你能反馈我和上面微软类似的答案吗,你明白吗?% O& a" _/ n9 Y) m2 |
....# n( Y0 J9 {) j# @" ~

, P8 w$ Z" I- p" rUser: 比较微软、英伟达和戴尔,用表格对比下他们的资本支出、运营支出、收入、利润率和利润率百分比。
6 |2 r9 c( {/ l0 d& S...* s  Y' M& \! {' P+ y" c' x" H
User:预测下戴尔未来12个月的现金流。0 A+ L' C6 x& Q( z# f5 C
6 C4 I, E" r- N
这种方式要确保链接可以被GPT访问到,外部链接持续稳定的可访问是必须考虑的问题。
2 U& ^9 B* e# \/ ~! E8 f
" ?% x/ ~+ u1 b) ]( H; F适用场景对比  o  K  M2 \  @# L: L
价格对比/ K8 F0 I% w: |+ |# c. P: O
OpenAI的相关报价看: Pricing9 \9 j+ }( l3 Z4 v+ K  b6 L

& V4 R" F! n9 M  W& p; \对话类:GPT4远远高于GTP3.5。
" E* c1 r" }$ }2 Q OpenAI的相关报价.png + d1 ~! j# W0 P8 v, D2 ?5 w

+ k- I7 j% N% j) d" P" M( X+ B3 P7 Y
; H5 Q$ N( C. s- H目前提供的可微调的这几个模型:Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型,其中,Davinci 是最强大的模型,成本也最高,而 Curie 又比 Babbage 功能更强大(且成本更高),依此类推,这些名称是相对的。. T. @, ~" D4 Z, s- c4 B

8 x2 V7 j3 Z( z* s& H4 K+ Y
0 a9 z- A. e$ l6 _ Ada、Babbage、Curie、Davinci 均是原始的 GPT-3 基本模型.png
! H; C# j$ z( k) a- `
; g4 p# g2 E( t- \7 ]8 J ) |5 L4 e1 @1 M! l6 k' K& l9 _

8 Y; C. I7 n7 u1 G5 KGPT3.5 和 GTP4 由于目前没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。% C; v7 x4 s; ~. ?% }7 T

: w( ^- R8 M7 F3 }' C而 Davinci 的 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。
) ]8 q$ S4 C3 Y5 `5 B; K! d' }+ U6 Z- o. X& W- M
所以目前阶段还是用在Prompt中带入知识方案比较合适,后续等对应的微调模型出来后,可以切换过去。
7 r0 o& L1 y' a/ ^/ K: ]' g( D4 a- H' A5 A$ e% P  f# k( R
长度问题+ K2 w0 a) s8 x" `4 T' h
ChatGPT的API当前是无状态的,需要自己维护会话状态和保存上下文。这可能会导致请求内容越来越大,带来高昂的费用。, Q/ |  }* l0 O0 t
# u, F" [5 j6 t5 X
但是,你可以借助OpenAI的embedding模型(https://platform.openai.com/docs ... what-are-embeddings)和本地数据库,以更智能的方式维护上下文,并且节省成本。& F0 D8 f& D, I0 D; j! C# G& n

; b, a# ]4 S, K. I首先,将文本资料准备成易于处理的格式,并且分成小块(这是OpenAI embeddings模型的输入长度限制)。接着,利用程序调用OpenAI embedding的API将这些文本块转换成数字向量,并且将结果保存到本地数据库中。(注意,为了能够反向获得原始文本,需要将原始文本块和数字向量一起存储。)) q) x, z3 l/ Z5 p
, N1 l5 r) @# t( B
当需要搜索的时候,将搜索关键字转换成数字向量,并且在本地数据库中进行检索。结果集将根据匹配相似度进行打分,分越高表示越匹配。这样,可以按照匹配度倒序返回相关结果。
0 D1 J3 x1 v- X. @7 B! \
* w) U4 Y6 J2 E聊天场景下,当用户提问后,需要先把提问内容关键字搜索到一个相关结果集(可以本地检索,也可以通过OpenAI embedding接口获得向量后比较相似度)。然后根据拿到的结果集,将结果集加入到请求ChatGPT的prompt中。! g. u- k4 g' x" b. d

" |& J8 F0 n# w% f1 x9 I- I比如说用户提了一个问题:
1 K. B7 x8 [" L. P8 j0 o) A/ m6 P3 b' t2 E6 v
“What's the makers's schedule?”
0 B) t2 K( l0 e" d3 i8 y& R* T/ `$ u+ l7 r4 M
从数据库中检索到相关的文字段落是:# I* w7 C4 b1 e8 E" i
) Z1 t, k" U( H9 L" \. e
“What I worked on...”7 N5 E' V4 [/ }
"Taste for Makers..."4 x% f- j/ h+ z
# j! Y" F5 W) x  Y) d' a; n5 l
那么最终的prompt看起来就像这样:
) E* A+ u7 b4 y+ p, X
7 L( i) J. |$ p * Z3 @' h$ K- \
[
! @, y! @  H: I3 e+ l; E/ i- z( B  p {
/ }' W$ B+ D  C7 G% C* ?$ q$ t" _  role: "system",
! p3 P/ n! }7 V) F! w+ \+ e  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."7 {: A% W" N# g. z, A5 G
},: V8 E4 Z1 s: Q' g4 ]4 s
{0 m" L7 o2 T: C5 P" M
role: "user",
1 N" O! ~+ ]2 G  I content: `Use the following passages to provide an answer) K9 @6 _6 y0 r) T- w7 j* n% O
to the query: "What's the makers's schedule?"& m$ C3 {# L. }9 r3 C
1. What I worked on...
% n& u2 N4 c& {0 o2. Taste for Makers...`) T2 e+ I' U8 e1 ]4 i/ N
}
( Z7 G4 R; |7 \: ]% O]
/ J4 [. d3 o3 |* a
3 T/ f3 e  F+ e5 K/ X* n7 Y1 M, {1 v5 d$ b" p
这样ChatGPT在返回结果的时候,就会加上你的数据集。: z! W' N0 F  h
' w9 T, p2 X: d! q: P& I$ R
具体实现看: GitHub - mckaywrigley/paul-graham-gpt: AI search & chat for all of Paul Graham’s essays.! `7 S4 @/ U; e5 e8 e

  i9 P! K4 P9 r% i- @总结: U7 a; E- O4 A9 D4 F' G
大模型的可能性真的非常多。想象一下,如果你将自己的思想和博客输入大模型,你可以训练出一个包含自己想法的模型。这个模型可以被定位为模仿人进行交流,最终创造出一个虚拟的你。对于专业领域的KOL(关键意见领袖)来说,这种方法非常有用,因为粉丝可以直接针对他的思想进行提问和交流。/ y$ i! J9 u2 V. k% {3 C$ u

4 b) i- h% T( U0 [1 B" e而对于不善写作的人来说,也可以将自己的想法以简单的问答对的形式输出,训练出一个专属机器人,再利用大模型的语言和逻辑能力来撰写包含自己思想的文章。这种方法非常值得尝试。( H5 z- S9 J; e' t- f

- S- [$ O% @9 ]- ^参考9 A8 s6 E7 Q/ ~, Q/ {8 U( r
如何用 ChatGPT 构建你的专属知识问答机器人 如何用 ChatGPT 构建你的专属知识问答机器人 - Frank 的个人博客
6 l6 t( l! h% |1 z5 ^  F3 j
: K4 @; }4 C# {* D5 n搭建基于知识库内容的机器人 搭建基于知识库内容的机器人 | Learning Prompt2 C2 y' h0 M5 B2 u; l: ~

! v9 ?; L; Y8 \1 T* E( I1 c% u5 l5 B! X2 M1 [
————————————————
: L# X, E/ ~" A2 _版权声明:本文为CSDN博主「蝈蝈俊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 j: p: M6 B6 a& ?1 f, k( ?+ H
原文链接:https://blog.csdn.net/ghj1976/article/details/1296761576 T; g/ ]0 ~) ?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-11 12:23 , Processed in 0.151438 second(s), 3 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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