import%20marimo%0A%0A__generated_with%20%3D%20%220.20.4%22%0Aapp%20%3D%20marimo.App()%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20os%0A%20%20%20%20from%20operator%20import%20itemgetter%0A%0A%20%20%20%20import%20bs4%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20torch%0A%20%20%20%20from%20langchain_chroma%20import%20Chroma%0A%20%20%20%20from%20langchain_community.document_loaders%20import%20WebBaseLoader%0A%20%20%20%20from%20langchain_core.documents%20import%20Document%0A%20%20%20%20from%20langchain_core.load%20import%20dumps%2C%20loads%0A%20%20%20%20from%20langchain_core.output_parsers%20import%20StrOutputParser%0A%20%20%20%20from%20langchain_core.prompts%20import%20ChatPromptTemplate%0A%20%20%20%20from%20langchain_core.retrievers%20import%20BaseRetriever%0A%20%20%20%20from%20langchain_core.runnables%20import%20RunnablePassthrough%0A%20%20%20%20from%20langchain_openai%20import%20ChatOpenAI%2C%20OpenAIEmbeddings%0A%20%20%20%20from%20langchain_text_splitters%20import%20RecursiveCharacterTextSplitter%0A%20%20%20%20from%20pydantic%20import%20ConfigDict%0A%20%20%20%20from%20sentence_transformers%20import%20CrossEncoder%0A%0A%20%20%20%20OPENROUTER_BASE_URL%20%3D%20%22https%3A%2F%2Fopenrouter.ai%2Fapi%2Fv1%22%0A%20%20%20%20DEFAULT_CHAT_MODEL%20%3D%20os.environ.get(%22MODEL%22%2C%20%22openai%2Fgpt-5-nano%22)%0A%20%20%20%20DEFAULT_EMBEDDING_MODEL%20%3D%20os.environ.get(%0A%20%20%20%20%20%20%20%20%22EMBEDDING_MODEL%22%2C%20%22openai%2Ftext-embedding-3-small%22%0A%20%20%20%20)%0A%20%20%20%20DEFAULT_CHAT_TIKTOKEN_MODEL%20%3D%20os.environ.get(%22TIKTOKEN_CHAT_MODEL%22%2C%20%22gpt-4o-mini%22)%0A%20%20%20%20DEFAULT_EMBEDDING_TIKTOKEN_MODEL%20%3D%20os.environ.get(%0A%20%20%20%20%20%20%20%20%22TIKTOKEN_EMBEDDING_MODEL%22%2C%20%22text-embedding-3-small%22%0A%20%20%20%20)%0A%0A%20%20%20%20def%20make_chat_model()%3A%0A%20%20%20%20%20%20%20%20return%20ChatOpenAI(%0A%20%20%20%20%20%20%20%20%20%20%20%20model_name%3DDEFAULT_CHAT_MODEL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20openai_api_base%3DOPENROUTER_BASE_URL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20openai_api_key%3Dos.environ.get(%22OPENROUTER_API_KEY%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20temperature%3D0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tiktoken_model_name%3DDEFAULT_CHAT_TIKTOKEN_MODEL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_retries%3D0%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20def%20make_embeddings()%3A%0A%20%20%20%20%20%20%20%20return%20OpenAIEmbeddings(%0A%20%20%20%20%20%20%20%20%20%20%20%20model%3DDEFAULT_EMBEDDING_MODEL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20openai_api_base%3DOPENROUTER_BASE_URL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20openai_api_key%3Dos.environ.get(%22OPENROUTER_API_KEY%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tiktoken_model_name%3DDEFAULT_EMBEDDING_TIKTOKEN_MODEL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20check_embedding_ctx_length%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tiktoken_enabled%3DFalse%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20def%20format_docs(docs)%3A%0A%20%20%20%20%20%20%20%20return%20%22%5Cn%5Cn%22.join(doc.page_content%20for%20doc%20in%20docs)%0A%0A%20%20%20%20def%20load_rag_prompt()%3A%0A%20%20%20%20%20%20%20%20%22%22%22Local%20copy%20of%20the%20LangChain%20Hub%20prompt%20%60rlm%2Frag-prompt%60.%0A%0A%20%20%20%20%20%20%20%20The%20original%20notebooks%20pulled%20this%20at%20runtime%20with%0A%20%20%20%20%20%20%20%20%60hub.pull(%22rlm%2Frag-prompt%22)%60.%20It%20is%20reproduced%20here%20so%20the%20notebook%0A%20%20%20%20%20%20%20%20does%20not%20depend%20on%20the%20Hub%20being%20reachable%2C%20and%20so%20the%20exact%20wording%0A%20%20%20%20%20%20%20%20is%20visible.%20See%20https%3A%2F%2Fsmith.langchain.com%2Fhub%2Frlm%2Frag-prompt%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20return%20ChatPromptTemplate.from_messages(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22system%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22You%20are%20an%20assistant%20for%20question-answering%20tasks.%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Use%20the%20following%20pieces%20of%20retrieved%20context%20to%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22answer%20the%20question.%20If%20you%20don't%20know%20the%20answer%2C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22just%20say%20that%20you%20don't%20know.%20Use%20three%20sentences%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22maximum%20and%20keep%20the%20answer%20concise.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(%22human%22%2C%20%22Question%3A%20%7Bquestion%7D%5CnContext%3A%20%7Bcontext%7D%5CnAnswer%3A%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20def%20split_queries(text%3A%20str)%20-%3E%20list%5Bstr%5D%3A%0A%20%20%20%20%20%20%20%20%22%22%22Split%20generated%20queries%20into%20lines%2C%20dropping%20blank%20ones.%0A%0A%20%20%20%20%20%20%20%20The%20model%20often%20separates%20queries%20with%20blank%20lines.%20Without%20this%0A%20%20%20%20%20%20%20%20filtering%20the%20empty%20strings%20reach%20the%20embedding%20API%2C%20which%20rejects%0A%20%20%20%20%20%20%20%20them%20with%20HTTP%20400%20(%60expected%20string%20to%20have%20%3E%3D1%20characters%60).%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20return%20%5Bline.strip()%20for%20line%20in%20text.split(%22%5Cn%22)%20if%20line.strip()%5D%0A%0A%20%20%20%20def%20rerank_with_cross_encoder(question%3A%20str%2C%20docs%2C%20top_n%3A%20int%20%3D%203)%3A%0A%20%20%20%20%20%20%20%20if%20not%20docs%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20model_name%20%3D%20os.environ.get(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22RERANK_MODEL%22%2C%20%22cross-encoder%2Fms-marco-MiniLM-L-6-v2%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20device%20%3D%20%22cuda%22%20if%20torch.cuda.is_available()%20else%20%22cpu%22%0A%20%20%20%20%20%20%20%20cross_encoder%20%3D%20CrossEncoder(model_name%2C%20device%3Ddevice)%0A%0A%20%20%20%20%20%20%20%20pairs%20%3D%20%5B(question%2C%20doc.page_content)%20for%20doc%20in%20docs%5D%0A%20%20%20%20%20%20%20%20scores%20%3D%20cross_encoder.predict(pairs)%0A%0A%20%20%20%20%20%20%20%20ranked_docs%20%3D%20sorted(%0A%20%20%20%20%20%20%20%20%20%20%20%20zip(docs%2C%20scores)%2C%20key%3Dlambda%20item%3A%20item%5B1%5D%2C%20reverse%3DTrue%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20reranked_docs%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20source_doc%2C%20score%20in%20ranked_docs%5B%3Atop_n%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20reranked_docs.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Document(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20page_content%3Dsource_doc.page_content%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20metadata%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20**source_doc.metadata%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22relevance_score%22%3A%20float(score)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20return%20reranked_docs%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20RAG%E3%82%92%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%EF%BC%9A%E6%A4%9C%E7%B4%A2%0A%0A%20%20%20%20!%5B%E6%A4%9C%E7%B4%A2%E3%81%AE%E6%A6%82%E8%A6%81%5D(.%2Fimgs%2Fretrieval_overview.png)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E5%85%B1%E9%80%9A%E9%83%A8%E5%93%81%0A%0A%20%20%20%20%E5%86%92%E9%A0%AD%E3%81%AE%20%60with%20app.setup%60%20%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%EF%BC%88marimo%E4%B8%8A%E3%81%A7%E3%81%AF%E6%8A%98%E3%82%8A%E3%81%9F%E3%81%9F%E3%81%BE%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%EF%BC%89%E3%81%A7%E3%80%81%E4%BB%A5%E4%B8%8B%E3%81%AE%E5%85%B1%E9%80%9A%E9%83%A8%E5%93%81%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E5%90%84%E3%83%91%E3%83%BC%E3%83%88%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%BB%E3%83%AB%E3%81%AF%E3%81%93%E3%82%8C%E3%82%89%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20%60make_chat_model()%60%EF%BC%9A%E5%9B%9E%E7%AD%94%E7%94%9F%E6%88%90%E7%94%A8%E3%81%AE%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%A2%E3%83%87%E3%83%AB%E3%80%82OpenRouter%E7%B5%8C%E7%94%B1%E3%81%A7%20%60openai%2Fgpt-5-nano%60%EF%BC%88%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%20%60MODEL%60%20%E3%81%A7%E5%A4%89%E6%9B%B4%E5%8F%AF%EF%BC%89%E3%82%92%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82%E5%87%BA%E5%8A%9B%E3%82%92%E5%AE%89%E5%AE%9A%E3%81%95%E3%81%9B%E3%82%8B%E3%81%9F%E3%82%81%20%60temperature%3D0%60%20%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%80%81%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%81%A7%E3%81%AF%E5%86%8D%E8%A9%A6%E8%A1%8C%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%20%60max_retries%3D0%60%20%E3%82%82%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20-%20%60make_embeddings()%60%EF%BC%9A%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%80%82%E6%97%A2%E5%AE%9A%E3%81%AF%20%60openai%2Ftext-embedding-3-small%60%20%E3%81%A7%E3%81%99%E3%80%82OpenRouter%E3%81%AFOpenAI%E4%BA%92%E6%8F%9B%E3%81%A7%E3%81%99%E3%81%8C%E3%83%88%E3%83%BC%E3%82%AF%E3%83%8A%E3%82%A4%E3%82%B6%E6%83%85%E5%A0%B1%E3%82%92%E8%BF%94%E3%81%95%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E5%81%B4%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%95%B0%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E7%84%A1%E5%8A%B9%E5%8C%96%EF%BC%88%60check_embedding_ctx_length%3DFalse%60%20%2F%20%60tiktoken_enabled%3DFalse%60%EF%BC%89%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20-%20%60format_docs(docs)%60%EF%BC%9A%60Document%60%20%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E3%80%81%E6%9C%AC%E6%96%87%E3%82%92%E7%A9%BA%E8%A1%8C2%E3%81%A4%E3%81%A7%E3%81%A4%E3%81%AA%E3%81%84%E3%81%A01%E3%81%A4%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%82%92%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%20%60%7Bcontext%7D%60%20%E3%81%B8%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%80%E3%81%9F%E3%82%81%E3%81%AB%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20-%20%60load_rag_prompt()%60%EF%BC%9ALangChain%20Hub%E3%81%AE%20%60rlm%2Frag-prompt%60%20%E3%81%A8%E5%90%8C%E3%81%98%E5%86%85%E5%AE%B9%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%80%82%E5%85%83%E3%83%8E%E3%83%BC%E3%83%88%E3%81%AF%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%20%60hub.pull()%60%20%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8C%E3%80%81%E5%A4%96%E9%83%A8%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%B8%E3%81%AE%E4%BE%9D%E5%AD%98%E3%82%92%E9%81%BF%E3%81%91%E3%80%81%E3%81%8B%E3%81%A4%E6%96%87%E9%9D%A2%E3%82%92%E3%81%9D%E3%81%AE%E5%A0%B4%E3%81%A7%E8%AA%AD%E3%82%81%E3%82%8B%E3%82%88%E3%81%86%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%B8%E5%86%99%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20-%20%60split_queries(text)%60%EF%BC%9ALLM%E3%81%8C%E7%94%9F%E6%88%90%E3%81%97%E3%81%9F%E8%A4%87%E6%95%B0%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E6%94%B9%E8%A1%8C%E3%81%A7%E5%88%86%E5%89%B2%E3%81%97%E3%80%81%E7%A9%BA%E8%A1%8C%E3%82%92%E9%99%A4%E3%81%84%E3%81%9F%20%60list%5Bstr%5D%60%20%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E7%A9%BA%E6%96%87%E5%AD%97%E5%88%97%E3%81%8C%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BFAPI%E3%81%B8%E6%B8%A1%E3%82%89%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E5%89%8D%E5%87%A6%E7%90%86%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%81%AE%E4%B8%AD%E5%BF%83%E3%81%A8%E3%81%AA%E3%82%8B%E8%87%AA%E4%BD%9C%E9%96%A2%E6%95%B0%20%60rerank_with_cross_encoder(question%2C%20docs%2C%20top_n%3D3)%60%20%E3%81%AF%E3%80%81%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E6%A4%9C%E7%B4%A2%E3%81%A7%E5%BE%97%E3%81%9F%E5%80%99%E8%A3%9C%E3%82%92CrossEncoder%E3%81%A7%E5%86%8D%E8%A9%95%E4%BE%A1%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20%E5%85%A5%E5%8A%9B%EF%BC%9A%E8%B3%AA%E5%95%8F%E6%96%87%E5%AD%97%E5%88%97%20%60question%60%E3%80%81%60Document%60%20%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%20%60docs%60%E3%80%81%E6%AE%8B%E3%81%99%E4%BB%B6%E6%95%B0%20%60top_n%60%0A%20%20%20%20-%20%E3%83%A2%E3%83%87%E3%83%AB%EF%BC%9A%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%20%60RERANK_MODEL%60%20%E3%81%A7%E6%8C%87%E5%AE%9A%E3%81%97%E3%80%81%E6%97%A2%E5%AE%9A%E3%81%AF%20%60cross-encoder%2Fms-marco-MiniLM-L-6-v2%60%20%E3%81%A7%E3%81%99%E3%80%82%60sentence-transformers%60%20%E3%81%AE%20%60CrossEncoder%60%20%E3%82%92%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E8%BF%BD%E5%8A%A0%E3%81%AEAPI%E3%82%AD%E3%83%BC%E3%81%AF%E4%B8%8D%E8%A6%81%E3%81%A7%E3%81%99%0A%20%20%20%20-%20%E5%AE%9F%E8%A1%8C%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%EF%BC%9A%60torch.cuda.is_available()%60%20%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81GPU%E3%81%8C%E3%81%82%E3%82%8C%E3%81%B0%20%60cuda%60%E3%80%81%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%20%60cpu%60%20%E3%82%92%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%0A%20%20%20%20-%20%E5%87%A6%E7%90%86%EF%BC%9A%60(%E8%B3%AA%E5%95%8F%2C%20%E6%96%87%E6%9B%B8%E6%9C%AC%E6%96%87)%60%20%E3%81%AE%E3%83%9A%E3%82%A2%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%60predict()%60%20%E3%81%A7%E9%96%A2%E9%80%A3%E5%BA%A6%E3%82%B9%E3%82%B3%E3%82%A2%E3%82%92%E7%AE%97%E5%87%BA%E3%81%97%E3%81%A6%E9%99%8D%E9%A0%86%E3%81%AB%E4%B8%A6%E3%81%B9%E3%81%BE%E3%81%99%0A%20%20%20%20-%20%E5%87%BA%E5%8A%9B%EF%BC%9A%E4%B8%8A%E4%BD%8D%20%60top_n%60%20%E4%BB%B6%E3%82%92%E3%80%81%60metadata%5B%22relevance_score%22%5D%60%20%E3%81%AB%E3%82%B9%E3%82%B3%E3%82%A2%E3%82%92%E6%8C%81%E3%81%9F%E3%81%9B%E3%81%9F%E6%96%B0%E3%81%97%E3%81%84%20%60Document%60%20%E3%81%A8%E3%81%97%E3%81%A6%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E5%85%83%E3%81%AE%20%60Document%60%20%E3%81%AF%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%0A%20%20%20%20-%20%E6%B3%A8%E6%84%8F%EF%BC%9A%60docs%60%20%E3%81%8C%E7%A9%BA%E3%81%AA%E3%82%89%E7%A9%BA%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%83%91%E3%83%BC%E3%83%8815%EF%BC%9A%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%0A%0A%20%20%20%20%E6%9C%80%E5%88%9D%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%81%A7%E3%81%AF%E5%80%99%E8%A3%9C%E3%82%92%E5%BA%83%E3%82%81%E3%81%AB%E5%8F%96%E5%BE%97%E3%81%97%E3%80%81%E3%82%88%E3%82%8A%E7%B2%BE%E5%AF%86%E3%81%AA%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E8%B3%AA%E5%95%8F%E3%81%A8%E3%81%AE%E9%96%A2%E9%80%A3%E5%BA%A6%E3%82%92%E5%86%8D%E8%A9%95%E4%BE%A1%E3%81%97%E3%81%A6%E4%B8%8A%E4%BD%8D%E3%81%A0%E3%81%91%E3%82%92%E6%AE%8B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82RAG-Fusion%E3%81%8C%E8%A4%87%E6%95%B0%E3%81%AE%E6%A4%9C%E7%B4%A2%E9%A0%86%E4%BD%8D%E3%82%92%E7%B5%B1%E5%90%88%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AB%E5%AF%BE%E3%81%97%E3%80%81%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%AF%E8%B3%AA%E5%95%8F%E3%81%A8%E5%90%84%E5%80%99%E8%A3%9C%E6%96%87%E6%9B%B8%E3%82%92%E7%9B%B4%E6%8E%A5%E6%AF%94%E8%BC%83%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20!%5B%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%AE%E6%B5%81%E3%82%8C%5D(.%2Fimgs%2Fre-ranking.png)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%91%E3%83%BC%E3%83%8815%E3%81%A7%E4%BD%BF%E3%81%86%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E5%85%83%E3%81%AB%E3%81%AA%E3%82%8B%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%83%96%E3%83%AD%E3%82%B0%E8%A8%98%E4%BA%8B%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%80%81HTML%E3%81%AE%E6%9C%AC%E6%96%87%E5%91%A8%E8%BE%BA%E3%81%A0%E3%81%91%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%9F%BA%E6%BA%96%E3%81%A7%E5%88%86%E5%89%B2%E3%81%97%E3%80%81%E5%88%86%E5%89%B2%E5%BE%8C%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E6%95%B0%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20%E3%83%87%E3%83%BC%E3%82%BF%EF%BC%9ALilian%20Weng%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E8%A8%98%E4%BA%8B%20%5BLLM%20Powered%20Autonomous%20Agents%5D(https%3A%2F%2Flilianweng.github.io%2Fposts%2F2023-06-23-agent%2F)%0A%20%20%20%20-%20HTML%E3%81%AE%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%81%BF%EF%BC%9A%60bs4.SoupStrainer%60%20%E3%81%A7%20%60post-content%60%20%2F%20%60post-title%60%20%2F%20%60post-header%60%20%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E8%A6%81%E7%B4%A0%E3%81%A0%E3%81%91%E3%82%92%E8%A7%A3%E6%9E%90%E5%AF%BE%E8%B1%A1%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%0A%20%20%20%20-%20%E5%89%8D%E5%87%A6%E7%90%86%EF%BC%9A%60RecursiveCharacterTextSplitter.from_tiktoken_encoder()%60%20%2F%20%60chunk_size%3D300%60%2C%20%60chunk_overlap%3D50%60%EF%BC%88%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%9F%BA%E6%BA%96%EF%BC%89%0A%20%20%20%20-%20%E5%87%BA%E5%8A%9B%EF%BC%9A%60document_chunks%60%20%3D%20%E5%88%86%E5%89%B2%E5%BE%8C%E3%81%AE%20%60Document%60%20%E3%83%AA%E3%82%B9%E3%83%88%EF%BC%88%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E6%95%B0%E5%80%A4%E3%81%8C%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E6%95%B0%EF%BC%89%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%23%23%23%20INDEXING%20%23%23%23%23%0A%20%20%20%20blog_loader%20%3D%20WebBaseLoader(%0A%20%20%20%20%20%20%20%20web_paths%3D(%22https%3A%2F%2Flilianweng.github.io%2Fposts%2F2023-06-23-agent%2F%22%2C)%2C%0A%20%20%20%20%20%20%20%20bs_kwargs%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22parse_only%22%3A%20bs4.SoupStrainer(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20class_%3D(%22post-content%22%2C%20%22post-title%22%2C%20%22post-header%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20)%0A%20%20%20%20blog_documents%20%3D%20blog_loader.load()%0A%0A%20%20%20%20text_splitter%20%3D%20RecursiveCharacterTextSplitter.from_tiktoken_encoder(%0A%20%20%20%20%20%20%20%20chunk_size%3D300%2C%0A%20%20%20%20%20%20%20%20chunk_overlap%3D50%2C%0A%20%20%20%20)%0A%20%20%20%20document_chunks%20%3D%20text_splitter.split_documents(blog_documents)%0A%20%20%20%20len(document_chunks)%0A%20%20%20%20return%20(document_chunks%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%88%86%E5%89%B2%E3%81%97%E3%81%9F%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%97%E3%80%81Chroma%E3%81%B8%E7%99%BB%E9%8C%B2%E3%81%97%E3%81%A6%E6%A4%9C%E7%B4%A2%E7%94%A8%E3%81%AE%E3%83%AA%E3%83%88%E3%83%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60retriever%60%20%E3%81%A8%20%60vectorstore%60%20%E3%81%AE%E4%B8%A1%E6%96%B9%E3%82%92%E8%BF%94%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%AF%E3%80%81%E5%BE%8C%E6%AE%B5%E3%81%A7%E5%90%8C%E3%81%98DB%E3%81%8B%E3%82%89%20%60k%3D10%60%20%E3%81%AE%E5%88%A5%E3%83%AA%E3%83%88%E3%83%AA%E3%83%BC%E3%83%90%E3%83%BC%20%60candidate_retriever%60%20%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20%E3%83%87%E3%83%BC%E3%82%BF%EF%BC%9A%60document_chunks%60%EF%BC%88Lilian%20Weng%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E8%A8%98%E4%BA%8B%E3%82%92300%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%8D%98%E4%BD%8D%E3%81%A7%E5%88%86%E5%89%B2%E3%81%97%E3%81%9F%20%60Document%60%20%E3%83%AA%E3%82%B9%E3%83%88%EF%BC%89%0A%20%20%20%20-%20%E5%89%8D%E5%87%A6%E7%90%86%EF%BC%9A%E5%89%8D%E3%82%BB%E3%83%AB%E3%81%A7%E4%BD%9C%E6%88%90%E6%B8%88%E3%81%BF%EF%BC%88%60chunk_size%3D300%60%2C%20%60chunk_overlap%3D50%60%E3%80%81%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%9F%BA%E6%BA%96%EF%BC%89%0A%20%20%20%20-%20DB%EF%BC%9AChroma%E3%80%82%60persist_directory%60%20%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81**%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%A2%E3%83%AA**%E3%81%A7%E3%81%99%0A%20%20%20%20-%20%E5%87%BA%E5%8A%9B%EF%BC%9A%60retriever%60%20%3D%20%E6%97%A2%E5%AE%9A%E8%A8%AD%E5%AE%9A%EF%BC%88%E9%A1%9E%E4%BC%BC%E5%BA%A6%E6%A4%9C%E7%B4%A2%E3%83%BB%60k%3D4%60%EF%BC%89%E3%81%AE%E3%83%AA%E3%83%88%E3%83%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%80%81%60vectorstore%60%20%3D%20Chroma%E3%81%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%B9%E3%83%88%E3%82%A2%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(document_chunks)%3A%0A%20%20%20%20vectorstore%20%3D%20Chroma.from_documents(%0A%20%20%20%20%20%20%20%20documents%3Ddocument_chunks%2C%0A%20%20%20%20%20%20%20%20embedding%3Dmake_embeddings()%2C%0A%20%20%20%20)%0A%20%20%20%20retriever%20%3D%20vectorstore.as_retriever()%0A%20%20%20%20return%20retriever%2C%20vectorstore%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83%E7%94%A8%E3%83%99%E3%83%BC%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%A8%E3%81%97%E3%81%A6%E3%80%81%E3%83%91%E3%83%BC%E3%83%886%E3%81%AERAG-Fusion%E3%81%A8%E5%90%8C%E6%A7%98%E3%81%AE%E9%83%A8%E5%93%81%E3%82%92%E3%81%93%E3%81%93%E3%81%A7%E5%86%8D%E6%8E%B2%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E6%9C%80%E5%88%9D%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%80%8C1%E3%81%A4%E3%81%AE%E8%B3%AA%E5%95%8F%E3%81%8B%E3%82%894%E3%81%A4%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E3%80%8D%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%A2%E3%83%87%E3%83%AB%E3%80%81%E6%96%87%E5%AD%97%E5%88%97%E3%83%91%E3%83%BC%E3%82%B5%E3%83%BC%E3%80%81%60split_queries%60%20%E3%82%92%E3%81%A4%E3%81%AA%E3%81%84%E3%81%A7%E3%82%AF%E3%82%A8%E3%83%AA%E7%94%9F%E6%88%90%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20%E5%85%A5%E5%8A%9B%EF%BC%9A%60%7Bquestion%7D%60%20%E3%81%AB%E5%85%A5%E3%82%8B%E8%B3%AA%E5%95%8F%E6%96%87%E5%AD%97%E5%88%97%0A%20%20%20%20-%20%E5%87%A6%E7%90%86%EF%BC%9ALLM%E3%81%AB%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B4%E3%81%A4%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%92%E7%94%9F%E6%88%90%E3%81%95%E3%81%9B%E3%80%81%E6%94%B9%E8%A1%8C%E5%8C%BA%E5%88%87%E3%82%8A%E3%81%AE%E5%87%BA%E5%8A%9B%E3%81%8B%E3%82%89%E7%A9%BA%E8%A1%8C%E3%82%92%E9%99%A4%E3%81%8D%E3%81%BE%E3%81%99%0A%20%20%20%20-%20%E5%87%BA%E5%8A%9B%EF%BC%9A%60rag_fusion_prompt%60%20%3D%20%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%80%81%60rag_fusion_query_generator%60%20%3D%204%E3%81%A4%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%92%E8%BF%94%E3%81%99%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20RAG-Fusion%0A%20%20%20%20rag_fusion_template%20%3D%20%22%22%22You%20are%20a%20helpful%20assistant%20that%20generates%20multiple%20search%20queries%20based%20on%20a%20single%20input%20query.%20%5Cn%0A%20%20%20%20Generate%20multiple%20search%20queries%20related%20to%3A%20%7Bquestion%7D%20%5Cn%0A%20%20%20%20Output%20(4%20queries)%3A%22%22%22%0A%20%20%20%20rag_fusion_prompt%20%3D%20ChatPromptTemplate.from_template(rag_fusion_template)%0A%20%20%20%20return%20(rag_fusion_prompt%2C)%0A%0A%0A%40app.cell%0Adef%20_(rag_fusion_prompt)%3A%0A%20%20%20%20rag_fusion_query_generator%20%3D%20(%0A%20%20%20%20%20%20%20%20rag_fusion_prompt%0A%20%20%20%20%20%20%20%20%7C%20make_chat_model()%0A%20%20%20%20%20%20%20%20%7C%20StrOutputParser()%0A%20%20%20%20%20%20%20%20%7C%20split_queries%0A%20%20%20%20)%0A%20%20%20%20return%20(rag_fusion_query_generator%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%91%E3%83%BC%E3%83%8815%E5%85%A8%E4%BD%93%E3%81%A7%E4%BD%BF%E3%81%84%E5%9B%9E%E3%81%99%E5%85%B1%E9%80%9A%E3%81%AE%E8%B3%AA%E5%95%8F%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%BE%E3%81%99%E3%80%82RAG-Fusion%E3%81%AB%E3%82%88%E3%82%8B%E6%A4%9C%E7%B4%A2%E3%80%81RRF%E3%81%A7%E8%9E%8D%E5%90%88%E3%81%97%E3%81%9F%E4%BB%B6%E6%95%B0%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%80%81%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%80%81%E6%9C%80%E7%B5%82%E7%9A%84%E3%81%AARAG%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%AE%E5%9B%9E%E7%AD%94%E3%82%92%E5%90%8C%E3%81%98%E8%B3%AA%E5%95%8F%E3%81%A7%E6%AF%94%E8%BC%83%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20reranking_question%20%3D%20%22What%20is%20task%20decomposition%20for%20LLM%20agents%3F%22%0A%20%20%20%20return%20(reranking_question%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%AF%94%E8%BC%83%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81%E3%81%BE%E3%81%9ARAG-Fusion%EF%BC%88%E9%A0%86%E4%BD%8D%E3%81%AE%E7%B5%B1%E5%90%88%EF%BC%89%E3%81%A7%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60reciprocal_rank_fusion%60%20%E3%81%AF%E3%83%91%E3%83%BC%E3%83%886%EF%BC%88%60rag_from_scratch_5_to_9.py%60%EF%BC%89%E3%81%A8%E5%90%8C%E4%B8%80%E3%81%AE%E5%AE%9F%E8%A3%85%E3%82%92%E3%80%81%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%81%A7%E3%82%82%E5%86%8D%E6%8E%B2%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20%E5%85%A5%E5%8A%9B%EF%BC%9A%E8%A4%87%E6%95%B0%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%20%60results%60%EF%BC%88%60list%5Blist%5D%60%EF%BC%89%E3%81%A8%E5%AE%9A%E6%95%B0%20%60k%3D60%60%0A%20%20%20%20-%20%E5%87%A6%E7%90%86%EF%BC%9A%E5%90%84%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%81%A7%E3%81%AE%E9%A0%86%E4%BD%8D%20%60rank%60%20%E3%81%A0%E3%81%91%E3%82%92%E4%BD%BF%E3%81%84%E3%80%81%E6%96%87%E6%9B%B8%E3%81%94%E3%81%A8%E3%81%AB%20%601%20%2F%20(rank%20%2B%20k)%60%20%E3%82%92%E5%90%88%E8%A8%88%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E6%96%87%E6%9B%B8%E3%81%AF%20%60dumps()%60%20%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E5%8C%96%E3%81%97%E3%81%A6%E9%87%8D%E8%A4%87%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%80%81%E6%9C%80%E5%BE%8C%E3%81%AB%20%60loads()%60%20%E3%81%A7%20%60Document%60%20%E3%81%AB%E6%88%BB%E3%81%97%E3%81%BE%E3%81%99%0A%20%20%20%20-%20%E5%87%BA%E5%8A%9B%EF%BC%9ARRF%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AE%E9%99%8D%E9%A0%86%E3%81%AB%E4%B8%A6%E3%82%93%E3%81%A0%20%60(Document%2C%20score)%60%20%E3%81%AE%E3%82%BF%E3%83%97%E3%83%AB%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(rag_fusion_query_generator%2C%20retriever)%3A%0A%20%20%20%20def%20reciprocal_rank_fusion(results%3A%20list%5Blist%5D%2C%20k%3D60)%3A%0A%20%20%20%20%20%20%20%20%22%22%22Combine%20ranked%20result%20lists%20using%20reciprocal%20rank%20fusion.%22%22%22%0A%20%20%20%20%20%20%20%20fused_scores%20%3D%20%7B%7D%0A%20%20%20%20%20%20%20%20for%20documents%20in%20results%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20rank%2C%20document%20in%20enumerate(documents)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc_str%20%3D%20dumps(document)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20doc_str%20not%20in%20fused_scores%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fused_scores%5Bdoc_str%5D%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fused_scores%5Bdoc_str%5D%20%2B%3D%201%20%2F%20(rank%20%2B%20k)%0A%20%20%20%20%20%20%20%20return%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20(loads(doc)%2C%20score)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20doc%2C%20score%20in%20sorted(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fused_scores.items()%2C%20key%3Dlambda%20item%3A%20item%5B1%5D%2C%20reverse%3DTrue%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20rag_fusion_retrieval_chain%20%3D%20(%0A%20%20%20%20%20%20%20%20rag_fusion_query_generator%20%7C%20retriever.map()%20%7C%20reciprocal_rank_fusion%0A%20%20%20%20)%0A%20%20%20%20return%20(rag_fusion_retrieval_chain%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%85%B1%E9%80%9A%E3%81%AE%E8%B3%AA%E5%95%8F%E3%82%92RAG-Fusion%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%B8%E6%B8%A1%E3%81%97%E3%80%814%E3%81%A4%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92RRF%E3%81%A7%E8%9E%8D%E5%90%88%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E5%9B%9E%E7%AD%94%E7%94%9F%E6%88%90%E3%81%AB%E3%81%AF%E9%80%B2%E3%81%BE%E3%81%9A%E3%80%81%E8%9E%8D%E5%90%88%E5%BE%8C%E3%81%AB%E4%BD%95%E4%BB%B6%E3%81%AE%20%60(Document%2C%20score)%60%20%E3%81%8C%E6%AE%8B%E3%81%A3%E3%81%9F%E3%81%8B%E3%81%A0%E3%81%91%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(rag_fusion_retrieval_chain%2C%20reranking_question)%3A%0A%20%20%20%20fused_documents%20%3D%20rag_fusion_retrieval_chain.invoke(%0A%20%20%20%20%20%20%20%20%7B%22question%22%3A%20reranking_question%7D%0A%20%20%20%20)%0A%20%20%20%20len(fused_documents)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20RAG-Fusion%E3%82%92%E4%BD%BF%E3%81%86%E3%83%99%E3%83%BC%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%B3%E5%9B%9E%E7%AD%94%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60context%60%20%E3%81%AB%E3%81%AFRRF%E3%81%A7%E8%9E%8D%E5%90%88%E3%81%97%E3%81%9F%20%60(Document%2C%20score)%60%20%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E6%B8%A1%E3%81%97%E3%80%81%E5%90%8C%E3%81%98%20%60reranking_question%60%20%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E5%9B%9E%E7%AD%94%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E3%80%81%E5%BE%8C%E6%AE%B5%E3%81%AE%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E4%BB%98%E3%81%8DRAG%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%A8%E6%AF%94%E8%BC%83%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(rag_fusion_retrieval_chain%2C%20reranking_question)%3A%0A%20%20%20%20answer_template%20%3D%20'Answer%20the%20following%20question%20based%20on%20this%20context%3A%5Cn%5Cn%7Bcontext%7D%5Cn%5CnQuestion%3A%20%7Bquestion%7D%5Cn'%0A%20%20%20%20answer_prompt%20%3D%20ChatPromptTemplate.from_template(answer_template)%0A%20%20%20%20rag_fusion_answer_chain%20%3D%20(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22context%22%3A%20rag_fusion_retrieval_chain%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22question%22%3A%20itemgetter(%22question%22)%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7C%20answer_prompt%0A%20%20%20%20%20%20%20%20%7C%20make_chat_model()%0A%20%20%20%20%20%20%20%20%7C%20StrOutputParser()%0A%20%20%20%20)%0A%20%20%20%20rag_fusion_answer_chain.invoke(%7B%22question%22%3A%20reranking_question%7D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%AF%E3%80%81Cohere%E3%81%AA%E3%81%A9%E3%81%AE%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%89%E5%9E%8BRerank%20API%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%E3%82%82%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%EF%BC%88%5BCohere%20Re-Rank%5D(https%3A%2F%2Fpython.langchain.com%2Fdocs%2Fintegrations%2Fretrievers%2Fcohere-reranker%23doing-reranking-with-coherererank)%E3%80%81%5B%E8%A7%A3%E8%AA%AC%E8%A8%98%E4%BA%8B%5D(https%3A%2F%2Ftxt.cohere.com%2Frerank%2F)%EF%BC%89%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E5%A4%96%E9%83%A8API%E3%82%AD%E3%83%BC%E3%82%92%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%97%E3%81%AA%E3%81%84%E6%96%B9%E5%BC%8F%E3%81%A8%E3%81%97%E3%81%A6%E3%80%81%E5%86%92%E9%A0%AD%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9F%20%60rerank_with_cross_encoder%60%20%E3%81%AB%E3%82%88%E3%82%8A%20%60sentence-transformers%60%20%E3%81%AE%5BCrossEncoder%5D(https%3A%2F%2Fwww.sbert.net%2Fdocs%2Fcross_encoder%2Fpretrained_models.html)%E3%82%92%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E4%BB%A5%E9%99%8D%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%E3%80%81%E5%80%99%E8%A3%9C%E5%8F%96%E5%BE%97%E3%80%81CrossEncoder%E3%81%AB%E3%82%88%E3%82%8B%E5%86%8D%E8%A9%95%E4%BE%A1%E3%80%81%E4%B8%8A%E4%BD%8D3%E4%BB%B6%E3%81%B8%E3%81%AE%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%81%BF%E3%82%92%E9%A0%86%E3%81%AB%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20!%5B%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%AE%E6%B5%81%E3%82%8C%EF%BC%88%E5%80%99%E8%A3%9C%E5%8F%96%E5%BE%97%E2%86%92%E3%82%B9%E3%82%B3%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E2%86%92%E4%B8%8A%E4%BD%8D%E9%81%B8%E6%8A%9E%EF%BC%89%5D(.%2Fimgs%2FCohere_Re-Rank.png)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%BE%E3%81%9A%E5%80%99%E8%A3%9C%E3%82%92%E5%BA%83%E3%82%81%E3%81%AB10%E4%BB%B6%E5%8F%96%E5%BE%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E9%80%9A%E5%B8%B8%E3%81%AE%20%60retriever%60%20%E3%81%AF%E6%97%A2%E5%AE%9A%E3%81%AE%20%60k%3D4%60%20%E3%81%A7%E3%81%99%E3%81%8C%E3%80%81%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E5%89%8D%E3%81%AB%E5%80%99%E8%A3%9C%E3%82%92%E5%BA%83%E3%81%8F%E6%AE%8B%E3%81%99%E3%81%9F%E3%82%81%20%60search_kwargs%3D%7B%22k%22%3A%2010%7D%60%20%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%E6%99%82%E7%82%B9%E3%81%AE%E9%A0%86%E4%BD%8D%E3%81%AFCrossEncoder%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E9%A1%9E%E4%BC%BC%E5%BA%A6%E3%81%AB%E3%82%88%E3%82%8B%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20%E5%85%A5%E5%8A%9B%EF%BC%9A%E5%85%B1%E9%80%9A%E8%B3%AA%E5%95%8F%20%60reranking_question%60%20%E3%81%A8%E3%80%81%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%A2%E3%83%AAChroma%E3%81%AE%20%60vectorstore%60%0A%20%20%20%20-%20%E5%87%A6%E7%90%86%EF%BC%9A%60vectorstore.as_retriever(search_kwargs%3D%7B%22k%22%3A%2010%7D)%60%20%E3%81%A7%E5%80%99%E8%A3%9C%E5%8F%96%E5%BE%97%E7%94%A8%E3%83%AA%E3%83%88%E3%83%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%E8%B3%AA%E5%95%8F%E3%81%A7%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%BE%E3%81%99%0A%20%20%20%20-%20%E5%87%BA%E5%8A%9B%EF%BC%9A%60candidate_retriever%60%20%3D%20%60k%3D10%60%20%E3%81%AE%E3%83%AA%E3%83%88%E3%83%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%80%81%60candidate_documents%60%20%3D%20%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E9%A1%9E%E4%BC%BC%E5%BA%A6%E9%A0%86%E3%81%AE%E5%80%99%E8%A3%9C%20%60Document%60%20%E3%83%AA%E3%82%B9%E3%83%88%EF%BC%88%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E6%95%B0%E5%80%A4%E3%81%8C%E4%BB%B6%E6%95%B0%EF%BC%89%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(reranking_question%2C%20vectorstore)%3A%0A%20%20%20%20candidate_retriever%20%3D%20vectorstore.as_retriever(search_kwargs%3D%7B%22k%22%3A%2010%7D)%0A%20%20%20%20candidate_documents%20%3D%20candidate_retriever.invoke(reranking_question)%0A%20%20%20%20len(candidate_documents)%0A%20%20%20%20return%20candidate_documents%2C%20candidate_retriever%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20CrossEncoder%E3%81%A7%E8%B3%AA%E5%95%8F%E3%81%A8%E5%90%84%E5%80%99%E8%A3%9C%E3%82%92%E7%9B%B4%E6%8E%A5%E6%AF%94%E8%BC%83%E3%81%97%E3%80%81%E4%B8%8A%E4%BD%8D3%E4%BB%B6%E3%81%B8%E7%B5%9E%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(candidate_documents%2C%20reranking_question)%3A%0A%20%20%20%20reranked_documents%20%3D%20rerank_with_cross_encoder(%0A%20%20%20%20%20%20%20%20reranking_question%2C%20candidate_documents%2C%20top_n%3D3%0A%20%20%20%20)%0A%20%20%20%20reranked_documents%0A%20%20%20%20return%20(reranked_documents%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E5%BE%8C%E3%81%AE%E9%96%A2%E9%80%A3%E5%BA%A6%E3%82%B9%E3%82%B3%E3%82%A2%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E5%80%A4%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%84%E3%81%BB%E3%81%A9%E8%B3%AA%E5%95%8F%E3%81%A8%E3%81%AE%E9%96%A2%E9%80%A3%E3%81%8C%E5%BC%B7%E3%81%84%E3%81%A8%E5%88%A4%E6%96%AD%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(reranked_documents)%3A%0A%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20round(doc.metadata%5B%22relevance_score%22%5D%2C%204)%20for%20doc%20in%20reranked_documents%0A%20%20%20%20%5D%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%92%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%AE%E9%83%A8%E5%93%81%E3%81%AB%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AF%E5%80%99%E8%A3%9C%E3%81%AE%E5%8F%96%E5%BE%97%E3%81%A8%E5%86%8D%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%92%E6%89%8B%E4%BD%9C%E6%A5%AD%E3%81%A7%E3%81%A4%E3%81%AA%E3%81%84%E3%81%A7%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%0A%20%20%20%20%E5%85%83%E3%83%8E%E3%83%BC%E3%83%88%E3%81%AF%E3%80%81%E3%81%93%E3%81%AE2%E6%AE%B5%E6%A7%8B%E3%81%88%E3%82%921%E3%81%A4%E3%81%AE%E3%83%AA%E3%83%88%E3%83%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%0A%0A%20%20%20%20%60%60%60python%0A%20%20%20%20compression_retriever%20%3D%20ContextualCompressionRetriever(%0A%20%20%20%20%20%20%20%20base_compressor%3DCohereRerank()%2C%20base_retriever%3Dretriever%0A%20%20%20%20)%0A%20%20%20%20%60%60%60%0A%0A%20%20%20%20%E3%81%9F%E3%81%A0%E3%81%97%20%60ContextualCompressionRetriever%60%20%E3%81%AF%20**LangChain%201.x%20%E3%81%A7%E5%89%8A%E9%99%A4**%E3%81%95%E3%82%8C%E3%81%A6%E3%81%8A%E3%82%8A%E3%80%81%0A%20%20%20%20%60langchain.retrievers%60%20%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E8%87%AA%E4%BD%93%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%20%20%20%20%E7%8F%BE%E5%9C%A8%E3%81%AF%20%60BaseRetriever%60%20%E3%82%92%E7%B6%99%E6%89%BF%E3%81%97%E3%81%A6%E5%90%8C%E3%81%98%E5%BD%B9%E5%89%B2%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E8%87%AA%E5%88%86%E3%81%A7%E6%9B%B8%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%20%60_get_relevant_documents()%60%20%E3%81%AE1%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A0%E3%81%91%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20%E5%B1%9E%E6%80%A7%EF%BC%9A%60base_retriever%60%20%E3%81%AF%E5%80%99%E8%A3%9C%E3%82%92%E5%8F%96%E3%82%8B%E3%83%AA%E3%83%88%E3%83%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%80%81%60top_n%60%20%E3%81%AF%E6%AE%8B%E3%81%99%E4%BB%B6%E6%95%B0%EF%BC%88%E6%97%A2%E5%AE%9A3%EF%BC%89%E3%81%A7%E3%81%99%0A%20%20%20%20-%20%60_get_relevant_documents()%60%EF%BC%9A%E3%82%AF%E3%82%A8%E3%83%AA%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8A%E3%80%81%60base_retriever%60%20%E3%81%A7%E5%80%99%E8%A3%9C%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%20%60rerank_with_cross_encoder%60%20%E3%81%A7%E4%B8%8A%E4%BD%8D%20%60top_n%60%20%E4%BB%B6%E3%81%AE%20%60Document%60%20%E3%83%AA%E3%82%B9%E3%83%88%E3%81%B8%E7%B5%9E%E3%82%8A%E3%81%BE%E3%81%99%0A%20%20%20%20-%20%60model_config%20%3D%20ConfigDict(arbitrary_types_allowed%3DTrue)%60%EF%BC%9A%60BaseRetriever%60%20%E3%81%AFPydantic%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E3%81%99%E3%80%82%E4%BB%BB%E6%84%8F%E5%9E%8B%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AB%E6%8C%81%E3%81%A4%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0Retriever%E3%81%A7%E3%82%82%E6%A4%9C%E8%A8%BC%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%97%E3%81%AA%E3%81%84%E8%A8%AD%E5%AE%9A%E3%82%92%E3%80%81%E3%81%93%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A7%E3%82%82%E6%98%8E%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20RerankingRetriever(BaseRetriever)%3A%0A%20%20%20%20%22%22%22Retrieve%20with%20a%20base%20retriever%2C%20then%20rerank%20with%20a%20CrossEncoder.%0A%0A%20%20%20%20Fills%20the%20role%20of%20%60ContextualCompressionRetriever%60%2C%20which%20was%20removed%20in%0A%20%20%20%20LangChain%201.x.%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20model_config%20%3D%20ConfigDict(arbitrary_types_allowed%3DTrue)%0A%0A%20%20%20%20base_retriever%3A%20BaseRetriever%0A%20%20%20%20top_n%3A%20int%20%3D%203%0A%0A%20%20%20%20def%20_get_relevant_documents(self%2C%20query%2C%20*%2C%20run_manager%3DNone)%3A%0A%20%20%20%20%20%20%20%20candidates%20%3D%20self.base_retriever.invoke(query)%0A%20%20%20%20%20%20%20%20return%20rerank_with_cross_encoder(query%2C%20candidates%2C%20top_n%3Dself.top_n)%0A%0A%0A%40app.cell%0Adef%20_(candidate_retriever)%3A%0A%20%20%20%20reranking_retriever%20%3D%20RerankingRetriever(%0A%20%20%20%20%20%20%20%20base_retriever%3Dcandidate_retriever%2C%20top_n%3D3%0A%20%20%20%20)%0A%20%20%20%20return%20(reranking_retriever%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%201%E5%9B%9E%E3%81%AE%20%60invoke()%60%20%E3%81%A7%E3%80%8C10%E4%BB%B6%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A63%E4%BB%B6%E3%81%B8%E7%B5%9E%E3%82%8B%E3%80%8D%E3%81%BE%E3%81%A7%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(reranking_question%2C%20reranking_retriever)%3A%0A%20%20%20%20reranking_retriever.invoke(reranking_question)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%AA%E3%83%88%E3%83%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7%E3%80%81RAG%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%B8%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E5%B7%AE%E3%81%97%E8%BE%BC%E3%82%81%E3%81%BE%E3%81%99%E3%80%82%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E5%85%A8%E4%BD%93%E3%81%AE%E5%BD%A2%E3%81%AF%E9%80%9A%E5%B8%B8%E3%81%AERAG%E3%81%A8%E5%90%8C%E3%81%98%E3%81%A7%E3%80%81%60context%60%20%E5%81%B4%E3%81%AE%E3%83%AA%E3%83%88%E3%83%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%20%60reranking_retriever%60%20%E3%81%AB%E5%B7%AE%E3%81%97%E6%9B%BF%E3%81%88%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%82%92%20%60format_docs%60%20%E3%81%A7%E6%95%B4%E5%BD%A2%E3%81%99%E3%82%8B%E5%89%8D%E3%81%AB%E3%80%8C10%E4%BB%B6%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A63%E4%BB%B6%E3%81%B8%E7%B5%9E%E3%82%8B%E3%80%8D%E5%87%A6%E7%90%86%E3%81%8C%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BE%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(reranking_question%2C%20reranking_retriever)%3A%0A%20%20%20%20reranking_rag_chain%20%3D%20(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22context%22%3A%20reranking_retriever%20%7C%20format_docs%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22question%22%3A%20RunnablePassthrough()%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7C%20load_rag_prompt()%0A%20%20%20%20%20%20%20%20%7C%20make_chat_model()%0A%20%20%20%20%20%20%20%20%7C%20StrOutputParser()%0A%20%20%20%20)%0A%20%20%20%20reranking_rag_chain.invoke(reranking_question)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%83%91%E3%83%BC%E3%83%8816%EF%BC%9A%E6%A4%9C%E7%B4%A2%EF%BC%88CRAG%EF%BC%89%0A%0A%20%20%20%20CRAG%E3%81%AF%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%82%92%E8%A9%95%E4%BE%A1%E3%81%97%E3%80%81%E9%96%A2%E9%80%A3%E6%80%A7%E3%81%8C%E4%BD%8E%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AB%E6%A4%9C%E7%B4%A2%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%84Web%E6%A4%9C%E7%B4%A2%E3%81%A7%E8%A3%9C%E6%AD%A3%E3%81%99%E3%82%8B%E6%89%8B%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%A7%E3%81%AF%E5%AE%9F%E8%A3%85%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%9B%E3%81%9A%E3%80%81%E8%A9%B3%E7%B4%B0%E8%A7%A3%E8%AA%AC%E3%81%A8%E5%AE%9F%E8%A3%85%E4%BE%8B%E3%81%B8%E3%81%AE%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AE%E3%81%BF%E3%82%92%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%60%E8%A9%B3%E7%B4%B0%E8%A7%A3%E8%AA%AC%60%0A%0A%20%20%20%20https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DE2shqsYwxck%0A%0A%20%20%20%20%60%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%60%0A%0A%20%20%20%20https%3A%2F%2Fgithub.com%2Flangchain-ai%2Flanggraph%2Fblob%2Fmain%2Fexamples%2Frag%2Flanggraph_crag.ipynb%0A%0A%20%20%20%20https%3A%2F%2Fgithub.com%2Flangchain-ai%2Flanggraph%2Fblob%2Fmain%2Fexamples%2Frag%2Flanggraph_crag_mistral.ipynb%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%83%91%E3%83%BC%E3%83%8817%EF%BC%9A%E8%87%AA%E5%B7%B1%E8%A9%95%E4%BE%A1%E3%82%92%E4%BC%B4%E3%81%86%E7%94%9F%E6%88%90%EF%BC%88Self-RAG%EF%BC%89%0A%0A%20%20%20%20Self-RAG%E3%81%AF%E3%80%81%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8C%E6%A4%9C%E7%B4%A2%E3%81%AE%E8%A6%81%E5%90%A6%E3%80%81%E5%8F%96%E5%BE%97%E6%96%87%E6%9B%B8%E3%81%AE%E9%96%A2%E9%80%A3%E6%80%A7%E3%80%81%E5%9B%9E%E7%AD%94%E3%81%AE%E6%A0%B9%E6%8B%A0%E6%80%A7%E3%82%92%E8%87%AA%E5%B7%B1%E8%A9%95%E4%BE%A1%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%89%8B%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%A7%E3%81%AF%E5%AE%9F%E8%A3%85%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%9B%E3%81%9A%E3%80%81LangGraph%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%A3%85%E4%BE%8B%E3%82%92%E5%8F%82%E7%85%A7%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%60%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%60%0A%0A%20%20%20%20https%3A%2F%2Fgithub.com%2Flangchain-ai%2Flanggraph%2Ftree%2Fmain%2Fexamples%2Frag%0A%0A%20%20%20%20https%3A%2F%2Fgithub.com%2Flangchain-ai%2Flanggraph%2Fblob%2Fmain%2Fexamples%2Frag%2Flanggraph_self_rag_mistral_nomic.ipynb%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%83%91%E3%83%BC%E3%83%8818%EF%BC%9A%E9%95%B7%E3%81%84%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E5%BD%B1%E9%9F%BF%0A%0A%20%20%20%20%E5%85%A5%E5%8A%9B%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%8C%E9%95%B7%E3%81%8F%E3%81%A6%E3%82%82%E3%80%81%E5%BF%85%E8%A6%81%E3%81%AA%E6%83%85%E5%A0%B1%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%88%A9%E7%94%A8%E7%B2%BE%E5%BA%A6%E3%81%8C%E4%B8%8B%E3%81%8C%E3%82%8B%E3%80%8CLost%20in%20the%20Middle%E3%80%8D%E3%81%8C%E8%B5%B7%E3%81%93%E3%82%8A%E5%BE%97%E3%81%BE%E3%81%99%E3%80%82%E9%95%B7%E3%81%84%E6%96%87%E6%9B%B8%E3%82%92%E3%81%99%E3%81%B9%E3%81%A6%E6%B8%A1%E3%81%99%E6%96%B9%E6%B3%95%E3%81%A8%E3%80%81%E6%A4%9C%E7%B4%A2%E3%81%A7%E9%96%A2%E9%80%A3%E7%AE%87%E6%89%80%E3%82%92%E7%B5%9E%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%E3%80%81%E7%B2%BE%E5%BA%A6%E3%83%BB%E9%81%85%E5%BB%B6%E3%83%BB%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E5%90%AB%E3%82%81%E3%81%A6%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%A7%E3%81%AF%E5%8F%82%E8%80%83%E5%8B%95%E7%94%BB%E3%81%A8%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89%E3%81%AE%E3%81%BF%E3%82%92%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%60%E8%A9%B3%E7%B4%B0%E8%A7%A3%E8%AA%AC%60%0A%0A%20%20%20%20https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DSsHUNfhF32s%0A%0A%20%20%20%20%60%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89%60%0A%0A%20%20%20%20https%3A%2F%2Fdocs.google.com%2Fpresentation%2Fd%2F1mJUiPBdtf58NfuSEQ7pVSEQ2Oqmek7F1i4gBwR6JDss%2Fedit%23slide%3Did.g26c0cb8dc66_0_0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
69c363668ca46f4a8cbe634542a94f53