RAG(Retrieval and generation)技术可以让LLM(Large Language Model)从额外的知识库中提取信息并回复我们的prompt,虽然该技术已经很成熟了,而且市面上也有很多打包好的工具,但并不影响我炒一盘冷翔。于是今天我们一起来做一盘。

理论

1. 碎碎念

纵然大模型在LoRA家族的加持下已经可以在单机上实现fine-tune,但是对于家境贫寒的工程师来说掏出一万五千块钱上4090,还是太过潇洒。于是为了扩展大模型的知识可以用更廉价的方式——RAG,它整个思路是比较直白的,就是把与我们的问题相关的内容一起作为prompt提交给大模型,利用大模型的逻辑能力将文本信息解构、抽象并组织成问题答案。当然它的另一个主要优势是安全!对于隐私数据,比如公司内部信息,无法作为训练数据提供给公共大模型,我们又想利用公共大模型的能力,也可以利用RAG技术作为补充。

2. 流程

想象这么一个场景,我们询问大模型李宁是哪一年出生的,很显然大概率它是不知道的,然而他会胡说八道,瞎编一个答案。RAG的思路是把李宁生平简介作为附件信息提供给大模型,还是先上个流程图吧。

大概的整个过程应该这样的,我们提供的附件文档李宁生平简介 (可能是好几个文档,可能分成了上中下三部曲):

  1. 分块
    • 往往整个文章的内容是比较多的,跟我们的问题“出生信息”相关的内容可能在某一段落,显然并不需要对整个文档进行embedding,找到相关的段落就可以了,于是我们对文档进行拆分,将文档分解成更短的段落。
  2. 段落embedding
    • 对每个段落执行embedding操作获取该段落对应的低纬绸密vector,比如sentence-transformers/all-MiniLM-L6-v2会将文本map到768维的向量空间中。(embedding可以理解成信息抽取工具,它会把段落的信息压缩到向量空间中一个点,越相似的内容在空间中距离就越近)
  3. 存储到Vector DB
    • 为了便于信息检索,也为了持久化这部分信息,会把段落和对应的向量存储在向量数据库中,跟传统关系性数据库功能一样,向量数据库也是用来增删改查的。
  4. 找到最相关的TOP n段落
    • 我们提供的原始prompt也会通过embedding服务得到一个向量,通过这个向量我们可以从数据库中找到跟这个问题最相关的TOP n个段落。
  5. 组合prompt
    • 把我们原先的prompt和最相关的几个段落组合起来,就是简单的组合起来,所以我们看到流程图中新的prompt变大了,没错,他就是物理意义上变大了,就像后面的大模型的图标,它就是物理意义上大。

将上述重组的prompt交给大模型就可以了,经过我上面的阐述,我相信你已经理解整个过程了吧,如果不理解,其实也没关系,咱们还是来codding吧。

Coding

这里大模型我们采用shenzhi-wang/Llama3-8B-Chinese-Chat,model card在这里:https://huggingface.co/shenzhi-wang/Llama3-8B-Chinese-Chat

原始的Llama 3模型对中文支持不是很好,Llama3-8B-Chinese-Chat对中文环境进行了fine-tune,咱们就用它来演示。

1. 初始形态

开始之前,我们先来问几个关于李宁的问题,留个证据~

message = [
    {'role': 'user', 'content': '请回答我的问题,如果你不知道请直接回答不知道。\n\n请问李宁是哪一年出生的?\n\n正确答案是:'},
]
input_ids = tokenizer.apply_chat_template(message, add_generation_prompt=True, return_tensors='pt')
outputs = model.generate(
    input_ids,
    max_new_tokens=128,
    do_sample=True,
    temperature=0.6,
    top_p=0.9,
)
response = outputs[0][input_ids.shape[-1]:]
print(tokenizer.decode(response, skip_special_tokens=False))

我这边输出的答案是:

回答错误,应该是1963年。还问了一个问题:李宁公司上市了吗?模型的回答:李宁公司在2004年成功上市在纽约证券交易所(NYSE),股票代码为2339.HK。时间对的,但是是在港股上市的,生成的股票代码竟然加了HK~

我在百度百科上收集了李宁的简介,“人物经历”这一段的所有文本信息放在了lining.txt(引用1)文件中,中间的换行符我也给删除了,角标~形如$^{[1]}$都去掉。

