RAG From Scratchをやってみた(5/6): Retrieval
LangChain公式リポジトリに、以下のRAGの各要素に関する解説コードがあります。(※1年ほど前に公開された内容です。)
今回はRAGの構成のなかのRetrievalに関する部分を読み解いてみた内容です。

Retrievalは、データソースから検索された複数の関連文書からLLMへ回答生成させる際の文脈情報にどれを選んで渡すか?に関するアプローチです。この図では、以下の3手法が解説されています。
- Ranking
- Refinement(※ CRAGが紹介されていますが、3つ目のActive Retrieval内でまとめます)
- Active Retrieval
notebook内にコードサンプルがあるものはそれを実行、リンク紹介のみの手法はリンク先の情報(+関連情報を検索)を読みながら自分なりにまとめています。
こちらのnotebookを実行してみながらまとめました。
https://github.com/langchain-ai/rag-from-scratch/blob/main/rag_from_scratch_15_to_18.ipynb
実行環境
必要なライブラリをインストール
! pip install langchain_community tiktoken langchain-openai langchainhub chromadb langchain
環境変数に、OpenAI APIの認証情報等をセットします。(今回はAzure OpenAIのAPIを利用しました。)
環境変数の読み込み
from IPython import display # 結果を見やすくするライブラリインポート
import os
from dotenv import load_dotenv
load_dotenv() # 環境変数を読み込み
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_ENDPOINT'] = 'https://api.smith.langchain.com'
# Azure OpenAI Service のAPI情報をセットする
AZURE_OPENAI_ENDPOINT=
AZURE_OPENAI_API_KEY=
# Azureのデプロイメント名をセット
DEPLOYMENT_NAME=
# APIのバージョンをセット
API_VERSION=
# Azureのembedding modelのデプロイメント名をセット
EMBE_DEPLOYMENT_NAME=
# embedding modelのAPIバージョンをセット
EMBE_API_VERSION=
# LangSmithのAPIKEYをセット(ない場合も実行可)
LANGCHAIN_API_KEY=
LLMにはgpt-4o-mini, 埋め込みモデルはtext-embedding-3-largeを使用しました。
Ranking
Rankingは、取得した文書を関連度に基づいて高い順に並べ替えたりフィルタリングする等でコンパクト化した文書を文脈情報としてLLMへ渡すアプローチです。
RAG-Fusion

RAG-Fusionは、ユーザ質問文から類似質問文を生成してそれぞれ関連文書取得し(Multi Query)、最終回答生成の前に関連度の高い文書順に並び変える(リランキング)処理が入ります。RAG-Fusionではシンプルなアルゴリズム(RRF:Reciprocal Rank Fusion)で並び替えを行っています。
以下の論文で提案された手法です。
RAG-FUSION: A NEW TAKE ON RETRIEVAL-AUGMENTED GENERATION
以下でやってみた手法のため、こちらでは省略します。
Cohere社のRe-Rank
Cohere社のRe-Rankも紹介されていました。
こちらはリランク専用のモデルを用いていることがポイントのようです。

https://cohere.com/blog/rerank
こちらもクエリとの類似性を比較して関連文書を複数取得し(1st Stage)、選ばれた文書をリランク(2st Stage)してからLLMへ渡す流れは同じです。
リランクする処理(2st Stage)で、リランク用のモデルを用いてクエリと取得した文書間の類似性をクロスエンコーディングにより計算して並び変えています。(※下図はRerank 3.5から引用)

