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%20datetime%0A%20%20%20%20import%20os%0A%20%20%20%20from%20typing%20import%20Literal%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20langchain_community.document_loaders%20import%20YoutubeLoader%0A%20%20%20%20from%20langchain_core.output_parsers%20import%20StrOutputParser%0A%20%20%20%20from%20langchain_core.prompts%20import%20ChatPromptTemplate%2C%20PromptTemplate%0A%20%20%20%20from%20langchain_core.runnables%20import%20RunnableLambda%2C%20RunnablePassthrough%0A%20%20%20%20from%20langchain_openai%20import%20ChatOpenAI%2C%20OpenAIEmbeddings%0A%20%20%20%20from%20pydantic%20import%20BaseModel%2C%20Field%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)%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%20cosine_similarity(vec1%2C%20vec2)%3A%0A%20%20%20%20%20%20%20%20return%20float(np.dot(vec1%2C%20vec2)%20%2F%20(np.linalg.norm(vec1)%20*%20np.linalg.norm(vec2)))%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%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%0A%20%20%20%20!%5B%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%A6%82%E8%A6%81%5D(.%2Fimgs%2Frouting_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%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%60cosine_similarity(vec1%2C%20vec2)%60%EF%BC%9A%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E5%9B%BA%E6%9C%89%E3%81%AE%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%81%A7%E3%81%99%E3%80%822%E3%81%A4%E3%81%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E5%86%85%E7%A9%8D%E3%82%92%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E3%83%8E%E3%83%AB%E3%83%A0%E3%81%AE%E7%A9%8D%E3%81%A7%E5%89%B2%E3%82%8A%E3%80%81%60float%60%20%E3%81%AE%E9%A1%9E%E4%BC%BC%E5%BA%A6%EF%BC%88-1%E3%80%9C1%EF%BC%89%E3%81%A8%E3%81%97%E3%81%A6%E8%BF%94%E3%81%97%E3%81%BE%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%83%96%E3%83%83%E3%82%AF%E3%81%A7%E3%81%AF%E3%80%81Chroma%E3%81%AA%E3%81%A9%E3%81%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%B9%E3%83%88%E3%82%A2%E3%81%AF%E4%B8%80%E5%88%87%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E3%83%91%E3%83%BC%E3%83%8810%E3%81%AF%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E5%90%8C%E5%A3%AB%E3%82%92%E7%9B%B4%E6%8E%A5%E6%AF%94%E8%BC%83%E3%81%97%E3%80%81%E3%83%91%E3%83%BC%E3%83%8811%E3%81%AF%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E3%81%AE%E8%B3%AA%E5%95%8F%E3%82%92%E6%A4%9C%E7%B4%A2%E6%9D%A1%E4%BB%B6%E3%81%B8%E6%A7%8B%E9%80%A0%E5%8C%96%E3%81%99%E3%82%8B%E3%81%A8%E3%81%93%E3%82%8D%E3%81%BE%E3%81%A7%E3%82%92%E6%89%B1%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(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%8810%EF%BC%9A%E8%AB%96%E7%90%86%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A8%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%0A%20%20%20%20%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AF%E3%80%81%E8%B3%AA%E5%95%8F%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%84%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%E5%87%A6%E7%90%86%E3%81%A7%E3%81%99%E3%80%82%E8%AB%96%E7%90%86%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A7%E3%81%AFLLM%E3%81%AE%E6%A7%8B%E9%80%A0%E5%8C%96%E5%87%BA%E5%8A%9B%E3%81%A7%E9%9B%A2%E6%95%A3%E7%9A%84%E3%81%AA%E8%A1%8C%E3%81%8D%E5%85%88%E3%82%92%E9%81%B8%E3%81%B3%E3%80%81%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A7%E3%81%AF%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%AE%E9%A1%9E%E4%BC%BC%E5%BA%A6%E3%81%A7%E6%9C%80%E3%82%82%E8%BF%91%E3%81%84%E8%A1%8C%E3%81%8D%E5%85%88%E3%82%92%E9%81%B8%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E3%81%BE%E3%81%9A%E3%80%81Function%20Calling%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E8%B3%AA%E5%95%8F%E3%82%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E5%88%A5%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%B8%E5%88%86%E9%A1%9E%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E5%87%A6%E7%90%86%E3%81%AE%E6%B5%81%E3%82%8C%EF%BC%9A%0A%0A%20%20%20%20!%5B%E8%AB%96%E7%90%86%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A8%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%5D(.%2Fimgs%2Flogical_and_semantic_routing.png)%0A%0A%20%20%20%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%EF%BC%9A%0A%0A%20%20%20%20https%3A%2F%2Fpython.langchain.com%2Fdocs%2Fuse_cases%2Fquery_analysis%2Ftechniques%2Frouting%23routing-to-multiple-indexes%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%E8%A1%8C%E3%81%8D%E5%85%88%E3%82%92%E8%A1%A8%E3%81%99%E3%83%87%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60Literal%60%20%E3%81%A7%E5%80%99%E8%A3%9C%E3%82%92%20%60python_docs%60%20%2F%20%60js_docs%60%20%2F%20%60golang_docs%60%20%E3%81%AE3%E3%81%A4%E3%81%AB%E9%99%90%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81LLM%E3%81%AF%E3%81%93%E3%81%AE%E7%AF%84%E5%9B%B2%E3%81%A7%E3%81%97%E3%81%8B%E5%80%A4%E3%82%92%E8%BF%94%E3%81%9B%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%60Field(description%3D...)%60%20%E3%81%AE%E6%96%87%E9%9D%A2%E3%81%AF%E6%A7%8B%E9%80%A0%E5%8C%96%E5%87%BA%E5%8A%9B%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%81%AB%E5%90%AB%E3%81%BE%E3%82%8C%E3%80%81%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BELLM%E3%81%B8%E3%81%AE%E6%8C%87%E7%A4%BA%E3%81%A8%E3%81%97%E3%81%A6%E6%B8%A1%E3%81%95%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.class_definition%0Aclass%20RouteQuery(BaseModel)%3A%0A%20%20%20%20%22%22%22Route%20a%20user%20query%20to%20the%20most%20relevant%20datasource.%22%22%22%0A%0A%20%20%20%20datasource%3A%20Literal%5B%22python_docs%22%2C%20%22js_docs%22%2C%20%22golang_docs%22%5D%20%3D%20Field(%0A%20%20%20%20%20%20%20%20...%2C%0A%20%20%20%20%20%20%20%20description%3D%22Given%20a%20user%20question%20choose%20which%20datasource%20would%20be%20most%20relevant%20for%20answering%20their%20question%22%2C%0A%20%20%20%20)%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%60with_structured_output()%60%20%E3%81%A7%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%20%60RouteQuery%60%20%E3%81%AB%E6%9D%9F%E7%B8%9B%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%20llm%20%3D%20make_chat_model()%0A%20%20%20%20structured_llm%20%3D%20llm.with_structured_output(RouteQuery)%0A%20%20%20%20return%20(structured_llm%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%E9%A1%9E%E3%81%AE%E5%9F%BA%E6%BA%96%E3%82%92%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%E6%8C%87%E7%A4%BA%E3%81%97%E3%80%81%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A8%E6%A7%8B%E9%80%A0%E5%8C%96%E5%87%BA%E5%8A%9B%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E3%81%A4%E3%81%AA%E3%81%84%E3%81%A7%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E4%BD%9C%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_(structured_llm)%3A%0A%20%20%20%20system%20%3D%20%22%22%22You%20are%20an%20expert%20at%20routing%20a%20user%20question%20to%20the%20appropriate%20data%20source.%0A%0A%20%20%20%20Based%20on%20the%20programming%20language%20the%20question%20is%20referring%20to%2C%20route%20it%20to%20the%20relevant%20data%20source.%22%22%22%0A%0A%20%20%20%20prompt%20%3D%20ChatPromptTemplate.from_messages(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22system%22%2C%20system)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22human%22%2C%20%22%7Bquestion%7D%22)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%0A%20%20%20%20router%20%3D%20prompt%20%7C%20structured_llm%0A%20%20%20%20return%20(router%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%60with_structured_output(RouteQuery)%60%20%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E8%87%AA%E7%94%B1%E6%96%87%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%20%60datasource%60%20%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E6%8C%81%E3%81%A4%E5%80%A4%E3%81%A8%E3%81%97%E3%81%A6%E7%B5%90%E6%9E%9C%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E5%80%99%E8%A3%9C%E3%82%92%E5%9E%8B%E3%81%A7%E9%99%90%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E5%BE%8C%E7%B6%9A%E3%81%AE%E5%88%86%E5%B2%90%E3%82%92%E6%B1%BA%E5%AE%9A%E7%9A%84%E3%81%AB%E8%A8%98%E8%BF%B0%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20!%5BLLM%E3%81%AB%E3%82%88%E3%82%8B%E6%A7%8B%E9%80%A0%E5%8C%96%E5%87%BA%E5%8A%9B%5D(.%2Fimgs%2Fllm.with_structured_output.png)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(router)%3A%0A%20%20%20%20routing_question%20%3D%20%22%22%22Why%20doesn't%20the%20following%20code%20work%3A%0A%0A%20%20%20%20from%20langchain_core.prompts%20import%20ChatPromptTemplate%0A%0A%20%20%20%20prompt%20%3D%20ChatPromptTemplate.from_messages(%5B%22human%22%2C%20%22speak%20in%20%7Blanguage%7D%22%5D)%0A%20%20%20%20prompt.invoke(%22french%22)%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20route_result%20%3D%20router.invoke(%7B%22question%22%3A%20routing_question%7D)%0A%20%20%20%20return%20route_result%2C%20routing_question%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%89%8D%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%E3%80%81LangChain%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%B3%AA%E5%95%8F%E3%82%92%20%60router%60%20%E3%81%B8%E6%B8%A1%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E7%B6%9A%E3%81%8F2%E3%82%BB%E3%83%AB%E3%81%AF%E3%80%81%E8%BF%94%E3%82%8A%E5%80%A4%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%81%A8%20%60datasource%60%20%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%81%A7%E3%81%99%E3%80%82%E8%BF%94%E3%82%8B%E3%81%AE%E3%81%AF%E8%87%AA%E7%94%B1%E6%96%87%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%20%60RouteQuery%60%20%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%60.datasource%60%20%E3%81%A7%E9%81%B8%E6%8A%9E%E3%81%95%E3%82%8C%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BD%E3%83%BC%E3%82%B9%E5%90%8D%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%9B%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_(route_result)%3A%0A%20%20%20%20route_result%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(route_result)%3A%0A%20%20%20%20route_result.datasource%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%E9%81%B8%E6%8A%9E%E3%81%95%E3%82%8C%E3%81%9F%20%60route_result.datasource%60%20%E3%82%92%E4%BD%BF%E3%81%84%E3%80%81%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E6%A4%9C%E7%B4%A2%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%B8%E5%87%A6%E7%90%86%E3%82%92%E6%8C%AF%E3%82%8A%E5%88%86%E3%81%91%E3%81%BE%E3%81%99%E3%80%82%60choose_route%60%20%E3%81%AF%20%60python_docs%60%E3%80%81%60js_docs%60%20%E3%82%92%E9%A0%86%E3%81%AB%E5%88%A4%E5%AE%9A%E3%81%97%E3%80%81%E3%81%9D%E3%82%8C%E4%BB%A5%E5%A4%96%EF%BC%88%60Literal%60%20%E4%B8%8A%E3%81%AF%20%60golang_docs%60%EF%BC%89%E3%82%92Go%E7%94%A8%E3%81%A8%E3%81%97%E3%81%A6%E6%89%B1%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%E4%BE%8B%E3%81%A7%E3%81%AF%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E8%BF%94%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%81%AF%E5%90%84%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BD%E3%83%BC%E3%82%B9%E7%94%A8%E3%81%AERAG%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%82%92%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20https%3A%2F%2Fpython.langchain.com%2Fdocs%2Fexpression_language%2Fhow_to%2Frouting%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(router)%3A%0A%20%20%20%20def%20choose_route(route)%3A%0A%20%20%20%20%20%20%20%20if%20%22python_docs%22%20in%20route.datasource.lower()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22chain%20for%20python_docs%22%0A%20%20%20%20%20%20%20%20elif%20%22js_docs%22%20in%20route.datasource.lower()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22chain%20for%20js_docs%22%0A%20%20%20%20%20%20%20%20return%20%22chain%20for%20golang_docs%22%0A%0A%20%20%20%20logical_routing_chain%20%3D%20router%20%7C%20RunnableLambda(choose_route)%0A%20%20%20%20return%20(logical_routing_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%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%E3%80%81%E5%90%8C%E3%81%98%E8%B3%AA%E5%95%8F%E3%82%92%20%60logical_routing_chain%60%20%E3%81%AB%E6%B8%A1%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60router%60%20%E3%81%8C%E4%BD%9C%E3%81%A3%E3%81%9F%20%60RouteQuery%60%20%E3%82%92%20%60choose_route%60%20%E3%81%8C%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8A%E3%80%81%E9%81%B8%E3%81%B0%E3%82%8C%E3%81%9F%E5%88%86%E5%B2%90%E5%85%88%E3%82%92%E8%A1%A8%E3%81%99%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E8%BF%94%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%AE%9F%E9%9A%9B%E3%81%AE%E6%A4%9C%E7%B4%A2DB%E3%81%B8%E6%8E%A5%E7%B6%9A%E3%81%9B%E3%81%9A%E3%80%81%E3%81%A9%E3%81%AE%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%B8%E9%80%B2%E3%82%80%E3%81%8B%E3%81%A0%E3%81%91%E3%82%92%E8%A1%A8%E7%A4%BA%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_(logical_routing_chain%2C%20routing_question)%3A%0A%20%20%20%20logical_routing_chain.invoke(%7B%22question%22%3A%20routing_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%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%EF%BC%9A%0A%0A%20%20%20%20https%3A%2F%2Fsmith.langchain.com%2Fpublic%2Fc2ca61b4-3810-45d0-a156-3d6a73e9ee2a%2Fr%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%23%20%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%0A%20%20%20%20%E5%80%99%E8%A3%9C%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E4%BA%8B%E5%89%8D%E3%81%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%80%81%E8%B3%AA%E5%95%8F%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%A8%E3%81%AE%E3%82%B3%E3%82%B5%E3%82%A4%E3%83%B3%E9%A1%9E%E4%BC%BC%E5%BA%A6%E3%81%8C%E6%9C%80%E3%82%82%E9%AB%98%E3%81%84%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E9%81%B8%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82%E5%9B%BA%E5%AE%9A%E3%83%A9%E3%83%99%E3%83%AB%E3%81%B8%E5%88%86%E9%A1%9E%E3%81%99%E3%82%8B%E3%82%88%E3%82%8A%E6%9F%94%E8%BB%9F%E3%81%A7%E3%81%99%E3%81%8C%E3%80%81%E5%80%99%E8%A3%9C%E9%96%93%E3%81%AE%E6%84%8F%E5%91%B3%E3%81%8C%E8%BF%91%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E5%A2%83%E7%95%8C%E3%81%8C%E6%9B%96%E6%98%A7%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E5%87%A6%E7%90%86%E3%81%AE%E6%B5%81%E3%82%8C%EF%BC%9A%0A%0A%20%20%20%20!%5B%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%B5%81%E3%82%8C%5D(.%2Fimgs%2Fsemantic_routing.png)%0A%0A%20%20%20%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%EF%BC%9A%0A%0A%20%20%20%20https%3A%2F%2Fpython.langchain.com%2Fdocs%2Fexpression_language%2Fcookbook%2Fembedding_router%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%E8%A1%8C%E3%81%8D%E5%85%88%E3%81%A8%E3%81%AA%E3%82%8B2%E3%81%A4%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E7%94%A8%E6%84%8F%E3%81%97%E3%80%81%E3%81%82%E3%82%89%E3%81%8B%E3%81%98%E3%82%81%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%81%A6%E3%81%8A%E3%81%8D%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%20physics_template%20%3D%20%22You%20are%20a%20very%20smart%20physics%20professor.%20You%20are%20great%20at%20answering%20questions%20about%20physics%20in%20a%20concise%20and%20easy%20to%20understand%20manner.%20When%20you%20don't%20know%20the%20answer%20to%20a%20question%20you%20admit%20that%20you%20don't%20know.%5Cn%5CnHere%20is%20a%20question%3A%5Cn%7Bquery%7D%22%0A%20%20%20%20math_template%20%3D%20'You%20are%20a%20very%20good%20mathematician.%20You%20are%20great%20at%20answering%20math%20questions.%20You%20are%20so%20good%20because%20you%20are%20able%20to%20break%20down%20hard%20problems%20into%20their%20component%20parts%2C%20answer%20the%20component%20parts%2C%20and%20then%20put%20them%20together%20to%20answer%20the%20broader%20question.%5Cn%5CnHere%20is%20a%20question%3A%5Cn%7Bquery%7D'%0A%20%20%20%20prompt_templates%20%3D%20%5Bphysics_template%2C%20math_template%5D%0A%20%20%20%20return%20math_template%2C%20prompt_templates%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%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%E3%80%812%E3%81%A4%E3%81%AE%E5%80%99%E8%A3%9C%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E3%81%82%E3%82%89%E3%81%8B%E3%81%98%E3%82%81%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%81%BE%E3%81%99%E3%80%82%E8%B3%AA%E5%95%8F%E3%81%94%E3%81%A8%E3%81%AB%E5%80%99%E8%A3%9C%E5%81%B4%E3%82%92%E5%86%8D%E8%A8%88%E7%AE%97%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%80%81%60make_embeddings()%60%20%E3%81%A7%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E7%94%A8%E6%84%8F%E3%81%97%E3%80%81%60embed_documents(prompt_templates)%60%20%E3%81%AB%E6%96%87%E5%AD%97%E5%88%97%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E6%B8%A1%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E5%87%BA%E5%8A%9B%E3%81%AE%20%60prompt_embeddings%60%20%E3%81%AF%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E6%95%B0%E3%81%A8%E5%90%8C%E3%81%982%E4%BB%B6%E3%81%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%A7%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_(prompt_templates)%3A%0A%20%20%20%20embeddings%20%3D%20make_embeddings()%0A%20%20%20%20prompt_embeddings%20%3D%20embeddings.embed_documents(prompt_templates)%0A%20%20%20%20len(prompt_embeddings)%0A%20%20%20%20return%20embeddings%2C%20prompt_embeddings%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%E8%B3%AA%E5%95%8F%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%A8%E5%90%84%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%AE%E3%82%B3%E3%82%B5%E3%82%A4%E3%83%B3%E9%A1%9E%E4%BC%BC%E5%BA%A6%E3%82%92%E8%A8%88%E7%AE%97%E3%81%97%E3%80%81%E5%80%A4%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60prompt_templates%60%20%E3%81%AE%E9%A0%86%E7%95%AA%E3%81%8C%E7%89%A9%E7%90%86%E3%80%81%E6%95%B0%E5%AD%A6%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E5%87%BA%E5%8A%9B%E3%83%AA%E3%82%B9%E3%83%88%E3%82%82%E5%B7%A6%E3%81%8C%E7%89%A9%E7%90%86%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%80%81%E5%8F%B3%E3%81%8C%E6%95%B0%E5%AD%A6%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E9%A1%9E%E4%BC%BC%E5%BA%A6%E3%81%A7%E3%81%99%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E8%B3%AA%E5%95%8F%20%60What's%20a%20black%20hole%60%20%E3%81%8C%E3%81%A9%E3%81%A1%E3%82%89%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AB%E8%BF%91%E3%81%84%E3%81%8B%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_(embeddings%2C%20prompt_embeddings)%3A%0A%20%20%20%20example_query%20%3D%20%22What's%20a%20black%20hole%22%0A%20%20%20%20example_similarities%20%3D%20%5B%0A%20%20%20%20%20%20%20%20round(cosine_similarity(embeddings.embed_query(example_query)%2C%20pe)%2C%204)%0A%20%20%20%20%20%20%20%20for%20pe%20in%20prompt_embeddings%0A%20%20%20%20%5D%0A%20%20%20%20example_similarities%0A%20%20%20%20return%20(example_query%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%9C%80%E3%82%82%E9%A1%9E%E4%BC%BC%E5%BA%A6%E3%81%8C%E9%AB%98%E3%81%84%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E9%81%B8%E3%81%B6%E9%96%A2%E6%95%B0%E3%82%92%20%60RunnableLambda%60%20%E3%81%A7%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%B8%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%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%60RunnablePassthrough()%60%20%E3%81%8B%E3%82%89%E6%B8%A1%E3%81%95%E3%82%8C%E3%81%9F%20%60%7B%22query%22%3A%20...%7D%60%20%E5%BD%A2%E5%BC%8F%E3%81%AE%E8%BE%9E%E6%9B%B8%0A%20%20%20%20-%20%E5%87%A6%E7%90%86%EF%BC%9A%E8%B3%AA%E5%95%8F%E3%82%92%20%60embed_query()%60%20%E3%81%A7%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%80%81%E4%BA%8B%E5%89%8D%E8%A8%88%E7%AE%97%E3%81%97%E3%81%9F%20%60prompt_embeddings%60%20%E3%81%A8%E3%81%AE%E3%82%B3%E3%82%B5%E3%82%A4%E3%83%B3%E9%A1%9E%E4%BC%BC%E5%BA%A6%E3%82%92%E8%A8%88%E7%AE%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60np.argmax%60%20%E3%81%A7%E6%9C%80%E3%82%82%E9%A1%9E%E4%BC%BC%E5%BA%A6%E3%81%8C%E9%AB%98%E3%81%84%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%92%E9%81%B8%E3%81%B3%E3%80%81%E9%81%B8%E6%8A%9E%E7%B5%90%E6%9E%9C%E3%82%92%20%60Using%20MATH%60%20%E3%81%BE%E3%81%9F%E3%81%AF%20%60Using%20PHYSICS%60%20%E3%81%A8%E3%81%97%E3%81%A6%E6%A8%99%E6%BA%96%E5%87%BA%E5%8A%9B%E3%81%B8%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20-%20%E5%87%BA%E5%8A%9B%EF%BC%9A%E9%81%B8%E3%81%B0%E3%82%8C%E3%81%9F%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E6%96%87%E5%AD%97%E5%88%97%E3%81%8B%E3%82%89%E4%BD%9C%E3%81%A3%E3%81%9F%20%60PromptTemplate%60%0A%0A%20%20%20%20%E3%81%9D%E3%81%AE%E5%BE%8C%E3%80%81%E9%81%B8%E3%81%B0%E3%82%8C%E3%81%9F%20%60PromptTemplate%60%E3%80%81%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%A2%E3%83%87%E3%83%AB%E3%80%81%60StrOutputParser%60%20%E3%82%92%E3%81%A4%E3%81%AA%E3%81%8E%E3%80%81%E5%9B%9E%E7%AD%94%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E8%BF%94%E3%81%99%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%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(embeddings%2C%20math_template%2C%20prompt_embeddings%2C%20prompt_templates)%3A%0A%20%20%20%20def%20prompt_router(inputs)%3A%0A%20%20%20%20%20%20%20%20query_embedding%20%3D%20embeddings.embed_query(inputs%5B%22query%22%5D)%0A%20%20%20%20%20%20%20%20similarities%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20cosine_similarity(query_embedding%2C%20prompt_embedding)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20prompt_embedding%20in%20prompt_embeddings%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20most_similar%20%3D%20prompt_templates%5Bint(np.argmax(similarities))%5D%0A%20%20%20%20%20%20%20%20print(%22Using%20MATH%22%20if%20most_similar%20%3D%3D%20math_template%20else%20%22Using%20PHYSICS%22)%0A%20%20%20%20%20%20%20%20return%20PromptTemplate.from_template(most_similar)%0A%0A%20%20%20%20semantic_routing_chain%20%3D%20(%0A%20%20%20%20%20%20%20%20%7B%22query%22%3A%20RunnablePassthrough()%7D%0A%20%20%20%20%20%20%20%20%7C%20RunnableLambda(prompt_router)%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%20return%20(semantic_routing_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%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AF%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%99%E3%80%82%60prompt_router%60%20%E5%86%85%E3%81%AE%20%60print%60%20%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E5%9B%9E%E7%AD%94%E6%9C%AC%E6%96%87%E3%82%88%E3%82%8A%E5%85%88%E3%81%AB%E9%81%B8%E3%81%B0%E3%82%8C%E3%81%9F%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%E7%A8%AE%E9%A1%9E%EF%BC%88%60Using%20MATH%60%20%E3%81%BE%E3%81%9F%E3%81%AF%20%60Using%20PHYSICS%60%EF%BC%89%E3%81%8C%E6%A8%99%E6%BA%96%E5%87%BA%E5%8A%9B%E3%81%B8%E8%A1%A8%E7%A4%BA%E3%81%95%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_(example_query%2C%20semantic_routing_chain)%3A%0A%20%20%20%20print(semantic_routing_chain.invoke(example_query))%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%88%E3%83%AC%E3%83%BC%E3%82%B9%EF%BC%9A%0A%0A%20%20%20%20https%3A%2F%2Fsmith.langchain.com%2Fpublic%2F98c25405-2631-4de8-b12a-1891aded3359%2Fr%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%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%E3%82%AF%E3%82%A8%E3%83%AA%E6%A7%8B%E7%AF%89%0A%0A%20%20%20%20!%5B%E3%82%AF%E3%82%A8%E3%83%AA%E6%A7%8B%E7%AF%89%E3%81%AE%E6%A6%82%E8%A6%81%5D(.%2Fimgs%2Fquery_construction.png)%0A%0A%20%20%20%20%E3%82%AF%E3%82%A8%E3%83%AA%E6%A7%8B%E7%AF%89%E3%81%A7%E3%81%AF%E3%80%81%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E3%81%AE%E8%B3%AA%E5%95%8F%E3%82%92%E6%A4%9C%E7%B4%A2%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%8C%E8%A7%A3%E9%87%88%E3%81%A7%E3%81%8D%E3%82%8B%E6%A7%8B%E9%80%A0%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E6%89%B1%E3%81%84%E3%80%81%E3%82%B0%E3%83%A9%E3%83%95%E3%82%84SQL%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E5%8F%82%E8%80%83%E8%B3%87%E6%96%99%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%20https%3A%2F%2Fblog.langchain.dev%2Fquery-construction%2F%0A%0A%20%20%20%20https%3A%2F%2Fblog.langchain.dev%2Fenhancing-rag-based-applications-accuracy-by-constructing-and-leveraging-knowledge-graphs%2F%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%8811%EF%BC%9A%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E5%90%91%E3%81%91%E3%81%AE%E3%82%AF%E3%82%A8%E3%83%AA%E6%A7%8B%E9%80%A0%E5%8C%96%0A%0A%20%20%20%20%E5%87%A6%E7%90%86%E3%81%AE%E6%B5%81%E3%82%8C%EF%BC%9A%0A%0A%20%20%20%20!%5B%E3%82%AF%E3%82%A8%E3%83%AA%E6%A7%8B%E9%80%A0%E5%8C%96%E3%81%AE%E6%B5%81%E3%82%8C%5D(.%2Fimgs%2Fquery_structuring.png)%0A%0A%20%20%20%20%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E9%A1%9E%E4%BC%BC%E5%BA%A6%E3%81%A0%E3%81%91%E3%81%A7%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E5%85%AC%E9%96%8B%E6%97%A5%E3%82%84%E5%8B%95%E7%94%BB%E3%81%AE%E9%95%B7%E3%81%95%E3%81%A8%E3%81%84%E3%81%A3%E3%81%9F%E6%9D%A1%E4%BB%B6%E3%82%92%E6%AD%A3%E7%A2%BA%E3%81%AB%E6%89%B1%E3%81%88%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82LLM%E3%81%A7%E8%B3%AA%E5%95%8F%E3%82%92%E6%84%8F%E5%91%B3%E6%A4%9C%E7%B4%A2%E7%94%A8%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%A8%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E6%9D%A1%E4%BB%B6%E3%81%B8%E5%88%86%E9%9B%A2%E3%81%97%E3%80%81%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E6%A4%9C%E7%B4%A2%E3%81%A8%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E3%81%BE%E3%81%9A%E3%80%81YouTube%E5%8B%95%E7%94%BB%20https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DpbAd8O1Lvm4%20%E3%81%AE%E6%96%87%E5%AD%97%E8%B5%B7%E3%81%93%E3%81%97%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%80%81%E4%BB%98%E9%9A%8F%E3%81%99%E3%82%8B%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60add_video_info%3DFalse%60%20%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%86%8D%E7%94%9F%E5%9B%9E%E6%95%B0%E3%82%84%E5%85%AC%E9%96%8B%E6%97%A5%E3%81%AA%E3%81%A9%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%E5%8F%96%E5%BE%97%E3%81%95%E3%82%8C%E3%81%9A%E3%80%81%E5%87%BA%E5%8A%9B%E3%81%95%E3%82%8C%E3%82%8B%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%E6%9C%80%E5%B0%8F%E9%99%90%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%EF%BC%9A%0A%0A%20%20%20%20https%3A%2F%2Fpython.langchain.com%2Fdocs%2Fuse_cases%2Fquery_analysis%2Ftechniques%2Fstructuring%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%20transcript_documents%20%3D%20YoutubeLoader.from_youtube_url(%0A%20%20%20%20%20%20%20%20%22https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DpbAd8O1Lvm4%22%2C%20add_video_info%3DFalse%0A%20%20%20%20).load()%0A%0A%20%20%20%20transcript_documents%5B0%5D.metadata%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%E6%AC%A1%E3%81%AE%E6%A9%9F%E8%83%BD%E3%82%92%E6%8C%81%E3%81%A4%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%9F%E3%81%A8%E4%BB%AE%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%AF%E3%80%8C%E3%81%9D%E3%81%86%E3%81%84%E3%81%86DB%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E4%BB%AE%E5%AE%9A%E3%81%97%E3%81%9F%E3%80%8D%E4%BB%AE%E6%83%B3%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%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%E9%9A%9B%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%82%82DB%E3%82%82%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E5%AE%9F%E9%9A%9B%E3%81%AB%E8%A1%8C%E3%81%86%E3%81%AE%E3%81%AF%E3%80%81%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E3%81%AE%E8%B3%AA%E5%95%8F%E3%82%92%E6%A4%9C%E7%B4%A2%E6%9D%A1%E4%BB%B6%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E3%81%A8%E3%81%93%E3%82%8D%E3%81%BE%E3%81%A7%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%201.%20%E5%90%84%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%20%60contents%60%20%E3%81%A8%20%60title%60%20%E3%82%92%E5%AF%BE%E8%B1%A1%E3%81%AB%E9%9D%9E%E6%A7%8B%E9%80%A0%E5%8C%96%E6%A4%9C%E7%B4%A2%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%0A%20%20%20%202.%20%60view%20count%60%E3%80%81%60publication%20date%60%E3%80%81%60length%60%20%E3%82%92%E7%AF%84%E5%9B%B2%E6%8C%87%E5%AE%9A%E3%81%A7%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%82%81%E3%82%8B%0A%0A%20%20%20%20%60TutorialSearch%60%20%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%81%AF%E3%80%81%E6%84%8F%E5%91%B3%E6%A4%9C%E7%B4%A2%E3%81%AB%E4%BD%BF%E3%81%86%E6%96%87%E5%AD%97%E5%88%97%E3%81%A8%E7%AF%84%E5%9B%B2%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E5%88%86%E9%9B%A2%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60content_search%60%20%2F%20%60title_search%60%20%E3%81%AF%E6%84%8F%E5%91%B3%E6%A4%9C%E7%B4%A2%E7%94%A8%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7%E3%80%81%60min_view_count%60%20%2F%20%60max_view_count%60%E3%80%81%60earliest_publish_date%60%20%2F%20%60latest_publish_date%60%E3%80%81%60min_length_sec%60%20%2F%20%60max_length_sec%60%20%E3%81%AF%E7%AF%84%E5%9B%B2%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%A7%E3%81%99%E3%80%82LLM%E3%81%AF%E8%B3%AA%E5%95%8F%E3%81%AB%E6%98%8E%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%9F%E6%9D%A1%E4%BB%B6%E3%81%A0%E3%81%91%E3%82%92%E5%90%84%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%B8%E8%A8%AD%E5%AE%9A%E3%81%97%E3%80%81%60pretty_print()%60%20%E3%81%AF%E6%97%A2%E5%AE%9A%E5%80%A4%E3%81%A8%E7%95%B0%E3%81%AA%E3%82%8B%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%A0%E3%81%91%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E7%A2%BA%E8%AA%8D%E7%94%A8%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20TutorialSearch(BaseModel)%3A%0A%20%20%20%20%22%22%22Search%20over%20a%20database%20of%20tutorial%20videos%20about%20a%20software%20library.%22%22%22%0A%20%20%20%20content_search%3A%20str%20%3D%20Field(...%2C%20description%3D'Similarity%20search%20query%20applied%20to%20video%20transcripts.')%0A%20%20%20%20title_search%3A%20str%20%3D%20Field(...%2C%20description%3D'Alternate%20version%20of%20the%20content%20search%20query%20to%20apply%20to%20video%20titles.%20Should%20be%20succinct%20and%20only%20include%20key%20words%20that%20could%20be%20in%20a%20video%20title.')%0A%20%20%20%20min_view_count%3A%20int%20%7C%20None%20%3D%20Field(None%2C%20description%3D'Minimum%20view%20count%20filter%2C%20inclusive.%20Only%20use%20if%20explicitly%20specified.')%0A%20%20%20%20max_view_count%3A%20int%20%7C%20None%20%3D%20Field(None%2C%20description%3D'Maximum%20view%20count%20filter%2C%20exclusive.%20Only%20use%20if%20explicitly%20specified.')%0A%20%20%20%20earliest_publish_date%3A%20datetime.date%20%7C%20None%20%3D%20Field(None%2C%20description%3D'Earliest%20publish%20date%20filter%2C%20inclusive.%20Only%20use%20if%20explicitly%20specified.')%0A%20%20%20%20latest_publish_date%3A%20datetime.date%20%7C%20None%20%3D%20Field(None%2C%20description%3D'Latest%20publish%20date%20filter%2C%20exclusive.%20Only%20use%20if%20explicitly%20specified.')%0A%20%20%20%20min_length_sec%3A%20int%20%7C%20None%20%3D%20Field(None%2C%20description%3D'Minimum%20video%20length%20in%20seconds%2C%20inclusive.%20Only%20use%20if%20explicitly%20specified.')%0A%20%20%20%20max_length_sec%3A%20int%20%7C%20None%20%3D%20Field(None%2C%20description%3D'Maximum%20video%20length%20in%20seconds%2C%20exclusive.%20Only%20use%20if%20explicitly%20specified.')%0A%0A%20%20%20%20def%20pretty_print(self)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20for%20field_name%2C%20field_info%20in%20type(self).model_fields.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20value%20%3D%20getattr(self%2C%20field_name)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20value%20is%20not%20None%20and%20value%20!%3D%20field_info.default%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f'%7Bfield_name%7D%3A%20%7Bvalue%7D')%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%AC%A1%E3%81%AB%E3%80%81%60TutorialSearch%60%20%E3%82%92%E6%A7%8B%E9%80%A0%E5%8C%96%E5%87%BA%E5%8A%9B%E3%81%A8%E3%81%97%E3%81%A6%E6%8C%87%E5%AE%9A%E3%81%97%E3%80%81%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E3%81%8B%E3%82%89%E6%A4%9C%E7%B4%A2%E6%9D%A1%E4%BB%B6%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E4%BB%A5%E4%B8%8B%E3%81%AE%E4%BE%8B%E3%81%A7%E3%81%AF%E3%80%81%E8%B3%AA%E5%95%8F%E3%81%8C%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%AB%E3%81%A4%E3%82%8C%E3%81%A6%E5%85%AC%E9%96%8B%E5%B9%B4%E3%82%84%E5%8B%95%E7%94%BB%E6%99%82%E9%96%93%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%95%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_()%3A%0A%20%20%20%20query_system_prompt%20%3D%20'You%20are%20an%20expert%20at%20converting%20user%20questions%20into%20database%20queries.%20You%20have%20access%20to%20a%20database%20of%20tutorial%20videos%20about%20a%20software%20library%20for%20building%20LLM-powered%20applications.%20Given%20a%20question%2C%20return%20a%20database%20query%20optimized%20to%20retrieve%20the%20most%20relevant%20results.%5Cn%5CnIf%20there%20are%20acronyms%20or%20words%20you%20are%20not%20familiar%20with%2C%20do%20not%20try%20to%20rephrase%20them.'%0A%20%20%20%20query_prompt%20%3D%20ChatPromptTemplate.from_messages(%0A%20%20%20%20%20%20%20%20%5B(%22system%22%2C%20query_system_prompt)%2C%20(%22human%22%2C%20%22%7Bquestion%7D%22)%5D%0A%20%20%20%20)%0A%20%20%20%20structured_query_model%20%3D%20make_chat_model().with_structured_output(TutorialSearch)%0A%20%20%20%20query_analyzer%20%3D%20query_prompt%20%7C%20structured_query_model%0A%20%20%20%20return%20(query_analyzer%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%E7%B6%9A%E3%81%8F4%E3%81%A4%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%E3%80%81%E5%90%8C%E3%81%98%20%60query_analyzer%60%20%E3%81%AB%E5%B0%91%E3%81%97%E3%81%9A%E3%81%A4%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AA%E8%B3%AA%E5%95%8F%E3%82%92%E6%B8%A1%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E8%B3%AA%E5%95%8F%E3%81%8C%E3%80%8Crag%20from%20scratch%E3%80%8D%E3%81%8B%E3%82%89%E3%80%8C2023%E5%B9%B4%E3%81%AB%E5%85%AC%E9%96%8B%E3%80%8D%E3%80%8C2024%E5%B9%B4%E3%82%88%E3%82%8A%E5%89%8D%E3%80%8D%E3%80%8C5%E5%88%86%E6%9C%AA%E6%BA%80%E3%80%8D%E3%81%B8%E5%85%B7%E4%BD%93%E5%8C%96%E3%81%99%E3%82%8B%E3%81%AB%E3%81%A4%E3%82%8C%E3%81%A6%E3%80%81%E6%84%8F%E5%91%B3%E6%A4%9C%E7%B4%A2%E7%94%A8%E3%81%AE%20%60content_search%60%20%2F%20%60title_search%60%20%E3%81%AB%E5%8A%A0%E3%81%88%E3%81%A6%E3%80%81%E6%97%A5%E4%BB%98%E3%82%84%E5%8B%95%E7%94%BB%E6%99%82%E9%96%93%E3%81%AE%E7%AF%84%E5%9B%B2%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%8C%E5%9F%8B%E3%81%BE%E3%81%A3%E3%81%A6%E3%81%84%E3%81%8F%E7%82%B9%E3%82%92%E8%A6%B3%E5%AF%9F%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E5%90%84%E3%82%BB%E3%83%AB%E3%81%AF%20%60pretty_print()%60%20%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E6%97%A2%E5%AE%9A%E5%80%A4%E3%81%A8%E7%95%B0%E3%81%AA%E3%82%8B%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%A0%E3%81%91%E3%82%92%E8%A1%A8%E7%A4%BA%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_(query_analyzer)%3A%0A%20%20%20%20query_analyzer.invoke(%7B%22question%22%3A%20%22rag%20from%20scratch%22%7D).pretty_print()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(query_analyzer)%3A%0A%20%20%20%20query_analyzer.invoke(%0A%20%20%20%20%20%20%20%20%7B%22question%22%3A%20%22videos%20on%20chat%20langchain%20published%20in%202023%22%7D%0A%20%20%20%20).pretty_print()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(query_analyzer)%3A%0A%20%20%20%20query_analyzer.invoke(%0A%20%20%20%20%20%20%20%20%7B%22question%22%3A%20%22videos%20that%20are%20focused%20on%20the%20topic%20of%20chat%20langchain%20that%20are%20published%20before%202024%22%7D%0A%20%20%20%20).pretty_print()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(query_analyzer)%3A%0A%20%20%20%20query_analyzer.invoke(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22question%22%3A%20%22how%20to%20use%20multi-modal%20models%20in%20an%20agent%2C%20only%20videos%20under%205%20minutes%22%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20).pretty_print()%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%93%E3%82%8C%E3%82%92%E5%90%84%E7%A8%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%B9%E3%83%88%E3%82%A2%E3%81%B8%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%E3%80%81%5B%E3%81%93%E3%81%A1%E3%82%89%5D(https%3A%2F%2Fpython.langchain.com%2Fdocs%2Fmodules%2Fdata_connection%2Fretrievers%2Fself_query%23constructing-from-scratch-with-lcel)%E3%82%92%E5%8F%82%E7%85%A7%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%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
e9cb1412be8004a307f4ebd292cb55b7