早年经历1963年,李宁出生在广西柳州一个普通的老师家庭,祖籍来宾市兴宾区南泗乡,半岁时回到南泗乡跟随爷爷奶奶生活,5岁多才离开。 李宁的家庭并非运动世家,当音乐教师的父亲最初想把儿子培养成声乐人才。7岁时,李宁声带损伤,在休养声带过程中迷上体操。因家中生活条件一般,李宁从小就会张罗家里的事,训练出一种责任感。8岁时,从小喜欢“翻跟头”的李宁开始接受系统的体操训练。 1971年,进入广西体操队。1973年,获得全国少年体操锦标赛自由体操金牌。1977年,获全国青年体操锦标赛自由体操亚军。1980年,获运动健将称号,入选国家体操集训队。  李宁的特点是不放弃、够坚韧、技术好、心态强。他将此归功于教练和父母:“我父亲比较潇洒、乐观,我母亲比较瘦小,却扛起一个家,我遗传了他们的乐观和责任。” 运动生涯初露锋芒进入国家队后,李宁得到在更多舞台展现自己的机会。1980年,全国体操锦标赛,李宁获自由体操亚军、个人全能季军和吊环季军,这是他首次获得全国锦标赛奖牌。 1981年,李宁收获满满,在全国体操分区赛南宁赛区比赛中,包揽个人全能、鞍马、吊环、双杠和单杠五个冠军。第11届世界大学生运动会,独得自由体操、鞍马和吊环三项冠军,帮助中国体操队获得团体季军。在这一年的中美体操对抗赛上,李宁获全能、吊环和跳马三项冠军。第21届体操世锦赛,李宁帮助中国队获得团体季军。 一鸣惊人1982年,第六届世界杯体操锦标赛,一人独得个人全能、自由体操、单杠、吊环、鞍马、跳马6枚金牌,成为中国在一次世界体操比赛中获金牌最多的运动员,开创世界体操史上一人一次比赛夺冠最多的新纪录,被誉为“体操王子”。1982年,第9届亚运会,获体操团体、全能、鞍马、吊环冠军、双杠亚军。 1983年,第二十二届世界体操锦标赛,作为主力队员,帮助中国队首次获得男子团体冠军,他自己获得个人跳马亚军和自由体操、吊环季军。  闪耀1984年奥运会1984年,参加第二十三届奥运会,迎来运动生涯巅峰。中国体操队在男子团体和全能比赛中失利,未获得金牌,全队蒙上了一层阴影。8月4日,奥运会体操比赛进入第6天,李宁一扫前几日阴霾,为中国队打开胜利之门。  在自由体操项目中,李宁获金牌,共有4个裁判为他打出10分满分。鞍马比赛中,李宁再次得到10分,最终收获金牌。吊环比赛,获得最高分摘得金牌。成为中国第一个在奥运会上一日夺得三枚金牌的运动员。当五星红旗冉冉升起时,李宁为了不让泪水夺眶而出,闭上了眼睛,这个形象成为许多人心目中不可磨灭的回忆。跳马比赛,李宁获得银牌,全能比赛,获得铜牌,帮助中国男子体操队获得团体银牌。这届奥运会,李宁获得3金2银1铜共6枚奖牌,是该届奥运会8000多名运动员中获奖牌最多的选手。  李宁回国后享受到国民英雄般的待遇,敞篷车载着他和队友在南宁市游行,接受万人空巷的欢呼与赞誉。多年后,李宁在央视节目《开讲啦》回顾这段历史: “奥运金牌的价值远超过它本身的价值,当时国人都把我们当做英雄,我们的成就也是民众的成就”。李宁也感慨道,“这样的人生不会有第二次,值得!” 延续辉煌属于李宁的辉煌还在继续。1984年,获美国杯体操赛自由体操、鞍马、吊环、跳马冠军。同年,获得东京杯体操邀请赛自由体操、吊环、跳马冠军。1985年体操世锦赛,获得吊环冠军,鞍马、团体亚军,自由体操季军。 1986年体操世界杯,获得全能、鞍马、自由体操三项冠军和吊环季军。1986年罗马体操大奖赛,包揽个人全能、自由体操、吊环、跳马、双杠、单杠六项冠军。 1987年体操世锦赛,获得团体亚军和吊环亚军。1987年世界大学生运动会,获得个人全能、吊环、团体三项亚军,自由体操、跳马、双杠三项季军。 1987年,成为国际奥委会运动员委员会亚洲当时的唯一委员。折戟汉城奥运1988年,带着“体操王子”光环的李宁出征1988年汉城奥运会,令人意想不到的失误接踵而至。吊环比赛,他的脚挂在吊环上;跳马比赛,他重重地跌在地上。在观众的惊叹声中,瘫坐在地的李宁发出无奈的笑,引来国内一阵口诛笔伐。4年前还是全民偶像的“体操王子”被复杂的目光重压,甚至有愤怒的观众给他寄来刀片。由于资讯匮乏,人们并不知道当时的李宁已满身伤病,只是中国体操队青黄不接,他不得不继续挺身而出。 宣布退役1988年底,李宁宣布退役。退役时李宁说:“无论我将来走到哪里,无论我做什么,都不会离开体操,离开体育。” 在运动生涯中,李宁先后参加60余次重大国内外比赛,获世界冠军14个,国际国内金牌106枚。他独创动作“鞍马正交叉转体90度经单环起倒立落下成骑撑”、“吊环吊臂前摆上成支撑”、“吊环支撑后翻经后悬垂前摆上成支撑”、“双杠大回环转体180度成支撑”,分别被国际体联命名为“李宁交叉”、“李宁摆上”、“李宁正吊”和“双杠李宁大回环”。   退役后获高度评价1999年,国际体育记者协会评选出25名“20世纪最佳运动员”,作为唯一入选的中国运动员,与“球王”贝利、“拳王”阿里、“飞人”乔丹相比肩。李宁在获得这项殊荣时说:“20世纪是不平凡的世纪,我们的祖国发生了翻天覆地的变化,而我有幸作为中国体育界的一员向世界证明这种变化,我感到无比的骄傲和自豪!” 2000年,李宁入选国际体联体操名人堂,成为中国体操史上第一人。 2019年,李宁被任命为中国奥委会委员。 裁判经历1989年,考取体操国际裁判证书。从1991年美国印第安纳波利斯世锦赛到2000年英国格拉斯哥世界杯总决赛的十年间,李宁执法了历届世界体操大赛。 1996年,担任奥运会体操比赛裁判。2000年悉尼奥运会,担任跳马比赛裁判长。对于裁判工作和身份转变,李宁说:“自己的主要任务,是给所有象他当初那样想表现的运动员创造更好、更公平的表现环境。”  担任北京奥运火炬手全民猜想谁来点燃奥运圣火,是2008年北京奥运会开幕式最大的悬念。为解开这个巨大的谜,曾为之展开了全民大猜想。刘翔、姚明、桑兰、许海峰、何振梁、邓亚萍、伏明霞、杨扬、张怡宁……似乎都有理由,似乎谁都合适。 李宁最终脱颖而出, 北京奥运会开闭幕式总导演张艺谋解释了选择李宁的原因:“选择已经退役的李宁是有特殊要求的,首先他要在高空做高难度动作,需要训练很长时间,我们不大可能邀请一位正在准备参赛的现役运动员来做。其次,此人要获得过崇高荣誉,兼具体操技能方面的基础。空中的转身、横着走都要经过特别训练。经过国家体育总局的推荐,我们最终确定了李宁。” 李宁的启蒙教练梁文杰在开幕式前曾预感到,爱徒李宁将点燃主火炬:“李宁的优势很明显,他是奥运冠军,人品和对中国体育的贡献,都有目共睹。他做出了自己的品牌,影响力遍及全球。他一直热心公益事业,对社会的贡献,在运动员中几乎无人能比。” 因奥组委有严格的保密要求,梁文杰没有向李宁求证,李宁也守口如瓶。2008年8月7日,梁文杰来到北京,李宁没有出面接待,他打电话抱歉地告诉梁文杰:“这段时间太忙,有任务在身,等以后忙完了,再好好地招待您老人家。”李宁一向视梁老如亲父,对于这样的“慢待”, 梁文杰不怒反喜。李宁的反常举动,让梁文杰认定,点燃主火炬台的必定是李宁。 秘密训练北京奥运的主火炬手在2008年7月份才定下来,为完成这个光荣的使命,李宁和相关人员付出了很大的努力。射击传奇名将许海峰原本也是候选者之一,但由于无暇训练等原因没能成为最终的火炬手。除李宁外,跳水名将熊倪也是候选人之一。 李宁飞天动力的设计研究团队,是总装备设计院,曾负责"神舟六号"发射塔的开合设备。为做好点火动作,李宁足足训练一个月,包括香港著名武术指导程小东在内的专家组指导他进行训练。飞天点火,用一条钢丝在腰部绑住吊起来,然后在半空中做跑步的运作,整个过程长达3分多钟。“空中跑步”时,完全没有着力点,李宁要用腰力做动作,还要看起来流畅,相当吃力。每次李宁被吊到半空训练,练完后站也站不住。 开幕式总导演张艺谋说:“李宁特别的努力,每天晚上基本上都是凌晨一点钟‘上班’。”李宁在空中“行走”五百米,一圈耗时3分零10秒,转完一圈下来要休息一个小时才可以上第二次。张艺谋赞叹说:“我们下班以后天都亮了,还看到他在空中练习的身影,我们都被他感动了。” 为了保密,李宁连妻子也瞒住,只说参加开幕式表演。 克服恐高鲜有人知,李宁恐高。10岁时爬房顶,别人接二连三往下跳,他抑制不住地颤腿、哆嗦。见墙边有根绳子,他紧紧抓住下滑,粗绳划裂皮肉,食指、中指等几根手指上几道疤痕,至今清晰可见。 在“鸟巢”训练时,李宁升上50米的高空腿就发软,前三天都不敢动。一个月清场训练,深更半夜并不算热,可第一趟、第一圈下来,李宁被吓得身上衣服全被汗湿透。为克服恐高,李宁让自己始终保持眼神聚焦,不去看别的地方,把所有的注意力和视线,都紧紧盯住自己伸在前方举着火炬的手看。 除恐高外,“风”也是一大难题。李宁需要训练在靠近圣火坛点火口的时候拿稳火炬,因为每次都会有风从不同的方向吹过来。 对于点燃主火炬,李宁说:“其实很多人都胜任做这个事。许海峰、熊倪,包括李小双。落在谁的身上,都是光荣。我不敢私吞这一份光荣,我把它当作我们所有运动员的光荣。” 点燃奥运圣火2008年8月8日晚,北京奥运会开幕式,奥运圣火经过许海峰、高敏、李小双、占旭刚、张军、陈中、孙晋芳的手手相传,“体操王子”李宁的出现引爆全场的最高潮。 在“鸟巢”的中央,李宁高举火炬腾空而起,在体育场上空的“空中跑道”上奔跑起来。与此同时,一幅中国式画卷沿“空中跑道”徐徐展开,“祥云”背景的画卷上呈现出奥运圣火在各地传递的动态影像。“空中飞人”李宁来到主火炬塔旁点燃引线,喷薄的火焰沿火炬塔盘旋而上,滚滚翻涌的奥运圣火,把体育场的上空映照得一片辉煌,全场为之沸腾。 承载这样光荣而艰巨的任务,李宁坦言有些紧张:“这是中国几代体育人和中国13亿人民的共同期望,成功点燃奥运火炬意味着中国的百年奥运梦想终于成真。” 从商之路加盟健力宝集团1988年李宁退役后,广东健力宝集团总经理李经纬邀其加盟。1988年12月16日,在健力宝赞助下,李宁在深圳体育馆举行了盛大的告别晚会。当时李宁面对多个出路,李经纬对他说:“你搞体育不能光靠别人赞助,为什么不可以自己做出一个体育企业来?” “李宁牌”诞生加盟健力宝几个月后,李宁向李经纬提出,想办一家体育服装厂。在创办资金上,此时已财大气粗的健力宝本可以以投资者身份出现,但李经纬建议李宁:"如果能够引入外来资金,就不要全部用健力宝的钱。" 李经纬陪同李宁出外游说,寻找投资。因为健力宝和“体操王子”的双重名人效应,一家新加坡公司同意出资。1990年,由三方共同投入的中新(加坡)合资健力宝运动服装公司挂牌成立,其中健力宝出资1600万元,由李宁出任总经理,其服装品牌则被命名为“李宁牌”。 1990年,第11届亚运会在北京举行,李宁以250万元拿下亚运会火炬接力传递活动的承办权。整个亚运圣火的传递过程,有2亿人直接参与,25亿中外观众从新闻媒体知道了健力宝和“李宁牌”。1990年8月,在世界屋脊青藏高原,李宁作为运动员代表,身穿雪白的“李宁牌”运动服,从藏族姑娘达娃央宗手里接过亚运圣火火种。 1992年,“李宁牌”装备被选为第二十五届巴塞罗那奥运会中国代表团指定领奖服装、领奖鞋,结束中国运动员在奥运会上使用外国体育用品的历史。当中国奥运体育代表团穿着“李宁牌”运动服出现在开幕式上时,李宁流下眼泪说道:“那一刻,我体会到此生最大的荣誉,那种成就感超过了我以前所获得的所有奖牌的总和。” 几乎是一夜之间,“李宁牌”声名鹊起,很多人都穿上“李宁牌”运动鞋服,拥有一双李宁球鞋成为时髦的象征。 脱离健力宝通过奥运会的亮相,“李宁牌”和耐克、阿迪达斯这些运动品牌巨头们“同场竞技”,李宁认识到未来对手的强大。1994年初,李宁请北京的股份制改造专家刘纪鹏为公司做未来的规划。刘纪鹏在为公司做诊断时指出,公司产权不清,将对今后发展带来致命的负面效应,劝说李宁脱离健力宝。  在李宁心中,李经纬对他有再造之恩。对于刘纪鹏的建议,李宁问得最多的一句话是:"如果脱离健力宝,别人会不会说我忘恩负义?"出乎李宁意料的是,李经纬完全支持他自立门户。1994年底,健力宝运动服装公司从健力宝的母体上顺利脱身,集团历次投入的1600万元,李宁分3次用现金进行了偿还。1996年初,李宁将公司总部从广东迁到北京,并更名为“李宁运动服装公司”,彻底告别健力宝。 公司飞速发展1990年亚运会闭幕时,摆在李宁面前的订货单价值1500万元。初战告捷的李宁公司发展迅速,从1993年到1996年,营业额以超过100%的速度增长,1996年,创下6.7亿的历史销售收入纪录。 1998年,在公司发展的井喷期, 35岁的李宁卸下公司总经理职务,进入北京大学法律系学习,4年间他与一群比自己小10多岁的同学一起上课、记笔记、熬夜复习、参加考试。 2002年,李宁公司确立全新品牌定位:“李宁,一切皆有可能。” 香港上市2004年,李宁公司在香港成功上市,成为中国第一家在海外上市的体育用品企业。李宁家族控制46%的公司股份,其身价高达16亿元。上市当天,李宁面对媒体说:“我不是一个明星偶像,我只是一个拥有十几年企业经营史的企业家,一个商人。”  李宁公司在产品设计上充分利用“中国元素”,从2005年开始,在篮球广告中打出中国功夫符号,在轻质跑鞋广告中使用水墨色调,在香港回归十周年时推出“I Love HongKong”的纪念版球鞋,李宁牌限量版的“雷锋鞋”在网上被炒到天价。 逐鹿2008年奥运自1992年起连续四届,李宁公司成为奥运会中国代表团指定领奖装备赞助商,并前后携手中国体操队、中国射击队、中国跳水队、中国乒乓球队、中国羽毛球队等国家运动队,成为赛场装备指定合作伙伴,伴随中国运动健儿征战国内外赛事。 2001年7月13日,北京获得2008年奥运会主办权,在北京奥运会赞助商竞争中,阿迪达斯凭借雄厚的财力优势胜出。但李宁的奥运战略并未走进死局,他在后来使出的一系列组合拳充满了中国式的智慧。 早在2006年,李宁与中央电视台奥运频道签约,为所有主持人、记者量身打造专业服装。在2006年多哈亚运会上,这种合作便已出现。北京奥运会期间,李宁品牌logo通过央视奥运频道的转播出现在亿万观众面前。有媒体盛赞:“这是一个精彩的擦边球,足以视为奥运经济中最为经典的案例之一。” 扭转局面2008年,借助奥运会上的强效传播,李宁公司开始迅速扩张。李宁产品打败国际知名品牌,一度成为国内市场营销额冠军。2010年,李宁公司口号由“一切皆有可能”转变为“让一切改变”,并配合“90后李宁”广告主题,将90后定位为核心消费群体。随后李宁公司三次宣布产品提价,意图进军中高端市场。  2011年,李宁公司门店数量从5000家发展到8000家。同年,李宁公司跌落“国内运动品牌第一”宝座。2012年,李宁公司历史上第一次出现亏损,企业业绩继续恶化。 对于这场失败改革,媒体分析:一方面,李宁品牌的主要消费群里历来都是70后和80后,他们经历过李宁奥运冠军时代的辉煌,对于品牌拥有极高的认同和忠诚度,但是以90后为核心的年轻一代对于李宁本人相对陌生,自然对品牌缺乏认同感。另一方面,李宁公司贸然提价,抛弃此前高性价比的优势,在价格上虽可与耐克、阿迪达斯相媲美,但产品质量和口碑却存在差距。在中低价位产品上又让安踏、361度等本土品牌有了可乘之机,致使大量消费者流失。 财富中国500强榜单中,李宁公司在2010 年首次上榜时排名257名,2011年是297名2012年是381名2013年,李宁公司未能进入榜单。 2014年底,年过50的李宁在淡出管理层多年后重回公司,对于自己的“救火行为”,李宁说:“公司需要我,我就回来,毕竟我是创始人,又是大股东。”重新出山后,李宁重启口号“一切皆有可能”,向市场宣誓回归初心。 李宁将公司定位由“体育装备提供商”改为“互联网+运动生活体验提供商”,积极拥抱“运动+科技”的流行趋势。利用高速发展的互联网,公司开启“互联网+”战略。李宁本人开通社交平台账号,卖萌、写鸡汤、玩Cosplay,一年时间吸粉近两百万。 2015年,天猫李宁官方旗舰店销售额达到12.5亿元,双11活动当天,李宁品牌整体交易额超2亿元,两项数据均稳居国内运动品牌销售额榜首。 电商给了李宁公司新的生命力。2012年,李宁公司当年营收67.39亿元,净利润为-19.79亿元2021年,李宁公司营收为225.7亿元,净利润40.11亿元。2022年上半年,李宁公司营收124.1亿元,净利润21.89亿元。李宁对公司的提振效应立竿见影,他让公司抓住时代的脉搏,尝到了甜头。  打造“中国李宁”2015年,李宁刚刚回归,前几年持续低迷的李宁公司急需转型,李宁认为品牌离年轻人越来越远。为真正贴合年轻人的喜好和需求,李宁公司开始大量年轻消费者调研,品牌策略也有所改变,开始往更潮流的方向发展。 2018年,印有“中国李宁”四字logo的番茄炒蛋服装在纽约时装周出场,让“李宁牌”成为首个登上纽约时装周的中国运动品牌。一时间,“中国李宁”四个字反复在社交媒体上被传播。 [63-64]谈到为何会想到将“中国李宁”印在胸前,李宁表示,我过去比赛就是代表中国,介绍我的时候就说“China-LiNing”,没有别的任何多的语言,所以我们想能够把中国的文化、体育跟时尚结合,就像一个中国印章一样,写上“中国李宁”就够了。 纽约时装周的成功,让筹划已久的“中国李宁”加快从概念到可持续业务的演化,2018年6月和2019年2月,李宁公司接连登上巴黎时装周和纽约时装周,分别以“中国李宁”和“行”(古言“路虽弥,不行不至”)为主题。 2018年“中国李宁”服装系列总销量超过550万件,鞋系列销量超过5万件,新品售罄率均超过70%,在“中国李宁”系列的带动下,李宁公司2018年运动时尚品类的零售流水同比上升42%,领跑李宁旗下所有品类(篮球品类增速29%,训练品类增速20%)。 2023年6月20日,“中国李宁”在法国巴黎时装周正式发布2024春夏系列。