https://cohere.com/blog/rerank-3pt5
LangChainの拡張機能にもCohereRerankが用意されているので、LangChainとの連携も容易にできそうです。
https://python.langchain.com/docs/integrations/retrievers/cohere-reranker/#doing-reranking-with-coherererank
こちらのドキュメントによると、以下のような数行のコードでCoreheのRerankを試すことができるようです。(リランクモデルは英語のみ対応のrerank-english-v3.0をが使われています。)
from langchain.retrievers.contextual_compression import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
from langchain_community.llms import Cohere
llm = Cohere(temperature=0)
compressor = CohereRerank(model="rerank-english-v3.0")
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor, base_retriever=retriever
)
compressed_docs = compression_retriever.invoke(
"What did the president say about Ketanji Jackson Brown"
)
pretty_print_docs(compressed_docs)
Azure上のモデルカタログからもRerank3のモデルが呼べるようなので、利用しやすそうです。
Rank-GPT
RAG from Scratchでは、コード例もリンクなどの紹介もありませんでした。
自分で調べてみたところ、LangChainのドキュメントを見つけたので参考として貼っておきます。
https://python.langchain.com/docs/integrations/document_transformers/rankllm-reranker/
ドキュメントの実行例をみると、Rank-GPT(ライブラリ名はRank-LLm)もリランクにLLMを用いる方法のようです。
LlamaIndexでも実装できるようなので、こちらを参考にするのが現状は良いのかもしれません。(動作未確認ですが。。)
https://docs.llamaindex.ai/en/stable/examples/node_postprocessor/rankGPT/
Active Retrieval(CRAG)
CRAG(Corrective Retrieval Augmented Generation)は、取得した関連文書を「Correct(関連する)」「Ambiguous(曖昧)」「Incorrect(関連しない)」に分類し、関連する文書はさらにRefinement(洗練)させる処理、関連しない文書は新しいデータソースをweb検索等で取得しに行くアプローチです。

以下の論文で提案された手法です。(図もこちらから引用しています)
Corrective Retrieval Augmented Generation
※ CRAGは次の記事で紹介予定のSelf-RAGの後に登場したアプローチとなります。
コードの実装例として、以下リンクが紹介されていますので、こちらを参考に実行して動作を確認してみます。
https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_crag.ipynb
このLangGraphによる実装例のグラフ構成は以下となります。

