Ein­lei­tung

Zur aktu­el­len Zeit des KI-Booms ste­hen viele Unter­neh­men vor der Her­aus­for­de­rung, die trans­for­ma­tive Kraft die­ser Tech­no­lo­gie in ihre eige­nen Pro­zesse zu inte­grie­ren. Ins­be­son­dere der Gedanke an selbst­ge­hos­tete und sichere Alter­na­ti­ven zu kom­mer­zi­el­len KI-Model­len, wie etwa ChatGPT, ist in der Wirt­schaft prä­sent. Viele stre­ben nach indi­vi­du­el­len Lösun­gen, sto­ßen jedoch auf den erheb­li­chen Auf­wand, der mit dem Modell­trai­ning und Fine-Tuning ver­bun­den ist. Hier kommt das RAG1-Prin­zip ins Spiel, ein Ver­fah­ren, das die Not­wen­dig­keit auf­wen­di­ger Trai­nings­pro­zesse über­flüs­sig machen kann.
In die­sem Blog­bei­trag wer­den wir genauer dar­auf ein­ge­hen, was RAG ist, wie es funk­tio­niert und wie man mit­hilfe die­ses Ansat­zes beein­dru­ckende Chat­bots erstel­len kann, ohne auf kom­mer­zi­elle KI-Modelle oder zeit­in­ten­si­ves Trai­ning zurück­grei­fen zu müssen. 

Ansätze

Zu Beginn der Ent­wick­lung eines Chat­bots stellt sich unter ande­rem die Frage, wie die­ser Zugriff auf das nötige Wis­sen erhält, um auf oft sehr spe­zi­fi­sche Fra­gen zu ant­wor­ten. 
Eine Mög­lich­keit wäre, ein eige­nes gro­ßes Sprach­mo­dell (LLM) von Grund auf selbst zu ent­wi­ckeln und zu trai­nie­ren. Doch bei zu erwar­ten­den Kos­ten von meh­re­ren Mil­lio­nen Euro dürf­ten die Aller­meis­ten diese Idee schnell verwerfen. 

Eine weni­ger kost­spie­lige Alter­na­tive ist das soge­nannte Fine­tu­ning. Bei die­ser Methode wird ein meist bereits nutz­ba­res Modell mit den eige­nen rele­van­ten Daten nach­träg­lich trai­niert. So wird ermög­licht, ein LLM deut­lich schnel­ler und kos­ten­güns­ti­ger mit eige­nen Daten zu trai­nie­ren. Aller­dings ist dies zwar eine gute Mög­lich­keit, um bei­spiels­weise den Ton­fall des gro­ßen Sprach­mo­dells an benut­zer­spe­zi­fi­sche Bedürf­nisse anzu­pas­sen, doch bringt das Fine­tu­ning auch einen gro­ßen Nach­teil mit sich. Bei einem vor­trai­nier­ten Modell ist es schwie­rig, gezielt ver­al­tete bzw. nicht gewünschte Infor­ma­tio­nen zu ent­fer­nen. Daher ist nicht garan­tiert, dass bei Ant­wor­ten auf das neu antrai­nierte Wis­sen zuge­grif­fen wird. Außer­dem müsste bei jedem Update der Daten ein neuer Fine­tu­nig-Zyklus durch­lau­fen wer­den, um das Modell aktu­ell zu halten. 

Auf­grund die­ser Umstände hat sich das RAG-Ver­fah­ren eta­bliert. Wobei die­ses je nach Use Case auch mit den oben genann­ten Mög­lich­kei­ten kom­bi­niert wer­den kann. 

Retrie­val-Aug­men­ted Generation

Also, wie funk­tio­niert das RAG-Prin­zip und wel­che Vor­teile hat es? Wie bereits beschrie­ben, wird dem LLM dabei kein spe­zi­fi­sches Wis­sen antrai­niert, son­dern tat­säch­lich „auf Abruf“ mitgegeben. 

Stellt man an einen RAG-basier­ten Chat­Bot eine Frage, so lan­det diese nicht gleich beim LLM, da die­ses womög­lich nicht über das nötige Wis­sen ver­fügt, um diese beant­wor­ten zu kön­nen. Statt­des­sen wird zuvor eine Wis­sens­da­ten­bank auf Infor­ma­tio­nen hin durch­sucht, die zur gestell­ten Frage pas­sen. Die Frage wird nun um die abge­ru­fe­nen Infor­ma­tio­nen und even­tu­ell wei­te­ren Anwei­sun­gen erwei­tert und an das große Sprach­mo­dell zu Gene­rie­rung einer Ant­wort übergeben. 