2. 分块 & Embedding

我这里简单且粗暴地把整个文件分成多个段落,每个段落1000个字:

sections = []
with open('lining.txt', 'r') as f:
    lines = f.readlines()
    line = lines[0]
    for i in range(0, len(line), 1000):
        sections.append(line[i:i+1000])
        
# Loading embedding model     
embed_model_name = "sentence-transformers/all-MiniLM-L6-v2"
embed_model = SentenceTransformer(model_name)

# Persisting
collection.update(
    documents=paragraphs,
    embeddings=embeddings,
    ids=[f"id{i}" for i in range(len(sections))]
)

3. 检索(Retrieval)

来到了RAG名字由来的第一个单词retrieval,就是在高纬空间中找到最邻近的几个点(你看一加入“高维空间”显得就特别高端,但凡跟理论物理沾边瞬间就不一样了),实际上就是在向量数据库中找到跟我们的问题(prompt/query)语义上最接近的的TOP n个段落,没错就是一行代码的事

# Embedding the query
query = "李宁公司上市了吗?"
query_embed = embed_model.encode([query])
# Retrieving,那一行代码~
relevant_top_sections = collection.query(query_embed, n_results=5)
relevant_content = ','.join(relevant_top_sections['documents'][0])

4. 生成(Generation)

上面已经把最相关的TOP 5个段落内容整合在一句话里面了,加上我们之前的问题,重新组成新的prompt,我这里prompt是这样的:

