LoginSignup
5
8

More than 1 year has passed since last update.

LangChain 20230404 update

Last updated at Posted at 2023-04-07

LangChain v0.0.131

はじめに

LangChainの2023/4/4のupdate情報です.新しく以下の機能が追加されました.

  • GPT4all
  • LLaMA.cpp
  • Qdrant
  • Zilliz
  • Outlook Message Loader
  • Selenium Document Loader

記事に誤り等ありましたらご指摘いただけますと幸いです。

備考:LangChainの実装まとめ
https://github.com/fuyu-quant/langchain

目次

updateの概要

LangChainには以下にあるように大きく6つのモジュールで構成されています.

太字の箇所が今回アップデートされた箇所になります.

  • Models
    • LLMs
    • Text Embedding Models
  • Prompts
  • Indexes
    • Document Loaders
    • VectorStore
  • Memory
  • Chains
  • Agents

 今回のアップデートではModelsの中のLLMsという様々な大規模言語モデルを使うための標準的なインターフェースにGPT4allLlama-cppが追加されました.Llama-cppについては文章の埋め込み表現を得るためのText Embedding Modelsにも追加されました.

 またIndexesというLLMがドキュメントを様々な形でやりとりするために構造化するためのモジュールの中のVectorStoreという主に検索などを行う機能が集まっているものにQdrantZillizが追加されました.そして同じIndexesの様々な文章を読み込む機能が集まっているDocument LoadersにOutlook Message LoaderSelenium Document Loaderが追加されました.

以下ではそれぞれについて説明します

GPT4all

LLMs

GPT4allはLLaMaをベースにし,GPT3.5-Turboで生成した文章を学習に使ったモデルです.量子化を行っているため手元のパソコンでも動かせるほど軽量です.

以下は実行のためのコードです.

!pip install llama-cpp-python

from langchain.llms import LlamaCpp
from langchain import PromptTemplate, LLMChain

template = """Question: {question}

Answer: Let's think step by step."""

prompt = PromptTemplate(template=template, input_variables=["question"])

# ここのモデルの重みは上のgithubのリンクからダウンロードしてくる必要があります
llm = LlamaCpp(model_path="./ggml-model-q4_0.bin")
llm_chain = LLMChain(prompt=prompt, llm=llm)

question = ""

llm_chain.run(question)

手元で実行したところ,英語では正しい回答をある程度の速度で生成することができていましたが日本語での性能はかなり悪くまともに返してくれませんでした.他の検証記事にもあるように日本語は得意ではないみたいです.

LLaMA.cpp

LLMs

Text embedding models

LLaMA.cppはC/C++による実装で4ビット量子化によりGPT4all同様に手元のパソコンで動くようなモデルです.

推論に必要な部分の重みだけがユーザーのメモリにロードされた結果,メモリ使用量の減少によって推論の時間が非常に早くなったそうです.またメモリ使用量がなぜ少なくなるのかは正確にわかっていないそうです.

以下が実行コードです.

!pip install llama-cpp-python

# 通常のLLMとしての利用

from langchain.llms import LlamaCpp
from langchain import PromptTemplate, LLMChain

template = """Question: {question}

Answer: Let's think step by step."""

prompt = PromptTemplate(template=template, input_variables=["question"])

# モデルの重みをダウンロードしてくる必要があります
llm = LlamaCpp(model_path="./ggml-model-q4_0.bin")
llm_chain = LLMChain(prompt=prompt, llm=llm)

question = ""

llm_chain.run(question)

# Text Embedding

from langchain.embeddings import LlamaCppEmbeddings

# モデルの重みをダウンロードしてくる必要があります
llama = LlamaCppEmbeddings(model_path="/path/to/model/ggml-model-q4_0.bin")
text = "This is a test document."
query_result = llama.embed_query(text)
doc_result = llama.embed_documents([text])

Qdrant

Vectorstores

https://python.langchain.com/en/latest/modules/indexes/vectorstores/examples/qdrant.html
Open In Colab
Qdrantというベクトル検索とベクトルデータベースのサービスを使った機能です.検索元のテキストの埋め込み表現と検索クエリのテキストの埋め込み表現を入力することで検索元のテキストから類似度の高いテキストを検索することができます.

さらに,Qdrantでは検索元のテキストとその埋め込み表現の保存場所は,メモリ上,ディスクのストレージ,オンプレサーバー,Qdrantクラウドなど様々なものを選ぶことができ非常に汎用性が高いです.

https://qdrant.tech/

以下はメモリ上にテキストと埋め込み表現を保存して,検索クエリに類似しているものを取り出すための実装です.

検索の方法にも以下の3種類が用意されています

  • 類似文章の検索
  • スコア付きの類似文章の検索
  • Maximum marginal relevance search(MMR)…似た文章だけでなく多様な文章を取得できる
!pip install langchain
!pip install openai
!pip install qdrant-client

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Qdrant
from langchain.document_loaders import TextLoader

# 検索元にしたいテキストを読み込ませる
loader = TextLoader('sample.txt')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()

qdrant = Qdrant.from_documents(
    docs, embeddings, 
    location=":memory:",  
    collection_name="my_documents",
)

# 類似文章の検索
query = ""
found_docs = qdrant.similarity_search(query)

# スコア付きの類似文章の検索
query = ""
found_docs = qdrant.similarity_search_with_score(query)
document, score = found_docs[0]
print(document.page_content)
print(f"\nScore: {score}")

# Maximum marginal relevance search
query = ""
found_docs = qdrant.max_marginal_relevance_search(query, k=2, fetch_k=10)
for i, doc in enumerate(found_docs):
    print(f"{i + 1}.", doc.page_content, "\n")

検索元の保存場所や検索方法が複数用意されていて非常に便利だと感じました.

Zilliz

Vectorstores

Zilliz クラウドを使いベクトル検索を行うための機能です.現在はZillizaとの連携が前提の機能のみなのでZillizを活用されている人に役に立ちそうです.

Vector database platform - Zilliz Cloud

実装は以下になります.

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Milvus
from langchain.document_loaders import TextLoader

# Zillizとの連携に必要
ZILLIZ_CLOUD_HOSTNAME = ""
ZILLIZ_CLOUD_PORT = ""

loader = TextLoader('sample.txt')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()

vector_db = Milvus.from_documents(
    docs,
    embeddings,
    connection_args={"host": ZILLIZ_CLOUD_HOSTNAME, "port": ZILLIZ_CLOUD_PORT},
)

docs = vector_db.similarity_search(query)
docs[0]

Outlook Message Loader

Document Loaders

メールのファイルからテキストを取得するための機能です.今回のアップデートにより(.eml)に加えてMicrosoft Outlook(.msg)のファイルからもテキスト情報を取得できるようになりました.

実装は以下です.

from langchain.document_loaders import OutlookMessageLoader

loader = OutlookMessageLoader('sample.msg')
data = loader.load()

data[0]

Selenium Document Loader

Document Loaders

URLのリストを受け取りHTMLから文章の情報だけを取得するための機能.今回新しく加わったSelenium Document LoaderによりレンダリングにJavaScriptを必要とするページから読み取ることができるようになりました.

!pip install langchain
!pip install unstructured
!pip install selenium

from langchain.document_loaders import SeleniumURLLoader

urls = []

loader = SeleniumURLLoader(urls=urls)
data = loader.load()
data

おわりに

以上が2023/4/4のLangChainのアップデートでした.

個人的にはQdrantが非常に便利で様々なことに応用できそうだと感じました.

記事に誤り等ありましたらご指摘いただけますと幸いです。

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8