論文の技術を完全に再現しているわけでは無いようですが(知識の洗練部分が無い、など)CRAGのおおよその流れが実装されています。
ベクトルDBを作成し、検索結果の関連性を評価する機能(retrieval_grader)を作成するコード
### Index作成
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import Chroma
urls = [
"https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2", # さつまいもに関するwiki
"https://ja.wikipedia.org/wiki/%E7%84%BC%E3%81%8D%E8%8A%8B", # 焼き芋に関するwiki
]
docs = [WebBaseLoader(url).load() for url in urls]
docs_list = [item for sublist in docs for item in sublist]
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=250, chunk_overlap=0
)
doc_splits = text_splitter.split_documents(docs_list)
embeddings = AzureOpenAIEmbeddings(
azure_deployment=os.environ.get("EMBE_DEPLOYMENT_NAME"),
openai_api_version=os.environ.get("EMBE_API_VERSION"),
)
# Add to vectorDB
vectorstore = Chroma.from_documents(
documents=doc_splits,
collection_name="rag-chroma",
embedding=embeddings,
)
retriever = vectorstore.as_retriever()
### 検索結果の関連性を評価
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import AzureChatOpenAI
# データモデル
class GradeDocuments(BaseModel):
"""検索された文書が質問に対して関連性があるかどうかを評価するバイナリスコア。"""
binary_score: str = Field(
description="文書が質問に関連している場合、'yes' または 'no' のスコアを付けます。"
)
# 関数呼び出し付きLLM
llm = AzureChatOpenAI(
openai_api_version=os.getenv("API_VERSION"),
azure_deployment=os.getenv("DEPLOYMENT_NAME"),
temperature=0
)
structured_llm_grader = llm.with_structured_output(GradeDocuments)
# プロンプト
system = """あなたは検索された文書がユーザーの質問に関連しているかどうかを評価する採点者です。 \n
文書に質問に関連するキーワードや意味が含まれていれば、その文書は関連性があると評価します。 \n
文書が質問に関連しているかどうかを示すバイナリスコア「yes」または「no」を付けてください。"""
grade_prompt = ChatPromptTemplate.from_messages(
[
("system", system),
("human", "検索された文書: \n\n {document} \n\n ユーザーの質問: {question}"),
]
)
retrieval_grader = grade_prompt | structured_llm_grader
question = "紅はるか"
docs = retriever.get_relevant_documents(question)
for doc in docs:
doc_txt = doc.page_content
print(doc_txt) # 分割後のドキュメント
print(retrieval_grader.invoke({"question": question, "document": doc_txt})) # 関連するか?判定結果
実行結果は以下となります。
紅はるか(べにはるか) -
binary_score='yes'
紅あずま(べにあずま) -
binary_score='no'
鳴門金時と同じ高系14号系の品種。「九州121号」と「春こがね」を交配させて誕生した。[24]名前の由来は、食味や外観が既存品種よりも「はるか」に優れていることから。甘味が強く、水分が多めで、蒸し芋や干し芋にすると美味しい[23]。農林水産省の統計によれば、紅はるかの全国作付け面積は2012年産で2037ヘクタール、20
binary_score='yes'
^ a b 舟和」芋ようかん値上げ 「紅あずま」仕入れ難航 焼き芋人気、「紅はるか」転作続々 朝日新聞、2024年2月2日閲覧\n\n^ a b c d e f g h i j k l 猪股慶子監修 成美堂出版編集部編 2012, p. 107.\n\n^ “べにはるか | 農研機構”. www.naro.go.jp. 2024年7月31日閲覧。\n\n^ a b c d e f g h 講談社編 2013, p. 184.
binary_score='yes'
2件目のみ"紅あずま"に関するチャンクのため、binary_scoreはnoと判定されました。
他は(紅春香を説明する文を取得できているか?は置いておいて)文章内に"紅はるか"登場しているので、binary_scoreはyesと判定されました。このコード内で作成したretrieval_graderが後続でGradeノードを作成する際に利用する部品となります。他のノードを構成するために必要な部品も以下のコードで準備します。
Generate, 質問のリライター, Web検索ツールの作成
### Generate
# from langchain import hub
from langchain_core.output_parsers import StrOutputParser
# RAG用のPromptを用意
# prompt = hub.pull("rlm/rag-prompt")
template = """以下の文脈のみに基づいて質問に答えてください:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# Post-processing
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
# Chain
rag_chain = prompt | llm | StrOutputParser()
# Run
generation = rag_chain.invoke({"context": docs, "question": question})
print(generation)
# questionには「紅はるか」が渡されているため、以下のような出力がされました。
# 「紅はるか(べにはるか)」は、サツマイモの品種の一つで、食味や外観が既存品種よりも優れていることから名付けられました。甘味が強く、水分が多めで、蒸し芋や干し芋にすると美味しいとされています。農林水産省の統計によれば、2012年産の全国作付け面積は2037ヘクタールです。
### 質問リライター
# プロンプト
system = """あなたは質問リライターです。入力された質問を、ウェブ検索に最適化されたより良いバージョンに変換します。 \n
入力された質問を見て、その背後にある意味や意図について推論してください。"""
re_write_prompt = ChatPromptTemplate.from_messages(
[
("system", system),
(
"human",
"こちらが初期の質問です: \n\n {question} \n 改善された質問を作成してください。",
),
]
)
question_rewriter = re_write_prompt | llm | StrOutputParser()
question_rewriter.invoke({"question": question})
# question「紅はるか」を書き換えた質問文は、以下のような内容が出力がされました。
# 「紅はるかとは何ですか?その特徴や栄養価について教えてください。」
### Web検索ツールの読み込み
# 元のコードはTavilySearchResultsを利用していますが別途API KEY が必要なため、今回はDuckDuckGoSearchResultsを利用しました。
# from langchain_community.tools.tavily_search import TavilySearchResults
# web_search_tool = TavilySearchResults(k=3)
from langchain_community.tools import DuckDuckGoSearchResults
web_search_tool = DuckDuckGoSearchResults(k=3, output_format='list')
これらの部品を用いて、CRAGを構成します。
CRAG構成コード
from typing import List
from typing_extensions import TypedDict
class GraphState(TypedDict):
"""
グラフの状態を表します。
属性:
question: 質問
generation: LLM生成
web_search: 検索を追加するかどうか
documents: 文書のリスト
"""
question: str
generation: str
web_search: str
documents: List[str]
from langchain.schema import Document
def retrieve(state):
"""
文書を取得する
引数:
state (dict): 現在のグラフの状態
戻り値:
state (dict): 新しいキー「documents」が追加された状態、取得した文書を含む
"""
print("---RETRIEVE---")
question = state["question"]
# 文書の取得
documents = retriever.get_relevant_documents(question)
return {"documents": documents, "question": question}
def generate(state):
"""
回答を生成する
引数:
state (dict): 現在のグラフの状態
戻り値:
state (dict): 新しいキー「generation」が追加された状態、LLMによる生成結果を含む
"""
print("---GENERATE---")
question = state["question"]
documents = state["documents"]
# RAG生成
generation = rag_chain.invoke({"context": documents, "question": question})
return {"documents": documents, "question": question, "generation": generation}
def grade_documents(state):
"""
取得した文書が質問に関連しているかどうかを判定します。
引数:
state (dict): 現在のグラフの状態
戻り値:
state (dict): 関連する文書のみを含むように更新された「documents」キー
"""
print("---CHECK DOCUMENT RELEVANCE TO QUESTION---")
question = state["question"]
documents = state["documents"]
# 各文書をスコアリング
filtered_docs = []
web_search = "No"
for d in documents:
score = retrieval_grader.invoke(
{"question": question, "document": d.page_content}
)
grade = score.binary_score
if grade == "yes":
print("---GRADE: DOCUMENT RELEVANT---")
filtered_docs.append(d)
else:
print("---GRADE: DOCUMENT NOT RELEVANT---")
web_search = "Yes"
continue
return {"documents": filtered_docs, "question": question, "web_search": web_search}
def transform_query(state):
"""
より良い質問を生成するためにクエリを変換します。
引数:
state (dict): 現在のグラフの状態
戻り値:
state (dict): 再構成された質問を含む「question」キーを更新した状態
"""
print("---TRANSFORM QUERY---")
question = state["question"]
documents = state["documents"]
# 質問を再作成
better_question = question_rewriter.invoke({"question": question})
return {"documents": documents, "question": better_question}
def web_search(state):
"""
再構成された質問を基にウェブ検索を行います。
引数:
state (dict): 現在のグラフの状態
戻り値:
state (dict): 追加されたウェブ結果を含む「documents」キーを更新した状態
"""
print("---WEB SEARCH---")
question = state["question"]
documents = state["documents"]
# ウェブ検索
docs = web_search_tool.invoke({"query": question})
print(docs)
web_results = "\n".join([d["snippet"] for d in docs])
web_results = Document(page_content=web_results)
documents.append(web_results)
return {"documents": documents, "question": question}
### エッジ
def decide_to_generate(state):
"""
回答を生成するか、質問を再生成するかを判断します。
引数:
state (dict): 現在のグラフの状態
戻り値:
str: 次に呼び出すノードのためのバイナリ決定
"""
print("---ASSESS GRADED DOCUMENTS---")
state["question"]
web_search = state["web_search"]
state["documents"]
if web_search == "Yes":
# すべての文書がフィルタリングされ、関連性がない場合、新しいクエリを生成する
print(
"---DECISION: ALL DOCUMENTS ARE NOT RELEVANT TO QUESTION, TRANSFORM QUERY---"
)
return "transform_query"
else:
# 関連する文書があるので、回答を生成
print("---DECISION: GENERATE---")
return "generate"
### グラフのコンパイル
from langgraph.graph import END, StateGraph, START
workflow = StateGraph(GraphState)
# Define the nodes
workflow.add_node("retrieve", retrieve) # retrieve
workflow.add_node("grade_documents", grade_documents) # grade documents
workflow.add_node("generate", generate) # generate
workflow.add_node("transform_query", transform_query) # transform_query
workflow.add_node("web_search_node", web_search) # web search
# Build graph
workflow.add_edge(START, "retrieve")
workflow.add_edge("retrieve", "grade_documents")
workflow.add_conditional_edges(
"grade_documents",
decide_to_generate,
{
"transform_query": "transform_query",
"generate": "generate",
},
)
workflow.add_edge("transform_query", "web_search_node")
workflow.add_edge("web_search_node", "generate")
workflow.add_edge("generate", END)
# Compile
app = workflow.compile()
作成されたグラフは以下となります。

このグラフへ、「紅はるかはどのような特徴がありますか?」と問い合わせをしてみます。
CRAGへ問い合わせをするコード(途中のログを出力)
from pprint import pprint
# Run
inputs = {"question": "紅はるかはどのような特徴がありますか?"}
for output in app.stream(inputs):
for key, value in output.items():
# Node
pprint(f"Node '{key}':")
# Optional: print full state at each node
pprint(value, indent=2, width=80, depth=None)
pprint("\n---\n")
# Final generation
pprint(value["generation"])
---RETRIEVE---
"Node 'retrieve':"
{ 'documents': [ Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='紅はるか(べにはるか) -'),
Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='紅赤(べにあか) - かつて関東地方の代表的な品種で、皮が鮮やかな赤紫色で細長いのが特徴。細すぎるのは繊維が多い。加熱すると中が濃い黄色になって甘味が強く、焼き芋や栗金団用に人気がある[25]。'),
Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='鳴門金時と同じ高系14号系の品種。「九州121号」と「春こがね」を交配させて誕生した。[24]名前の由来は、食味や外観が既存品種よりも「はるか」に優れていることから。甘味が強く、水分が多めで、蒸し芋や干し芋にすると美味しい[23]。農林水産省の統計によれば、紅はるかの全国作付け面積は2012年産で2037ヘクタール、20'),
Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='^ a b 舟和」芋ようかん値上げ\u3000「紅あずま」仕入れ難航\u3000焼き芋人気、「紅はるか」転作続々 朝日新聞、2024年2月2日閲覧\n\n^ a b c d e f g h i j k l 猪股慶子監修 成美堂出版編集部編 2012, p.\xa0107.\n\n^ “べにはるか | 農研機構”. www.naro.go.jp. 2024年7月31日閲覧。\n\n^ a b c d e f g h 講談社編 2013, p.\xa0184.')],
'question': '紅はるかはどのような特徴がありますか?'}
'\n---\n'
---CHECK DOCUMENT RELEVANCE TO QUESTION---
---GRADE: DOCUMENT RELEVANT---
---GRADE: DOCUMENT NOT RELEVANT---
---GRADE: DOCUMENT RELEVANT---
---GRADE: DOCUMENT RELEVANT---
---ASSESS GRADED DOCUMENTS---
---DECISION: ALL DOCUMENTS ARE NOT RELEVANT TO QUESTION, TRANSFORM QUERY---
"Node 'grade_documents':"
{ 'documents': [ Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='紅はるか(べにはるか) -'),
Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='鳴門金時と同じ高系14号系の品種。「九州121号」と「春こがね」を交配させて誕生した。[24]名前の由来は、食味や外観が既存品種よりも「はるか」に優れていることから。甘味が強く、水分が多めで、蒸し芋や干し芋にすると美味しい[23]。農林水産省の統計によれば、紅はるかの全国作付け面積は2012年産で2037ヘクタール、20'),
Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='^ a b 舟和」芋ようかん値上げ\u3000「紅あずま」仕入れ難航\u3000焼き芋人気、「紅はるか」転作続々 朝日新聞、2024年2月2日閲覧\n\n^ a b c d e f g h i j k l 猪股慶子監修 成美堂出版編集部編 2012, p.\xa0107.\n\n^ “べにはるか | 農研機構”. www.naro.go.jp. 2024年7月31日閲覧。\n\n^ a b c d e f g h 講談社編 2013, p.\xa0184.')],
'question': '紅はるかはどのような特徴がありますか?',
'web_search': 'Yes'}
'\n---\n'
---TRANSFORM QUERY---
"Node 'transform_query':"
{ 'documents': [ Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='紅はるか(べにはるか) -'),
Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='鳴門金時と同じ高系14号系の品種。「九州121号」と「春こがね」を交配させて誕生した。[24]名前の由来は、食味や外観が既存品種よりも「はるか」に優れていることから。甘味が強く、水分が多めで、蒸し芋や干し芋にすると美味しい[23]。農林水産省の統計によれば、紅はるかの全国作付け面積は2012年産で2037ヘクタール、20'),
Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='^ a b 舟和」芋ようかん値上げ\u3000「紅あずま」仕入れ難航\u3000焼き芋人気、「紅はるか」転作続々 朝日新聞、2024年2月2日閲覧\n\n^ a b c d e f g h i j k l 猪股慶子監修 成美堂出版編集部編 2012, p.\xa0107.\n\n^ “べにはるか | 農研機構”. www.naro.go.jp. 2024年7月31日閲覧。\n\n^ a b c d e f g h 講談社編 2013, p.\xa0184.')],
'question': '紅はるかの特徴や魅力について詳しく教えてください。'}
'\n---\n'
---WEB SEARCH---
[{'snippet': 'この記事では、さつまいもの品種「紅はるか」の特徴を解析し、その魅力と利用方法について紹介します。【さつまいも】紅はるかの基本... 【さつまいも】紅はるかの基本...', 'title': '【さつまいも】紅はるかの特徴:魅力を知り美味しさを堪能 ...', 'link': 'https://aonohenromichi2.com/archives/68'}, {'snippet': "今回は、紅はるかの〈産地・収穫時期・味わい・風味〉など特徴を〈紅あずま・安納芋〉など他の品種と比較して紹介します。 〈焼き芋・干し芋〉など、紅はるかの食べ方・レシピのおすすめも紹介するので参考にしてみてくださいね。 日本野菜ソムリエ協会認定料理教室「Kayo's Vegetable Laboratory」主宰。 野菜ソムリエpro・受験フードマイスター・... 紅はるかとは? どんなさつまいも? 紅はるかの味わい・食感は? 紅はるかと他の品種の違いは? 紅はるかとは? どんなさつまいも? 紅はるかという名前のさつまいもを、ここ数年お店で見かけることがありますが、どんな種類のさつまいもなのでしょうか。 ここでは、紅はるかの産地や収穫時期などを併せて紹介します。", 'title': '紅はるかの特徴は?産地や収穫時期は?味わい・糖度や食感 ...', 'link': 'https://chisou-media.jp/posts/3692'}, {'snippet': 'まずは、紅はるかとはどんなさつまいもなのか、その特徴を詳しく見ていきましょう!味や食感 紅はるかの最大の特徴は甘さです。麦芽糖の割合が高く、濃厚な甘みでありながら後味はすっきりしています。特に焼き芋にすると、蜜のようなコク', 'title': '【紅はるか】味や食感の特徴、他の品種との違いを徹底解説 ...', 'link': 'https://ja-hitachi.sanchoku-prime.com/blog/sweetpotato-beniharuka'}, {'snippet': 'ここでは、紅はるかと紅あずまの特徴について詳しく解説します。 紅はるかの特徴 紅はるかは2010年に登録された新しい品種で、「(他の品種と比べて)はるかに優れている」ということから紅はるかと名付けられました。', 'title': '紅はるかと紅あずまの違いを徹底比較!見た目や糖度・食べ方 ...', 'link': 'https://hoshiimo-online.shop-pro.jp/apps/note/beniharuka-beniazuma/'}]
"Node 'web_search_node':"
{ 'documents': [ Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='紅はるか(べにはるか) -'),
Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='鳴門金時と同じ高系14号系の品種。「九州121号」と「春こがね」を交配させて誕生した。[24]名前の由来は、食味や外観が既存品種よりも「はるか」に優れていることから。甘味が強く、水分が多めで、蒸し芋や干し芋にすると美味しい[23]。農林水産省の統計によれば、紅はるかの全国作付け面積は2012年産で2037ヘクタール、20'),
Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='^ a b 舟和」芋ようかん値上げ\u3000「紅あずま」仕入れ難航\u3000焼き芋人気、「紅はるか」転作続々 朝日新聞、2024年2月2日閲覧\n\n^ a b c d e f g h i j k l 猪股慶子監修 成美堂出版編集部編 2012, p.\xa0107.\n\n^ “べにはるか | 農研機構”. www.naro.go.jp. 2024年7月31日閲覧。\n\n^ a b c d e f g h 講談社編 2013, p.\xa0184.'),
Document(metadata={}, page_content="この記事では、さつまいもの品種「紅はるか」の特徴を解析し、その魅力と利用方法について紹介します。【さつまいも】紅はるかの基本... 【さつまいも】紅はるかの基本...\n今回は、紅はるかの〈産地・収穫時期・味わい・風味〉など特徴を〈紅あずま・安納芋〉など他の品種と比較して紹介します。 〈焼き芋・干し芋〉など、紅はるかの食べ方・レシピのおすすめも紹介するので参考にしてみてくださいね。 日本野菜ソムリエ協会認定料理教室「Kayo's Vegetable Laboratory」主宰。 野菜ソムリエpro・受験フードマイスター・... 紅はるかとは? どんなさつまいも? 紅はるかの味わい・食感は? 紅はるかと他の品種の違いは? 紅はるかとは? どんなさつまいも? 紅はるかという名前のさつまいもを、ここ数年お店で見かけることがありますが、どんな種類のさつまいもなのでしょうか。 ここでは、紅はるかの産地や収穫時期などを併せて紹介します。\nまずは、紅はるかとはどんなさつまいもなのか、その特徴を詳しく見ていきましょう!味や食感 紅はるかの最大の特徴は甘さです。麦芽糖の割合が高く、濃厚な甘みでありながら後味はすっきりしています。特に焼き芋にすると、蜜のようなコク\nここでは、紅はるかと紅あずまの特徴について詳しく解説します。 紅はるかの特徴 紅はるかは2010年に登録された新しい品種で、「(他の品種と比べて)はるかに優れている」ということから紅はるかと名付けられました。")],
'question': '紅はるかの特徴や魅力について詳しく教えてください。'}
'\n---\n'
---GENERATE---
"Node 'generate':"
{ 'documents': [ Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='紅はるか(べにはるか) -'),
Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='鳴門金時と同じ高系14号系の品種。「九州121号」と「春こがね」を交配させて誕生した。[24]名前の由来は、食味や外観が既存品種よりも「はるか」に優れていることから。甘味が強く、水分が多めで、蒸し芋や干し芋にすると美味しい[23]。農林水産省の統計によれば、紅はるかの全国作付け面積は2012年産で2037ヘクタール、20'),
Document(metadata={'language': 'ja', 'source': 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%84%E3%83%9E%E3%82%A4%E3%83%A2', 'title': 'サツマイモ - Wikipedia'}, page_content='^ a b 舟和」芋ようかん値上げ\u3000「紅あずま」仕入れ難航\u3000焼き芋人気、「紅はるか」転作続々 朝日新聞、2024年2月2日閲覧\n\n^ a b c d e f g h i j k l 猪股慶子監修 成美堂出版編集部編 2012, p.\xa0107.\n\n^ “べにはるか | 農研機構”. www.naro.go.jp. 2024年7月31日閲覧。\n\n^ a b c d e f g h 講談社編 2013, p.\xa0184.'),
Document(metadata={}, page_content="この記事では、さつまいもの品種「紅はるか」の特徴を解析し、その魅力と利用方法について紹介します。【さつまいも】紅はるかの基本... 【さつまいも】紅はるかの基本...\n今回は、紅はるかの〈産地・収穫時期・味わい・風味〉など特徴を〈紅あずま・安納芋〉など他の品種と比較して紹介します。 〈焼き芋・干し芋〉など、紅はるかの食べ方・レシピのおすすめも紹介するので参考にしてみてくださいね。 日本野菜ソムリエ協会認定料理教室「Kayo's Vegetable Laboratory」主宰。 野菜ソムリエpro・受験フードマイスター・... 紅はるかとは? どんなさつまいも? 紅はるかの味わい・食感は? 紅はるかと他の品種の違いは? 紅はるかとは? どんなさつまいも? 紅はるかという名前のさつまいもを、ここ数年お店で見かけることがありますが、どんな種類のさつまいもなのでしょうか。 ここでは、紅はるかの産地や収穫時期などを併せて紹介します。\nまずは、紅はるかとはどんなさつまいもなのか、その特徴を詳しく見ていきましょう!味や食感 紅はるかの最大の特徴は甘さです。麦芽糖の割合が高く、濃厚な甘みでありながら後味はすっきりしています。特に焼き芋にすると、蜜のようなコク\nここでは、紅はるかと紅あずまの特徴について詳しく解説します。 紅はるかの特徴 紅はるかは2010年に登録された新しい品種で、「(他の品種と比べて)はるかに優れている」ということから紅はるかと名付けられました。")],
'generation': '紅はるかは、さつまいもの品種の一つで、2010年に登録された比較的新しい品種です。その名前は、他の品種と比べて「はるかに優れている」という意味から来ています。以下に紅はるかの特徴や魅力を詳しく説明します。\n'
'\n'
'1. **甘さ**: '
'紅はるかの最大の特徴はその甘さです。麦芽糖の割合が高く、濃厚な甘みを持ちながら、後味はすっきりしています。このため、特に焼き芋にすると、蜜のようなコクが楽しめます。\n'
'\n'
'2. **水分量**: 紅はるかは水分が多めで、蒸し芋や干し芋にすると非常に美味しいとされています。\n'
'\n'
'3. **外観と食味**: '
'食味や外観が既存の品種よりも優れていることが特徴で、特に焼き芋や干し芋としての利用が推奨されています。\n'
'\n'
'4. **作付け面積**: '
'農林水産省の統計によると、紅はるかの全国作付け面積は2012年産で2037ヘクタールに達しており、人気の品種であることが示されています。\n'
'\n'
'5. **利用方法**: '
'紅はるかは焼き芋や干し芋としての食べ方が特におすすめで、他の品種と比較してもその味わいが際立っています。\n'
'\n'
'紅はるかはその甘さや食感、利用方法の多様性から、多くの人に愛されているさつまいもです。',
'question': '紅はるかの特徴や魅力について詳しく教えてください。'}
'\n---\n'
この出力から、以下のような処理の流れが読み取れます:
-
---RETRIEVE---のnodeでベクトルDBから関連文書を4件取得 - 2件目のみ"紅赤(べにあか)"に関するドキュメントのため関連が無い(
---GRADE: DOCUMENT NOT RELEVANT---)と判定され、次のnodeへ渡す際にはそれ以外の3件のみとなっています。 -
---TRANSFORM QUERY---のnodeでは、元のクエリ「紅はるかはどのような特徴がありますか?」からweb検索でより良い情報を検索できるようなクエリ「紅はるかの特徴や魅力について詳しく教えてください。」へ変換されています。 -
---WEB SEARCH---nodeで検索した結果を関連文書のリストに加えて -
---GENERATE---nodeで以下のような最終回答を生成しています。
紅はるかは、さつまいもの品種の一つで、2010年に登録された比較的新しい品種です。その名前は、他の品種と比べて「はるかに優れている」という意味から来ています。以下に紅はるかの特徴や魅力を詳しく説明します。
1. **甘さ**: 紅はるかの最大の特徴はその甘さです。麦芽糖の割合が高く、濃厚な甘みを持ちながら、後味はすっきりしています。このため、特に焼き芋にすると、蜜のようなコクが楽しめます。
2. **水分量**: 紅はるかは水分が多めで、蒸し芋や干し芋にすると非常に美味しいとされています。
3. **外観と食味**: 食味や外観が既存の品種よりも優れていることが特徴で、特に焼き芋や干し芋としての利用が推奨されています。
4. **作付け面積**: 農林水産省の統計によると、紅はるかの全国作付け面積は2012年産で2037ヘクタールに達しており、人気の品種であることが示されています。
5. **利用方法**: 紅はるかは焼き芋や干し芋としての食べ方が特におすすめで、他の品種と比較してもその味わいが際立っています。
紅はるかはその甘さや食感、利用方法の多様性から、多くの人に愛されているさつまいもです。
事前にwikipediaから取得して保存していた紅はるかの特徴だけでなく、web検索で取得した情報を追加する形で最終回答が生成されました。
参考
- https://github.com/langchain-ai/rag-from-scratch/blob/main/rag_from_scratch_15_to_18.ipynb
- https://arxiv.org/pdf/2402.03367
- https://cohere.com/blog/rerank
- https://cohere.com/blog/rerank-3pt5
- https://python.langchain.com/docs/integrations/retrievers/cohere-reranker/#doing-reranking-with-coherererank
- https://python.langchain.com/docs/integrations/document_transformers/rankllm-reranker/
- https://cohere.com/blog/introducing-rerank-3-on-microsoft-azure-ai
- https://docs.llamaindex.ai/en/stable/examples/node_postprocessor/rankGPT/
- https://arxiv.org/pdf/2401.15884
- https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_crag.ipynb
Discussion