message = [
    {'role': 'user', 'content': f"请基于下列内容回答本段最后的问题,如果你不知道答案就回答不知道,请不要试图回答不知道的问题。\n\n{relevant_content}\n\n问题是:{query}\n\n正确的答案是:"},
]

关于“李宁公司上市了吗?”这个问题最终生成的prompt长这样

''请基于下列内容回答本段最后的问题,如果你不知道答案就回答不知道,请不要试图回答不知道的问题。\n\n几乎是一夜之间,“李宁牌”声名鹊起,很多人都穿上“李宁牌”运动鞋服,拥有一双李宁球鞋成为时髦的象征。 脱离健力宝通过奥运会的亮相,“李宁牌”和耐克、阿迪达斯这些运动品牌巨头们“同场竞技”,李宁认识到未来对手的强大。1994年初,李宁请北京的股份制改造专家刘纪鹏为公司做未来的规划。刘纪鹏在为公司做诊断时指出,公司产权不清,将对今后发展带来致命的负面效应,劝说李宁脱离健力宝。  在李宁心中,李经纬对他有再造之恩。对于刘纪鹏的建议,李宁问得最多的一句话是:"如果脱离健力宝,别人会不会说我忘恩负义?"出乎李宁意料的是,李经纬完全支持他自立门户。1994年底,健力宝运动服装公司从健力宝的母体上顺利脱身,集团历次投入的1600万元,李宁分3次用现金进行了偿还。1996年初,李宁将公司总部从广东迁到北京,并更名为“李宁运动服装公司”,彻底告别健力宝。 公司飞速发展1990年亚运会闭幕时,摆在李宁面前的订货单价值1500万元。初战告捷的李宁公司发展迅速,从1993年到1996年,营业额以超过100%的速度增长,1996年,创下6.7亿的历史销售收入纪录。 1998年,在公司发展的井喷期, 35岁的李宁卸下公司总经理职务,进入北京大学法律系学习,4年间他与一群比自己小10多岁的同学一起上课、记笔记、熬夜复习、参加考试。 2002年,李宁公司确立全新品牌定位:“李宁,一切皆有可能。” 香港上市2004年,李宁公司在香港成功上市,成为中国第一家在海外上市的体育用品企业。李宁家族控制46%的公司股份,其身价高达16亿元。上市当天,李宁面对媒体说:“我不是一个明星偶像,我只是一个拥有十几年企业经营史的企业家,一个商人。”  李宁公司在产品设计上充分利用“中国元素”,从2005年开始,在篮球广告中打出中国功夫符号,在轻质跑鞋广告中使用水墨色调,在香港回归十周年时推出“I Love HongKong”的纪念版球鞋,李宁牌限量版的“雷锋鞋”在网上被炒到天价。 逐鹿2008年奥运自1992年起连续四届,李宁公司成为奥运会中国代表团指定领奖装备赞助商,并前后携手中国体操队、中国射击队、中国跳水队、中国乒乓球队、中国羽毛球队等国家运动队,成为赛场装备指定合作伙伴,伴随中国运动健儿征战国内外赛事。2015年,天猫李宁官方旗舰店销售额达到12.5亿元,双11活动当天,李宁品牌整体交易额超2亿元,两项数据均稳居国内运动品牌销售额榜首。 电商给了李宁公司新的生命力。2012年,李宁公司当年营收67.39亿元,净利润为-19.79亿元。2021年,李宁公司营收为225.7亿元,净利润40.11亿元。2022年上半年,李宁公司营收124.1亿元,净利润21.89亿元。李宁对公司的提振效应立竿见影,他让公司抓住时代的脉搏,尝到了甜头。  打造“中国李宁”2015年,李宁刚刚回归,前几年持续低迷的李宁公司急需转型,李宁认为品牌离年轻人越来越远。为真正贴合年轻人的喜好和需求,李宁公司开始大量年轻消费者调研,品牌策略也有所改变,开始往更潮流的方向发展。 2018年,印有“中国李宁”四字logo的番茄炒蛋服装在纽约时装周出场,让“李宁牌”成为首个登上纽约时装周的中国运动品牌。一时间,“中国李宁”四个字反复在社交媒体上被传播。 [63-64]谈到为何会想到将“中国李宁”印在胸前,李宁表示,我过去比赛就是代表中国,介绍我的时候就说“China-LiNing”,没有别的任何多的语言,所以我们想能够把中国的文化、体育跟时尚结合,就像一个中国印章一样,写上“中国李宁”就够了。 纽约时装周的成功,让筹划已久的“中国李宁”加快从概念到可持续业务的演化,2018年6月和2019年2月,李宁公司接连登上巴黎时装周和纽约时装周,分别以“中国李宁”和“行”(古言“路虽弥,不行不至”)为主题。 2018年“中国李宁”服装系列总销量超过550万件,鞋系列销量超过5万件,新品售罄率均超过70%,在“中国李宁”系列的带动下,李宁公司2018年运动时尚品类的零售流水同比上升42%,领跑李宁旗下所有品类(篮球品类增速29%,训练品类增速20%)。 2023年6月20日,“中国李宁”在法国巴黎时装周正式发布2024春夏系列。2001年7月13日,北京获得2008年奥运会主办权,在北京奥运会赞助商竞争中,阿迪达斯凭借雄厚的财力优势胜出。但李宁的奥运战略并未走进死局,他在后来使出的一系列组合拳充满了中国式的智慧。 早在2006年,李宁与中央电视台奥运频道签约,为所有主持人、记者量身打造专业服装。在2006年多哈亚运会上,这种合作便已出现。北京奥运会期间,李宁品牌logo通过央视奥运频道的转播出现在亿万观众面前。有媒体盛赞:“这是一个精彩的擦边球,足以视为奥运经济中最为经典的案例之一。” 扭转局面2008年,借助奥运会上的强效传播,李宁公司开始迅速扩张。李宁产品打败国际知名品牌,一度成为国内市场营销额冠军。2010年,李宁公司口号由“一切皆有可能”转变为“让一切改变”,并配合“90后李宁”广告主题,将90后定位为核心消费群体。随后李宁公司三次宣布产品提价,意图进军中高端市场。  2011年,李宁公司门店数量从5000家发展到8000家。同年,李宁公司跌落“国内运动品牌第一”宝座。2012年,李宁公司历史上第一次出现亏损,企业业绩继续恶化。 对于这场失败改革,媒体分析:一方面,李宁品牌的主要消费群里历来都是70后和80后,他们经历过李宁奥运冠军时代的辉煌,对于品牌拥有极高的认同和忠诚度,但是以90后为核心的年轻一代对于李宁本人相对陌生,自然对品牌缺乏认同感。另一方面,李宁公司贸然提价,抛弃此前高性价比的优势,在价格上虽可与耐克、阿迪达斯相媲美,但产品质量和口碑却存在差距。在中低价位产品上又让安踏、361度等本土品牌有了可乘之机,致使大量消费者流失。 财富中国500强榜单中,李宁公司在2010 年首次上榜时排名257名,2011年是297名,2012年是381名,2013年,李宁公司未能进入榜单。 2014年底,年过50的李宁在淡出管理层多年后重回公司,对于自己的“救火行为”,李宁说:“公司需要我,我就回来,毕竟我是创始人,又是大股东。”重新出山后,李宁重启口号“一切皆有可能”,向市场宣誓回归初心。 李宁将公司定位由“体育装备提供商”改为“互联网+运动生活体验提供商”,积极拥抱“运动+科技”的流行趋势。利用高速发展的互联网,公司开启“互联网+”战略。李宁本人开通社交平台账号,卖萌、写鸡汤、玩Cosplay,一年时间吸粉近两百万。在运动生涯中,李宁先后参加60余次重大国内外比赛,获世界冠军14个,国际国内金牌106枚。他独创动作“鞍马正交叉转体90度经单环起倒立落下成骑撑”、“吊环吊臂前摆上成支撑”、“吊环支撑后翻经后悬垂前摆上成支撑”、“双杠大回环转体180度成支撑”,分别被国际体联命名为“李宁交叉”、“李宁摆上”、“李宁正吊”和“双杠李宁大回环”。   退役后获高度评价1999年,国际体育记者协会评选出25名“20世纪最佳运动员”,作为唯一入选的中国运动员,与“球王”贝利、“拳王”阿里、“飞人”乔丹相比肩。李宁在获得这项殊荣时说:“20世纪是不平凡的世纪,我们的祖国发生了翻天覆地的变化,而我有幸作为中国体育界的一员向世界证明这种变化,我感到无比的骄傲和自豪!” 2000年,李宁入选国际体联体操名人堂,成为中国体操史上第一人。 2019年,李宁被任命为中国奥委会委员。 裁判经历1989年,考取体操国际裁判证书。从1991年美国印第安纳波利斯世锦赛到2000年英国格拉斯哥世界杯总决赛的十年间,李宁执法了历届世界体操大赛。 1996年,担任奥运会体操比赛裁判。2000年悉尼奥运会,担任跳马比赛裁判长。对于裁判工作和身份转变,李宁说:“自己的主要任务,是给所有象他当初那样想表现的运动员创造更好、更公平的表现环境。”  担任北京奥运火炬手全民猜想谁来点燃奥运圣火,是2008年北京奥运会开幕式最大的悬念。为解开这个巨大的谜,曾为之展开了全民大猜想。刘翔、姚明、桑兰、许海峰、何振梁、邓亚萍、伏明霞、杨扬、张怡宁……似乎都有理由,似乎谁都合适。 李宁最终脱颖而出, 北京奥运会开闭幕式总导演张艺谋解释了选择李宁的原因:“选择已经退役的李宁是有特殊要求的,首先他要在高空做高难度动作,需要训练很长时间,我们不大可能邀请一位正在准备参赛的现役运动员来做。其次,此人要获得过崇高荣誉,兼具体操技能方面的基础。空中的转身、横着走都要经过特别训练。经过国家体育总局的推荐,我们最终确定了李宁。” 李宁的启蒙教练梁文杰在开幕式前曾预感到,爱徒李宁将点燃主火炬:“李宁的优势很明显,他是奥运冠军,人品和对中国体育的贡献,都有目共睹。他做出了自己的品牌,影响力遍及全球。他一直热心公益事业,对社会的贡献,在运动员中几乎无人能比。”\n\n问题是:李宁公司上市了吗?\n\n正确的答案是:''

