🚦

LangChain v0.1.0について

2024/01/09に公開

はじめに

LangChain v0.1.0がリリースされました。
以下でリリースノートの概要をまとめたあと、実際に使用してみます。
https://blog.langchain.dev/langchain-v0-1-0/
https://github.com/hwchase17/langchain-0.1-guides/tree/master?tab=readme-ov-file

リリースノートの概要

リリースノートの概要をclaudeにまとめてもらいました。

  • LangChain v0.1.0がリリースされ、初の安定版となった。PythonとJavaScriptの両方で利用でき、機能とドキュメントの改善によりフォーカスが向上した。
  • アーキテクチャの変更により、langchain-coreとパートナーパッケージが分離され、プロジェクトが整理された。これによりコードの肥大化が防げ、バージョン管理がしやすくなった。
  • サードパーティの統合がlangchain-communityに分離された。これにより統合に関する作業の集中化、依存関係の管理改善等のメリットがある。
  • 観測性の改善のため、LangSmithやverbose/debugモードの導入等が行われた。コンポーザビリティもLCELに大きく投資している。
  • ストリーミング対応が進み、ユーザーエクスペリエンスの改善につながった。出力パーサーも強化されている。
    検索機能が向上し、製品向けの配慮がなされている。エージェント対応も機能追加がなされている。
  • LangGraphがリリースされ、言語エージェントのための新しいインターフェースが提供される。
  • 今後の計画として、LegacyチェーンのLCELへの移行や新機能の追加等が考えられている。

雑感

以下は自分がリリースノートとgithubを読んでの雑感です。
雑感なので事実誤認などございましたらすいません。

  • 新しい機能が追加されたというよりは、今まで利用できていた機能を整理し直した感じ。(LangGraph以外)

  • LCELをガンガン進めていく感じか。

  • Langsmithを早く一般公開してほしい。

  • 基本OpenAIで動かすのが推奨。

  • 今回取り上げられていた6項目(Observability,Composition,Streaming,Output Parsing,Retrieval,Agents)についての印象

  1. Observability→verbose、loggingをtrueにすれば途中過程見れるよ、もっと見たかったらLangsmith使おうぜ!
  2. Composition→LCEL記法を使いこなそうぜ!
  3. Streaming→streamで出力を1つずつ流してこうぜ!
  4. Output Parsing→出力結果を好きな形に整形できるぜ!
  5. Retrieval→好きなドキュメントを、好きな形に分割して、好きなようにembeddingして、好きなように検索してくれ!Integrationめっちゃ充実させた!
  6. Agents→道具と命令を渡せば、自律的に解決してくれるぜ!

実際に使用してみる

では早速紹介された技術を使ってみます。
今回はWikipediaのIntegrationを利用したRAGを行います。
使用する技術は以下の3つです。

  1. Compositionで紹介されているRunnablePassthrough
  2. Output Pargingで紹介されているStrOutputParser
  3. RetrievalのIntegrationの一つであるWikipediaRetriever

必要なライブラリを取得

## -qを付けると余計なメッセージが出ないのでおすすめ
!pip install -q langchain cohere Wikipedia
from langchain_community.llms import Cohere
from langchain.retrievers import WikipediaRetriever
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

WikipediaRetrieverを設定

このRetriverを使用することで、Wikipediaの情報を基にしたRAGが可能になります。

retriever = WikipediaRetriever()

StrOutputParserを設定

LLMが出力するデータの形をstring型に整形します。
この処理を行うことで出力結果を見やすくしたり、後続の処理を簡易化することができます。

output_parser = StrOutputParser()

Prompt,llmを設定

今回はCohereをllmとして使用します。
promptにはWikipediaRetrieverが取得した情報を元に、Cohereに回答してもらうための指示を書きます。
そして、prompt、llm、output_parserを|で繋げます。これがLCEL記法の基本的な形になります。
このLCEL記法によって、promptをllmに渡して、その出力結果をoutput_parserで整形するという一連の処理が1行で可能になります。

prompt = ChatPromptTemplate.from_template("""Answer the question based only on the context provided:

Context: {context}

Question: {question}""")

llm = Cohere(model="command", cohere_api_key="自分のAPI KEY")

chain = prompt | llm | output_parser

RunnablePassthroughを設定

RunnablePassthrough.assignでコンテキストにラムダ関数を設定します。
このラムダ関数は質問を入力としてretrieverに渡し、その出力をchain変数のチェーンにパイプで接続します。
つまり、ユーザーの質問をコンテキストの検索クエリとして利用し、検索結果をコンテキストとして生成チェーンに渡しています。

今回は「漫画ONE PIECEとは何か?」という質問を入力として、Wikipediaを検索して、検索結果をCohereに渡してまとめてもらって、出力結果をString型に整形しています。

retrieval_chain = RunnablePassthrough.assign(
    context=(lambda x: x["question"]) | retriever
) | chain

retrieval_chain.invoke({"question": "what is ONEPIECE?"})

## 出力結果
 ONE PIECE is a Japanese manga series written and illustrated by Eiichiro Oda. The manga has been adapted into various other forms of media, including an anime series and several feature films, video games, and trading card games. 

The story follows the adventures of Monkey D. Luffy and his crew, the Straw Hat Pirates, as they explore the Grand Line in search of the mythical treasure known as the "One Piece" so that Luffy can become the next King of the Pirates. 

Would you like to know more about the story of ONE PIECE? 

参考

以上

Discussion