$30 off During Our Annual Pro Sale. View Details »

watsonx.ai Dojo #4 生成AIを使ったアプリ開発、応用編

watsonx.ai Dojo #4 生成AIを使ったアプリ開発、応用編

目的
* RAGを実行するための基本事項を知る
* テキストファイルの内容を適切な大きさの文書に分割する方法を知る
* 文書をベクトル・データベースに追加する方法、検索する方法を知る
* LangChainの仕組みを使って、RAGを実行し、結果を得る方法を知る

ゴール
* 言語モデルにない知識をテキストファイルにまとめておき、IBM watsonx.ai とLangChainを使って、RAGを試せるようになる
※ もし時間の余裕があれば、Doclingの紹介も行います

Akira Onishi (IBM)

November 19, 2024
Tweet

More Decks by Akira Onishi (IBM)

Other Decks in Programming

Transcript

  1. ࣗݾ঺հ 1SPQFSUZ 7BMVF ࢯ໊ େ੢ জ Y-JOLFE*O POJBL *5ۀքྺ ೥໨

    ௚ۙͷ৬ྺ Microsoft ೥ *#.೥໨🎉 )BTI5BH ͍͍Ͷ͐੩Ԭੜ׆RVBOUJD ࠲ӈͷ໏ ౿·Εͯ΋ͳ্ཱ͓͕ͪΔಓͷ૲ Α͘࢖͏ٕ ೴಺ม׵Ͱࣗ෼ΛϙδςΟϒʹ IUUQTXXXGBDFCPPLDPNBLJSBPOJTIJ 'BDFCPPLʮ͓ʹ͋͘ʯͰݕࡧ
  2. γϯϓϧͳϢʔεέʔεͰখ͘͞"*Λ׆༻͠ͳ͕Βɺ"*ΞϓϦΛ։ൃ͠ɺ ஈ֊తʹൃలͤ͞ɺۀ຿ͷσδλϧԽΛਐԽͤ͞Δ ϏδωεͷͨΊͷ"*ɺϢʔεέʔε จॻੜ੒ ࣭ٙԠ౴ ίʔυੜ੒ ෼ྨ ݴ༿ͷநग़ ཁ໿ ݕࡧʴཁ໿

    3"( ࣗಈԽ 3"(3FUSJFWBM"VHNFOUFE(FOFSBUJPOɺ"*Ϟσϧ͕஌Βͳ͍৘ใΛݕࡧ͠ɺͦͷ݁ՌΛ࢖ͬͯ"*ϞσϧͰςΩετΛੜ੒͢Δ ςΩετ ੜ੒ ຋༁ ϋϯζΦϯ಺༰
  3.  %FNPΛݟͯײ͡·͠ΐ͏ εϥΠυ͚ͩͷߨԋͰ͸ͳ͘ɺ%FNPΛަ͑ͨηογϣϯΛఏڙ͠·͢  श͏ΑΓ׳Ε·͠ΐ͏ ٕज़Λମݧ͢ΔͨΊͷԋशΛ௨ͯ͡ɺٕज़ΛֶͿ͖͔͚ͬΛ࡞Γ·͢  ࣭໰େ׻ܴɺηογϣϯΛҰॹʹ࡞Γ·͠ΐ͏ ߨࢣࣗ਎΋ֶͼͳ͕ΒηογϣϯΛ࣮ࢪ͍ͯ͠·͢ օ͞Μ͔Β΋ؾ෇͖΍ϑΟʔυόοΫΛͲΜͲΜڞ༗͍ͯͩ͘͠͞

     ػցֶशϞσϧ΍"*ϞσϧɺXBUTPOYBJΛ༑ୡʹ͠Α͏ ࠷ऴ໨ඪ͸ɺօ͞Μ͕طଘͷϞσϧΛ࢖ͬͯɺ"*ΞϓϦΛ։ൃ͠ɺར༻ ͢Δ͜ͱͰ͢  ୭΋͕࣮ߦͰ͖ͳ͍ɾ೉қ౓͕ߴ͍ςʔϚʹ͸৮Ε·ͤΜ ػցֶशϞσϧ΍"*ϞσϧΛθϩ͔Β։ൃ͢Δੈք͸औΓ্͛·ͤΜ XBUTPOYBJ%PKPͷάϥϯυɾϧʔϧ
  4. XBUTPOYBJ%PKPୈճͱୈճ ճ λΠτϧ ࣮ࢪ೔  ੜ੒"*ͱ޲͖߹͏ͨΊͷ४උฤ  ਫ *#.XBUTPOYBJΛ׆༻͢Δʹ͋ͨΓɺੜ੒"*ͱ ޲͖߹͏ͨΊʹ஌͓ͬͯ͘ͱྑ͍ٕज़ʹ͍ͭͯɺ

    ޿͘ઙֶ͘ͼ·͢ɻಛʹલఏ஌ࣝ͸ෆཁͰ͕͢ɺ 1ZUIPOݴޠΛ஌͓ͬͯ͘ͱɺཧղ͕ਂ·Γ·͢ɻ Φʔϓϯιʔε΍طଘͷϥΠϒϥϦΛ࢖ͬͯੜ੒ "*Λಈ࡞ͤ͞ΔͨΊͷ؀ڥͷશମ૾Λ஌Δ͜ͱͰɺ "*ϓϥοτϑΥʔϜͰ͋Δ*#. XBUTPOYBJͷओ ཁͳٕज़ཁૉΛֶΜͰ͍͖·͠ΐ͏ɻ  ੜ੒"*Λ࢖ͬͨΞϓϦ։ൃɺೖ໳ฤ  ਫ *#.XBUTPOYBJͷϓϩϯϓτϥϘΛ࢖ͬͯେن໛ ݴޠϞσϧΛૢ࡞͢Δํ๏ɺग़དྷ্͕ͬͨϓϩϯ ϓτΛΞϓϦ͔Βݺͼग़͢ํ๏Λֶͼ·͢ɻ *#. XBUTPOYBJʹ಺ଂ͞Ε͍ͯΔେن໛ݴޠϞσ ϧΛ஌Γɺ͍ΖΜͳϞσϧΛ࣮ࡍʹࢼ͍͖ͯ͠· ͠ΐ͏ɻ
  5. XBUTPOYBJ%PKPୈճͱୈճ ճ λΠτϧ ࣮ࢪ೔  ϓϩϯϓτΤϯδχΞϦϯάೖ໳  ਫ େن໛ݴޠϞσϧΛૢ࡞͢ΔͨΊͷϓϩϯϓτΛ ࡞੒͢Δ্Ͱɺิॿతͳ৘ใΛՃ࣭͑ͯ໰ͷҙਤ

    Λ໌֬ʹ͢Δํ๏ɺྫࣔʹΑΓճ౴ͷਫ਼౓ΛߴΊ Δํ๏ͳͲʹֶ͍ͭͯͼ·͢ɻେن໛ݴޠϞσϧ ʹվྑΛՃ͑ͣʹɺظ଴ͨ͠ճ౴ʹ͚ۙͮΔํ๏ Λࢼ͍͖ͯ͠·͠ΐ͏ɻ  ੜ੒"*Λ࢖ͬͨΞϓϦ։ൃɺԠ༻ ฤ  ਫ େن໛ݴޠϞσϧͷ੍໿ࣄ߲Λ৐Γӽ͑ΔͨΊʹɺ 3"(΍-BOH$IBJOΛ࢖ͬͨ"*ΞϓϦͷ։ൃʹͭ ֶ͍ͯͼ·͢ɻ͜Ε·ͰͷճΑΓ΋एׯ೉қ౓͕ ্͕Γ·͕͢ɺαϯϓϧίʔυΛݟͳ͕Βɺงғ ؾΛ௫Έɺօ͞Μ͕։ൃ͍ͨ͠"*ΞϓϦͷ׬੒ ౓ΛߴΊ͍͖ͯ·͠ΐ͏ɻ
  6. XBUTPOYBJ%PKPୈճͱୈճ ճ λΠτϧ ࣮ࢪ೔  ϑΝΠϯνϡʔχϯάͱ *OTUSVDU-BC  ਫ ࣭໰ͱ౴͑Λ༻ҙ͢Δ͜ͱͰɺେن໛ݴޠϞσ

    ϧʹ৽͍͠஌ࣝΛ௥Ճ͢ΔͨΊͷϑΝΠϯ νϡʔχϯάͷํ๏Λֶͼ·͢ɻ·ͨɺاۀಠ ࣗͷେن໛ݴޠϞσϧͷܧଓతͳվྑʹ࠷దͳ *OTUSVDU-BCʹֶ͍ͭͯͼ·͢ɻ  ܧଓతͳ"*ΞϓϦ։ൃͱల։  ਫ ͜Ε·Ͱֶश͖ͯͨ͜͠ͱΛ૊Έ߹Θͤͯɺେ ن໛ݴޠϞσϧΛར༻ͨ͠"*ΞϓϦͷܧଓతͳ ։ൃͱల։ͷํ๏Λֶͼ·͢ɻاۀಠࣗͷ"*Ξ ϓϦ͚ͩͰ͸ͳ͘ɺ"*Λ૊ΈࠐΜͩιϦϡʔ γϣϯͷܧଓతͳൃలɺύʔτφʔΤίγες Ϝ΁ͷൃలͳͲΛҰॹʹߟ͍͖͑ͯ·͢ɻ
  7. ४උͷͨΊͷࢀߟࢿྉ IUUQTTQFBLFSEFDLDPNPOJBLJCNXBUTPOYBJEPKPQSFSFR ϋϯζΦϯ؀ڥͷ४උ ؀ڥ ର৅ऀ *#.5FDIOPMPHZ;POF *#.άϧʔϓࣾһ *#.1BSUOFS1MVTʹొ࿥ࡁΈͷϏδωεɾύʔτφʔ༷ *#.XBUTPOYBJ೔ແྉධՁ൛ ҰൠͷࢀՃऀͰɺ*#.$MPVEͷΞΧ΢ϯτΛ͓࣋ͪͰͳ͍৔߹

    ධՁ൛΁ͷΞΫηεʹ͸ΫϨδοτɾΧʔυ͸ෆཁ ೔ܦաޙ͸ɺΫϨδοτɾΧʔυΛొ࿥͢Δͱैྔ՝ۚΞΧ΢ϯτͱ ͯ͠ɺશͯͷ*#.$MPVEͷαʔϏε͕͝ར༻͍͚ͨͩ·͢ *#.$MPVE ҰൠͷࢀՃऀͰɺ*#.$MPVEͷΞΧ΢ϯτΛ͓࣋ͪͷ৔߹
  8. ར༻͢ΔݴޠϞσϧ*#.HSBOJOUFC+BQBOFTF ୈճͷϑϦʔϑΥʔϜͰ࣮ߦͨ͠಺༰Λϕʔεʹ৽نʹ3"(൛ͷΞϓϦΛ࡞Γ·͢  *#.XBUTPOYBJ্Ͱ৽نϓϩδΣΫτΛ࡞੒͢Δ  *#.$MPVE͔Β"1*,FZΛऔΓग़͢  1ZUIPOίʔυ͔ΒɺXBUTPOYBJʹ઀ଓ͠ɺݴޠϞσϧʹΞΫηε͢Δ  ஌ࣝΛؚΜͩςΩετɾϑΝΠϧΛಡΈࠐΈɺద੾ͳจॻʹ෼ׂ͢Δ

     $ISPNBσʔλϕʔεΛ࡞੒͠ɺจॻΛ௥Ճ͢ΔɺจॻΛݕࡧ͢Δ  ϓϩϯϓτɾςϯϓϨʔτΛ࡞੒͢Δ  ໰͍߹Θͤͷ಺༰ɺͦΕʹؔ࿈͢Δݕࡧ݁ՌɺϓϩϯϓτɾςϯϓϨʔτɺݴޠ ϞσϧɺͦΕͧΕΛͭͳ͗߹Θͤͯɺ-BOH$IBJOʹΑΔ3"(Λ࣮ߦ͢Δ ຊ೔ͷϋϯζΦϯ3"(Ͱ੩ԬݝͷັྗΛ఻͑ΔจষΛੜ੒͢Δ
  9. 3"(ͷجຊྫͱͳΔ৘ใΛ֎෦σʔλιʔε͔Βऔಘ͢Δ ϓϩϯϓτɾ ςϯϓϨʔτΛ࢖ͬͯ ϓϩϯϓτΛ࡞੒͢Δ ࣭໰ \RVFTUJPO^ σʔλιʔε͔Β \RVFTUJPO^Ͱݕࡧ͠ɺ ݁ՌΛ\DPOUFYU^ͱ͢Δ ࣭໰\RVFTUJPO^

    ݕࡧ݁Ռ\DPOUFYU^ ϓϩϯϓτΛ࢖ͬͯ ݴޠϞσϧͰਪ࿦͢Δ ਪ࿦݁Ռ จ຺ͱ࣭໰͕ຒΊࠐ·Εͨϓϩϯϓτ σʔλιʔε \RVFTUJPO^ ݁Ռ ϓϩϯϓτɾ ςϯϓϨʔτ จ຺: {context} ### ೖྗ: {question} ### Ԡ౴:"
  10. 3"(ͷ۩ମྫ-BOH$IBJOͱ$ISPNBσʔλϕʔεͷར༻ NZ1SPNQU5FNQMBUF ϓϩϯϓτΛ࡞੒ ࣭໰ \RVFTUJPO^ 3FUSJFWFS \RVFTUJPO^Ͱݕࡧ͠ɺ ݁ՌΛ\DPOUFYU^ͱ͢Δ ࣭໰\RVFTUJPO^ ݕࡧ݁Ռ\DPOUFYU^

    DVTUPN@MMN ϓϩϯϓτΛ ར༻ͯ͠ਪ࿦͢Δ ਪ࿦݁Ռ จ຺ͱ࣭໰͕ຒΊࠐ·Εͨϓϩϯϓτ $ISPNB σʔλϕʔε \RVFTUJPO^ ݁Ռ ϓϩϯϓτɾ ςϯϓϨʔτ จ຺: {context} ### ೖྗ: {question} ### Ԡ౴:"
  11. # Chromaσʔλϕʔε͔Β retrieverΛ࡞Δ # watsonx.ai Dojo #3Ͱ࢖ͬͨϓϩϯϓτɾςϯϓϨʔτΛ࠶ར༻͢Δ # langchain_ibm͔Βcustom_llm Λ༻ҙ͢Δ

    (granite-8b-japaneseʣ rag_chain = ( {"context": retriever, "question": RunnablePassthrough()} | myPromptTemplate | custom_llm # rag_chainʹ໰͍߹ΘͤΛ࣮ߦ͢Δ result = rag_chain.invoke(query_shizuoka) -BOH$IBJOͰͷදݱ question = query_shizuoka
  12. from langchain.prompts import PromptTemplate prompt_template = """ҎԼ͸ɺλεΫΛઆ໌͢Δࢦࣔͱɺจ຺ͷ͋Δೖྗͷ ૊Έ߹ΘͤͰ͢ɻཁٻΛద੾ʹຬͨ͢Ԡ౴Λॻ͖ͳ͍͞ɻ ### ࢦࣔ:

    ༩͑ΒΕ࣭ͨ໰ʹରͯ͠ɺจ຺͕͋Δ৔߹͸ͦΕ΋ར༻͠ɺճ౴͍ͯͩ͘͠͞ɻ จ຺: {context} ### ೖྗ: {question} ### Ԡ౴:""" myPromptTemplate = PromptTemplate.from_template(prompt_template) ϓϩϯϓτɾςϯϓϨʔτ
  13. શମ૾DVTUPN@MMN͸XBUTPOYBJͷݴޠϞσϧ΁ΞΫηε 1ZUIPO 6CVOUVNBD04 MDRBQZ ίϯϐϡʔλʔ ϧʔλʔ ϧʔλʔ ϩʔΧϧ؀ڥ *#.XBUTPOYBTB4FSWJDF ෳ਺ͷ

    ίϯϐϡʔλʔ (16 3FE)BU0QFO4IJGULT XBUTPOY8BUTPO4UVEJP 8BUTPO.BDIJOF-FBSOJOH XBUTPOY "1* 8FC ΞϓϦ ΞΫηε τʔΫϯ from langchain_ibm import WatsonxLLM custom_llm = WatsonxLLM( model_id= "ibm/granite-8b-japanese", url=credentials.url, apikey=credentials.api_key, Params=generate_params, project_id=MY_PROJECT_ID) 0CKFDU 4UPSBHF $ISPNB ϝϞϦ্ $VTUPN@MMN
  14. XBUTPOYBJͷΑ͏ͳ"*ϓϥοτϑΥʔϜ͕ඞཁͳཧ༝ ΞϓϦʢ8FCϢʔβʔΠϯλʔϑΣΠεʣ ΞϓϦɾϓϥοτϑΥʔϜ "*ΞϓϦ Ϗδωεɾ ϩδοΫ "*Ϟσϧ ϥΠϒϥϦ"1* "*ΞϓϦɾϓϥοτϑΥʔϜ ໰͍߹Θͤ

    ੜ੒݁Ռ ཤྺ σʔλ ࢖༻ྔ σʔλ "*ͷ࣮ݧ͸ΦʔϓϯιʔεͰ΋Մೳ ҰํɺاۀϨϕϧ΁ͷల։͸՝୊͕ଟ͍ 4BB4൛ͷXBUTPOYBJΛ࢖͑͹ɺ ΞϓϦ։ൃɺల։ɺӡ༻ʹूதͰ͖Δ
  15. ࢀߟEPDMJOH IUUQTHJUIVCDPN%44%EPDMJOH 1ZUIPOΛ࢖ͬͯɺΑ͘࢖ΘΕΔจॻͷ ϑΝΠϧΛ+40/ܗࣜɺ͋Δ͍͸ .BSLEPXOܗࣜʹม׵͢ΔϥΠϒϥϦʔ 1%' %0$9 1159 *NBHFT )5.-

     "TDJJ%PD .BSLEPXO Πϯετʔϧํ๏ pip install docling from docling.document_converter import DocumentConverter # PDF path or URL source = "https://arxiv.org/pdf/2408.09869" converter = DocumentConverter() result = converter.convert(source) # output: "### Docling Technical Report[...]" print(result.document.export_to_markdown())
  16. ϫʔΫγϣοϓɺηογϣϯɺ͓Αͼࢿྉ͸ɺ*#.·ͨ͸ηογϣϯൃදऀʹΑͬͯ४උ͞ΕɺͦΕͧΕಠࣗͷݟղΛ൓өͨ͠΋ͷͰ͢ɻͦΕΒ͸৘ใ ఏڙͷ໨తͷΈͰఏڙ͞Ε͓ͯΓɺ͍͔ͳΔࢀՃऀʹରͯ͠΋๏཯త·ͨ͸ͦͷଞͷࢦಋ΍ॿݴΛҙਤͨ͠΋ͷͰ͸ͳ͘ɺ·ͨ*#.੡඼΍αʔϏε͕͓ ٬༷ʹద༻͋Δಛఆͷ๏ྩʹద߹͢Δ͜ͱΛอূ͢Δ΋ͷͰ΋͋Γ·ͤΜɻຊߨԋࢿྉʹؚ·Ε͍ͯΔ৘ใʹ͍ͭͯ͸ɺ׬શੑͱਖ਼֬ੑΛظ͢ΔΑ͏౒ Ί͓ͯΓ·͕͢ɺʮݱঢ়ͷ··ʯఏڙ͞Εɺ໌ࣔ·ͨ͸໧ࣔʹ͔͔ΘΒͣɺ঎ۀੑɺಛఆͷ໨త΁ͷద߹ੑɺඇ৵֐ੑΛؚΊɺ͍͔ͳΔอূ΋൐Θͳ͍ ΋ͷͱ͠·͢ɻຊߨԋࢿྉ·ͨ͸ͦͷଞͷࢿྉͷ࢖༻ʹΑͬͯɺ͋Δ͍͸ͦͷଞͷؔ࿈ʹΑͬͯɺ͍͔ͳΔଛ֐͕ੜͨ͡৔߹΋ɺ*#.͸੹೚ΛෛΘͳ͍ ΋ͷͱ͠·͢ɻ ຊߨԋࢿྉͰݴٴ͞ΕΔ*#.੡඼ɺϓϩάϥϜɺ·ͨ͸αʔϏε͸ɺ*#.͕ϏδωεΛߦ͍ͬͯΔ͢΂ͯͷࠃɾ஍ҬͰ͝ఏڙՄೳͳΘ͚ Ͱ͸͋Γ·ͤΜɻຊߨԋࢿྉͰݴٴ͞ΕΔকདྷͷల๬ʢ੡඼ϦϦʔε೔෇΍੡඼ػೳΛؚΉʣ͸ɺࢢ৔ػձ·ͨ͸ͦͷଞͷཁҼʹج͍ͮͯ*#.ಠࣗͷܾ ఆݖΛ΋͍ͬͯͭͰ΋มߋͰ͖Δ΋ͷͱ͠ɺকདྷͷ੡඼·ͨ͸ػೳ͕࢖༻ՄೳʹͳΔ͜ͱɺ΋͘͠͸ಛఆͷ݁ՌΛ֬໿͢Δ͜ͱΛҙਤ͢Δ΋ͷͰ͸͋Γ ·ͤΜɻຊߨԋࢿྉ͸ɺݴٴ͞ΕΔ

    *#.੡඼·ͨ͸αʔϏεʹద༻͋Δܖ໿৚݅Λมߋ͢Δ΋ͷͰ΋ɺ௥Ճͷද໌·ͨ͸อূΛҙਤ͢Δ΋ͷͰ΋͋Γ· ͤΜɻ ຊߨԋࢿྉʹؚ·Ε͍ͯΔ಺༰͸ɺࢀՃऀͷ׆ಈʹΑͬͯಛఆͷ݁Ռ͕ੜ͡Δͱड़΂Δɺ·ͨ͸҉ࣔ͢Δ͜ͱΛҙਤͨ͠΋ͷͰ΋ɺ·ͨͦͷΑ͏ͳ݁Ռ ΛੜΉ΋ͷͰ΋͋Γ·ͤΜɻ ύϑΥʔϚϯε͸ɺ؅ཧ͞Εͨ؀ڥʹ͓͍ͯඪ४తͳ*#.ϕϯνϚʔΫΛ࢖༻ͨ͠ଌఆͱ༧ଌʹج͍͍ͮͯ·͢ɻϢʔβʔ ͕ܦݧ͢Δ࣮ࡍͷεϧʔϓοτ΍ύϑΥʔϚϯε͸ɺϢʔβʔͷδϣϒɾετϦʔϜʹ͓͚ΔϚϧνϓϩάϥϛϯάͷྔɺೖग़ྗߏ੒ɺετϨʔδߏ੒ɺ ͓Αͼॲཧ͞ΕΔϫʔΫϩʔυͳͲͷߟྀࣄ߲ΛؚΉɺ਺ଟ͘ͷཁҼʹԠͯ͡มԽ͠·͢ɻ͕ͨͬͯ͠ɺݸʑͷϢʔβʔ͕͜͜Ͱड़΂ΒΕ͍ͯΔ΋ͷͱ ಉ༷ͷ݁ՌΛಘΒΕΔͱ֬໿͢Δ΋ͷͰ͸͋Γ·ͤΜɻهड़͞Ε͍ͯΔ͢΂ͯͷ͓٬༷ࣄྫ͸ɺͦΕΒͷ͓٬༷͕ͲͷΑ͏ʹ*#.੡඼Λ࢖༻͔ͨ͠ɺ· ͨͦΕΒͷ͓٬༷͕ୡ੒ͨ݁͠Ռͷ࣮ྫͱͯࣔ͠͞Εͨ΋ͷͰ͢ɻ࣮ࡍͷ؀ڥίετ͓ΑͼύϑΥʔϚϯεಛੑ͸ɺ͓٬༷͝ͱʹҟͳΔ৔߹͕͋Γ·͢ɻ • *#.ɺ*#.ϩΰɺJCNDPNɺ%C *#.XBUTPOY *#.$MPVE͸ɺ ੈքͷଟ͘ͷࠃͰొ࿥͞Εͨ*OUFSOBUJPOBM#VTJOFTT.BDIJOFT$PSQPSBUJPOͷ঎ඪͰ͢ɻଞͷ੡඼ ໊͓ΑͼαʔϏε໊౳͸ɺͦΕͧΕ*#.·ͨ͸֤ࣾͷ঎ඪͰ͋Δ৔߹͕͋Γ·͢ɻݱ࣌఺Ͱͷ *#.ͷ঎ඪϦετʹ͍ͭͯ͸ɺXXXJCNDPNMFHBMDPQZUSBEFTIUNM Λ͝ཡ͍ͩ͘͞ɻ • %PDMJOH͸"QBDIFϥΠηϯεͰެ։͞Ε͍ͯΔΦʔϓϯιʔεͷϥΠϒϥϦʔͰ͢ɻ