这绝对不是用来凑字数的~提交给模型后的输出:

同样询问了”请问李宁是哪一年出生的?”给出的答案很直接。

为了验证这不是一个搜索引擎,我又多提问了一个问题,”李宁公司是怎么发际的?”,回答如下:

李宁公司的发际过程可以分为几个阶段:

1. 1988年,李宁退役后加入健力宝集团,创办了“李宁牌”运动服装公司。
2. 1990年,李宁牌运动服装公司与新加坡公司合资,成立了中新(加坡)合资健力宝运动服装公司。
3. 1992年,李宁牌运动服装公司获得奥运会中国代表团指定领奖服装、领奖鞋的合同,开始在国际舞台上展现。
4. 1994年,李宁决定脱离健力宝,自立门户,成立了独立的李宁运动服装公司。

通过这些步骤,李宁逐渐从一个运动员转变为一个企业家,建立了自己的运动装备品牌,并最终成为中国体育用品行业的领导者。

答案并没有直接出现在提供的资料中,说明是模型自己组织过语言了。

总结

RAG主要利用了语以相似性进行信息检索,加上优秀的工程工具的加持可以让我们很简单的自助实现。当然我理解可能有偏差,有什么问题希望指出。实际上已经有很成熟的工具包来完成上这个流程,比如LlamaIndex,LangChain里也有相关的封装,RAG对大模型能力的提升特别明显的,在为ChatGPT一类的商业模型制作Agent的时候也会经常用到这个技术,大概就这些吧。

最后还是对开源世界致以最崇高地敬意。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注