Die Daten­bank ist not­wen­dig, da es in der Regel nicht mög­lich ist, alle Infor­ma­tio­nen, auf die das LLM bei Bedarf zurück­grei­fen soll, als Kon­text zur Beant­wor­tung einer Anfrage an das LLM zu über­ge­ben. Schon ein­zelne län­gere Doku­mente kön­nen das Token­li­mit2 des LLMs über­schrei­ten. Auch führt zu viel irrele­van­ter Kon­text häu­fig zu einer schlech­te­ren Ant­wort des LLMs. Daher ist es sinn­voll, die Doku­mente ein­zeln abzu­spei­chern und län­gere Doku­mente in klei­nere Abschnitte zu unter­tei­len. Aus die­sen Abschnit­ten kön­nen dann z.B. mit Hilfe des BM25-Algo­rith­mus, oder der Abfrage durch einen Embed­ding-Vek­tor, ein­zelne, für die Beant­wor­tung der Frage rele­vante Abschnitte aus­ge­wählt werden.

Embed­ding­mo­delle & Vektordatenbanken

Für die Abfrage durch einen Embed­ding-Vek­tor wer­den zunächst alle Text­ab­schnitte durch ein dar­auf spe­zia­li­sier­tes Sprach­mo­dell (Embed­ding­mo­dell) in Vek­to­ren umge­wan­delt (s. Schema in Abb. 1). Diese Vek­to­ren wer­den anschlie­ßend in einer Vek­tor­da­ten­bank zusam­men mit den ent­spre­chen­den Text­ab­schnit­ten und ggf. wei­te­ren Meta­da­ten gespei­chert. Wird nun eine Frage an den Chat­bot gestellt, wird auch diese durch das glei­che Embed­ding­mo­dell in einen Vek­tor umge­wan­delt. Dar­auf­hin wer­den, ein­fach aus­ge­drückt, Vek­to­ren mit der gerings­ten Distanz zum Abfrage-Vek­tor aus der Daten­bank gesucht. So wird sicher­ge­stellt, dass eine seman­ti­sche Ähn­lich­keit zwi­schen der Frage und den an das LLM über­ge­be­nen Text­ab­schnit­ten besteht. 

Bei­spiel­ar­chi­tek­tur 

In die­sem Abschnitt wird ein grund­sätz­li­cher Archi­tek­tur­vor­schlag auf AWS beschrie­ben, wel­cher sich bei ande­ren Clou­dan­bie­tern oder On-Prem ähn­lich umset­zen lässt. Außer­dem wird auf einige Schwie­rig­kei­ten ein­ge­gan­gen, die bei der Umset­zung eines RAG Use Cases beach­tet wer­den soll­ten. Die grund­sätz­li­che Archi­tek­tur kann dabei in zwei Abschnitte unter­teilt wer­den, die Bela­dung der Daten­bank und die User-Anfrage an den Chatbot. 

Abbil­dung 2: Bei­spiel-Archi­tek­tur für die Umset­zung eines RAG-basier­ten Chat­bots auf AWS.

Bela­den der Datenbank

Zunächst wer­den Daten ver­schie­de­ner For­mate in einen S3-Bucket gela­den. Durch den Upload getrig­gert, liest eine Lambda-Funk­tion den Text der Doku­mente ein und unter­teilt die­sen wie­der­rum in klei­nere Abschnitte. An die­ser Stelle kön­nen auch OCR-Dienste wie AWS Tex­tract ver­wen­det wer­den, um bei­spiels­weise die Ver­ar­bei­tung von Text in Bil­dern zu ermög­li­chen. Hier­bei ist es wich­tig, das For­mat der zugrun­de­lie­gen­den Daten zu beach­ten und eine sinn­volle Unter­tei­lung der Texte zu wäh­len. Auch sollte auf das Token­li­mit des Embed­ding­mo­dells geach­tet wer­den, da zu lange Text­ab­schnitte nicht voll­stän­dig in Vek­to­ren umge­wan­delt wer­den. Es emp­fiehlt sich, die Texte so zu unter­tei­len, dass zusam­men­hän­gende Para­gra­phen bzw. Sätze auch mög­lichst zusam­men ein­ge­bet­tet wer­den. Um den Kon­text zwi­schen auf­ein­an­der­fol­gen­den Para­gra­phen nicht zu ver­lie­ren, soll­ten sich Abschnitte außer­dem überschneiden. 

