LangChain
https://gyazo.com/82275023cd8048d52a5ca0c2a5dea114
なくていいっしょ派だけど text_splitter とかは使いたい、一度触っておく
Introduction | 🦜️🔗 Langchain
ざっくりつかむ!LangChainのメンタルモデル
community
langchain/libs/community at master · langchain-ai/langchain
QuickStart
Quickstart | 🦜️🔗 Langchain
Document loaders | 🦜️🔗 Langchain
page_content, metadata
Text Splitters | 🦜️🔗 Langchain
Faiss | 🦜️🔗 Langchain
ここの stuff は詰める staff やね
コンポーネント
Components | 🦜️🔗 LangChain
Model I/O | 🦜️🔗 LangChain
LLMs
ChatModels
Message types | 🦜️🔗 LangChain
langchain_core.callbacks.streaming_stdout.StreamingStdOutCallbackHandler — 🦜🔗 LangChain 0.1.16
callbacks に渡す、標準出力に出すだけやろと思うがフィルタが色々ある
Prompts | 🦜️🔗 LangChain
Few-shot examples for chat models | 🦜️🔗 LangChain
langchain_core.prompts.prompt.PromptTemplate — 🦜🔗 LangChain 0.2.13
template_format= に jinja2 や mustache がある
Output Parsers | 🦜️🔗 LangChain
Pydantic parser | 🦜️🔗 LangChain
description に書いた説明がプロンプトに使われる? 例を見たい → たぶんこれ parser.get_format_instructions()
Output-fixing parser | 🦜️🔗 LangChain
Retrieval | 🦜️🔗 LangChain
Document Loaders
HTML | 🦜️🔗 LangChain
Markdown | 🦜️🔗 LangChain
MarkdownHeaderTextSplitter | 🦜️🔗 LangChain のほうが好きかなあ
epub も pandoc で markdown にして Header で割ったほうがいいような
PDF | 🦜️🔗 LangChain いいやつどれかわかってない
Retrievers | 🦜️🔗 LangChain
Third Party Integrations Retrievers | 🦜️🔗 LangChain
wikipedia, Vertex AI Search, Elasticsearch 等もここ
RePhraseQuery | 🦜️🔗 LangChain
ユーザ入力(質問)から LLM に検索すべき単語を取り出したり言い換えをやらせる
Chains
LLMChain とかは LCEL 以前の話、こっちつかう https://python.langchain.com/docs/modules/chains/#lcel-chains
LangChain Expression Language (LCEL) | 🦜️🔗 LangChain
LCEL
| で繋いでいくやつ何?
LangChain Expression Language (LCEL) | 🦜️🔗 LangChain
Runnable interface | 🦜️🔗 LangChain
Sequences: Chaining runnables | 🦜️🔗 LangChain
Runnable が実体
| は Python の __or__ 呼び出しになっている / 右から作用する __ror__ のいずれかが呼ばれて DSL になっている
Python 演算子関数
へーとなるものの、まあこういう型になってダルいやろな
langchain-ai/langchain@939d113 - libs/core/langchain_core/runnables/base.py#L414-L418
コンポーネントごとに入出力の型がきまってる input_schema / output_schema
LCEL (LangChain Expression Language) 入門|npaka
LangChain の新記法「LangChain Expression Language (LCEL)」入門
実行例で理解する Runnable in langchain Python - Qiita
ためになる
実行例で理解する Runnable の継承者たち in langchain Python - Qiita
RunnableLambda / RunnableGenerator
| で繋いだ結果できるのが RunnableSequence
/hotchpotch/LangChain の LCEL
LangChain の LangChain Expression Language (LCEL) を理解する - A Day in the Life
dict をつなぐとキーごとの Runnable をくっつけた RunnablePararell になる
chain.get_graph().print_ascii() で AA で可視化できる
RunnablePassthrough.assign(mult=lambda x: x["num"] * 3) で値を追加
入力と最終的な出力両方ほしい時、変なことせずchain を分ければ良い
code:pararell
chain = RunnableParallel(
{
"input": RunnablePassThrough(),
"output": RunnablePathThrough() | template | llm | parser | ...
}
)
debug
Debugging | 🦜️🔗 LangChain
code:debug.py
from langchain.globals import set_debug, set_verbose
set_debug(True)
set_verbose(True)
ほかに globals にあるのはキャッシュぐらい
これも大抵書いてる
code:logging.py
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, force=True)
Loader
Directory Loader と組み合わせる
File Directory | 🦜️🔗 Langchain
Markdown | 🦜️🔗 Langchain
langchain.text_splitter.MarkdownTextSplitter — 🦜🔗 LangChain 0.1.4
MarkdownHeaderTextSplitter | 🦜️🔗 Langchain
ヘッダ無い時とかどういう感じになるのかな?
なんか使いづれえな
isa TextSplitter じゃないし
Text splitters inhéritance · Issue 13510 · langchain-ai/langchain 当然の疑問
一旦無視
epub 読みたい
EPub | 🦜️🔗 LangChain
RetrievalTutorials/tutorials/LevelsOfTextSplitting/5_Levels_Of_Text_Splitting.ipynb at main · FullStackRetrieval-com/RetrievalTutorials
unstructured
CustomRetriever 作る
Custom Retriever | 🦜️🔗 LangChain
メモリ上の DataFrame から id の前後取ってくる
code:dfretriever.py
from langchain_core.documents import Document
from langchain_core.retrievers import BaseRetriever
class DataFrameRetriever(BaseRetriever):
"""id から前後のテキストを取得する Retriever"""
segments: pd.DataFrame
lead: int = 5
lag: int = 5
def _get_relevant_documents(self, id_: str) -> listDocument:
item = self.segments[self.segments"id" == id_]
if item.empty:
return []
(idx,) = item.index
view = self.segments.ilocmax(idx - self.lead, 0) : min(idx + self.lag, len(self.segments))
return [Document(r"text", metadata=r) for _, r in view.iterrows()]
Callback
Conceptual guide | 🦜️🔗 LangChain
Callbacks | 🦜️🔗 LangChain
独自のコールバックを作って chain の途中に挟んで print debug できる
Stream で動作するものは AsyncCallbackHandler 使う、stream で呼んでも prompt などは Base が発火する
code:print_callback.py
from langchain_core.callbacks import BaseCallbackHandler
class PrintCallback(BaseCallbackHandler):
def on_chain_end(self, outputs, **kwargs):
print(outputs)
chain = (
...
llm.with_config(callbacks=PrintCallback())
)
usage_metadata を取得する Callback
chat でも取るなら on_chain_end 見るしかない?
動作確認してないがまあこういう雰囲気で
BaseCallbackHandler — 🦜🔗 LangChain documentation
* ignore_chain などのattribute 試す
code:usage_metadata.py
from langchain_core.callbacks import BaseCallbackHandler
from langchain_core.messages.ai import AIMessage, UsageMetadata
class TokenUsageCallback(BaseCallbackHandler):
def __init__(self) -> None:
super().__init__()
self.total_usage = UsageMetadata(
input_tokens=0, output_tokens=0, total_tokens=0
)
def add_usage(self, usage: UsageMetadata) -> None:
self.total_usage"input_tokens" += usage.get("input_tokens", 0)
self.total_usage"output_tokens" += usage.get("output_tokens", 0)
self.total_usage"total_tokens" += usage.get("total_tokens", 0)
def on_chain_end(self, outputs, **kwargs) -> None:
inputs = kwargs.get("inputs", None)
if isinstance(inputs, AIMessage) and inputs.usage_metadata is not None:
self.add_usage(inputs.usage_metadata)
usage = TokenUsageCallback()
for chunk ik chain.stream(input, {"callbacks": usage}):
...
print(usage.total_usage)
vectorstore に metadata も保存するには? / 検索時に指定するには?
community なのかそうじゃないのか
from langchain.vectorstores import LanceDB
from langchain_community.vectorstores import LanceDB
どっちやねん
langchain-ai/langchain@master - libs/langchain/langchain/vectorstores/lancedb.py
はい...
community のほうがコードジャンプも効く
https://github.com/langchain-ai/langchain-google/pull/164/files
はよリリースしろや、いつまで Gemini 1.5 使わせないねん
embed_query / embed_document でちゃんと Task 切り替えてるのは当然だけど偉いね期待に届いているよ
OutputParser
使い方いろいろすぎないか
output_parser.get_format_instructions() すると csv で出力してねという文言が返るのでプロンプトに入れる...素朴
JSON Output Parser なら JSON Schema が出てくる
CSV parser | 🦜️🔗 LangChain
英語でいいのか問題
Issue: Customizing 'structured_format_instructions' for Non-English Languages · Issue 5203 · langchain-ai/langchain 閉じられてる
Chainlit
Overview - Chainlit
Need type annotation for "chain" 言われたら
Runnbale か RunnableSerializable かなあ
code:annotation_for_chain.py
from langchain_core.runnables import Runnable
chain: Runnable = {"question": RunnablePassthrough()} | ...
hub
LangSmith
プロンプトやチェーンの共有
code:pull.py
from langchain import hub
hub.pull(...)
Gemini
BigQuery データの LangChain アプリケーションへの統合 | Google Cloud 公式ブログ
code:llm.py
import vertexai
vertexai.init(project="pokutuna-playground", location="asia-northeast1")
from langchain.llms import VertexAI
llm = VertexAI(model_name="gemini-pro", temperature=0)
llm("What is BigQuery?")
これだけだと嬉しさないが
langchain_community.document_loaders.bigquery.BigQueryLoader — 🦜🔗 LangChain 0.1.4
LangChain Expression Language (LCEL) | 🦜️🔗 Langchain
2024/10/4 VertexAI 機能置いていかれがちなので ChatVertexAI 使うほうが大抵良い...
SystemMessage とか意味あるの? と思ったけど最初の SystemMessage は API の system_instruction にマップされる
langchain-google/libs/genai/langchain_google_genai/chat_models.py at 9ebd8c11168952b9c33f6dbbf0262155796c905d · langchain-ai/langchain-google
with_structured_output はどうやっている?
llm = self.bind_tools([schema], tool_choice="any") している
include_raw
テストでいい感じにモックするには
【LangChainゆる勉強会#5】LangChainのテスト関連機能を動かす【ランチタイム開催】 - YouTube
FakeChatModel — 🦜🔗 LangChain documentation
2025/1/23 Messages の変換
with_structured_output(include_raw=True) すると生のメッセージ燃えられる
それを履歴に追加して会話の中で Structured Output できる? と思いきやなんか変換ミスっている?
code:output.json
[role: "user"
parts {
text: "動物の名前を3個挙げてください、なるべく違う種類の動物がいいです"
},
role: "model"
parts {
text: "animals"
},
role: "user"
parts {
text: "あなたが挙げた動物を復唱し、それぞれの足の本数を教えて" // 前の情報渡ってない
},
_parse_chat_history_gemini
langchain-google/libs/vertexai/langchain_google_vertexai/chat_models.py at 1e1a1b7cf688d4889af180c054b8ab1d279b0fec · langchain-ai/langchain-google
あたりあとでみる
Gemini で method="json_mode" 強要
うーーーん
code:with_json_mode.py
class ChatVertexAIWithJsonMode(ChatVertexAI):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def with_structured_output(self, schema, *, method=None, **kwargs):
if method is None:
method = "json_mode"
return super().with_structured_output(schema, method=method, **kwargs)
#LLM