Im nächs­ten Schritt wer­den die Texte in einen wei­te­ren S3-Bucket gela­den, wodurch eine wei­tere Lambda-Funk­tion getrig­gert wird. Diese über­gibt die Text­ab­schnitte zur Gene­rie­rung von Vek­to­ren an ein Embed­ding­mo­dell, wel­ches auf einem Sage­ma­ker-End­punkt bereit­ge­stellt wird. Bei der Umwand­lung in Vek­to­ren ist auf Fach­jar­gon bzw. Abkür­zun­gen zu ach­ten, auf die das Embed­ding­mo­dell gege­be­nen­falls nicht trai­niert wurde. 

Davon aus­ge­hend, dass nicht dau­er­haft neue Daten gela­den wer­den, ist es sinn­voll einen asyn­chro­nen End­punkt zu wäh­len, um Kos­ten zu spa­ren. Anschlie­ßend kön­nen die Vek­to­ren und Text­ab­schnitte zusam­men mit Meta­da­ten in die Vek­tor­da­ten­bank gela­den werden. 

Anfra­gen an den Chatbot

Die Benut­zer­ober­flä­che des Chat­bots kann zum Bei­spiel auf stream­lit basie­rend auf einer EC2-Instanz bereit­ge­stellt wer­den. Anfra­gen an den Chat­bot wer­den an das Embed­ding­mo­dell wei­ter­ge­lei­tet und in einen Vek­tor umge­wan­delt und die­ser mit den Daten in der Vek­tor­da­ten­bank abge­gli­chen. Wie oben beschrie­ben, kön­nen auch in die­sem Schritt Fach­jar­gon und Abkür­zun­gen zu unge­nauen Ergeb­nis­sen füh­ren. Die zurück­ge­ge­be­nen Text­ab­schnitte wer­den anschlie­ßend zusam­men mit der gestell­ten Frage und wei­te­ren Anwei­sun­gen an ein LLM auf einem Sage­ma­ker-End­punkt über­ge­ben und die gene­rierte Ant­wort schluss­end­lich in der Benut­zer­ober­flä­che ange­zeigt. Hier­bei gibt es noch einen letz­ten, wich­ti­gen Punkt zu beach­ten: Auch wenn die RAG-Methode sel­te­ner in Hal­lu­zi­na­tio­nen und Falsch­ant­wor­ten resul­tiert, sollte der Chat­bot in der Lage sein, auf ver­wen­dete Quel­len zu ver­wei­sen, sodass die Ant­wort nach­voll­zieh­bar ist und über­prüft wer­den kann. Dazu kön­nen die in der Vek­tor­da­ten­bank gespei­cher­ten Meta­da­ten um einen Link zum jewei­li­gen Quell­do­ku­ment erwei­tert wer­den und die­ser durch das Sprach­mo­dell in die Ant­wort inte­griert werden. 

Zusam­men­fas­sung

RAG bie­tet eine effi­zi­ente Lösung für die Her­aus­for­de­run­gen bei der Ent­wick­lung von Chat­bots in Zei­ten des KI-Booms. Im Gegen­satz zu auf­wen­di­gem Modell­trai­ning oder Fine­tu­ning setzt RAG auf die Idee des „Abru­fens“ von rele­van­tem Wis­sen, anstatt es im Modell selbst zu spei­chern. Die­ses Ver­fah­ren ermög­licht die Erstel­lung beein­dru­cken­der Chat­bots ohne den Bedarf an teu­ren, selbst ent­wi­ckel­ten Sprach­mo­del­len oder zeit­rau­ben­dem Trai­ning. Die Nut­zung einer Wis­sens­da­ten­bank, die Infor­ma­tio­nen auf Abruf bereit­stellt, sorgt für eine prä­zise Ant­wort­ge­ne­rie­rung. Die RAG-Methode ver­mei­det die Ein­schrän­kun­gen von trai­nier­ten Model­len, da sie nicht auf kon­ti­nu­ier­li­ches Trai­ning ange­wie­sen ist. Mit einer struk­tu­rier­ten Archi­tek­tur, die Daten­bank­be­la­dung und Benut­zer­an­fra­gen effek­tiv hand­habt, stellt RAG eine viel­ver­spre­chende Methode dar, um fort­schritt­li­che und zugleich kos­ten­ef­fi­zi­ente Chat­bots zu ent­wi­ckeln, die sich auf spe­zi­fi­sches Wis­sen fokussieren. 

Autoren:
Leon Topp, Lukas Schif­fers

  1. Retrie­val-Aug­men­ted Gene­ra­tion ↩︎
  2. Die maxi­male Anzahl an Wör­tern, die ein LLM in einer Anfrage ver­ar­bei­ten kann ↩︎