import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Agentic%20RAG%0A%0A%20%20%20%20%E6%96%87%E6%9B%B8%E3%81%8B%E3%82%89%E6%83%85%E5%A0%B1%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%97%E3%80%81%E7%B5%B1%E5%90%88%E3%81%97%E3%81%A6%E5%9B%9E%E7%AD%94%E3%81%99%E3%82%8B%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AA%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AA%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%80%81%E9%AB%98%E5%BA%A6%E3%81%AA%0A%20%20%20%20Retrieval-Augmented%20Generation%EF%BC%88RAG%EF%BC%89%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%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%83%96%E3%83%83%E3%82%AF%E3%81%AF%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%AE%9F%E8%A1%8C%E3%82%92%E5%AF%BE%E8%B1%A1%E3%81%A8%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E4%BE%9D%E5%AD%98%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E6%BA%96%E5%82%99%E3%81%97%E3%81%9F%E3%81%86%E3%81%88%E3%81%A7%E3%80%81%0A%20%20%20%20%E5%90%84%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E5%BF%85%E8%A6%81%E3%81%AA%E9%A0%86%E3%81%AB%E6%8A%BC%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%0A%0A%20%20%20%20**%E8%AA%AD%E3%81%BF%E6%96%B9%3A**%20%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%BB%E3%83%AB%E3%81%AE%E7%9B%B4%E5%89%8D%E3%81%AB%E3%80%81%E3%81%9D%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%8C%E4%BD%95%E3%82%92%E3%81%99%E3%82%8B%E3%81%8B%E3%82%92%E8%AA%AC%E6%98%8E%E3%81%99%E3%82%8B%E8%A7%A3%E8%AA%AC%E3%82%BB%E3%83%AB%E3%82%92%E7%BD%AE%E3%81%84%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%BE%E3%81%9A%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%80%81%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E5%85%A8%E4%BD%93%E3%81%A7%E4%BD%BF%E3%81%86%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A8%20marimo%20%E6%9C%AC%E4%BD%93%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%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_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%85%A8%E4%BD%93%E3%81%AE%E6%B5%81%E3%82%8C%E3%81%A8%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6%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%AF%2013%20%E3%81%AE%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E3%80%81%E6%A4%9C%E7%B4%A2%E5%AF%BE%E8%B1%A1%E3%81%AE%E6%BA%96%E5%82%99%E3%81%8B%E3%82%89%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%BE%E3%81%A7%E3%82%92%E9%A0%86%E3%81%AB%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%7C%20%E6%AE%B5%E9%9A%8E%20%7C%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%20%7C%20%E5%86%85%E5%AE%B9%20%7C%0A%20%20%20%20%7C---%7C---%7C---%7C%0A%20%20%20%20%7C%20%E6%BA%96%E5%82%99%20%7C%201%E3%80%9C4%20%7C%20%E8%A8%AD%E5%AE%9A%E3%80%81LLM%E3%80%81%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%80%81%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%20%7C%0A%20%20%20%20%7C%20%E5%8F%96%E3%82%8A%E8%BE%BC%E3%81%BF%20%7C%205%E3%80%9C6%20%7C%20PDF%20%E3%82%92%20Markdown%20%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%97%E3%80%81Parent%2FChild%20%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%A8%E3%81%97%E3%81%A6%E7%B4%A2%E5%BC%95%E4%BB%98%E3%81%91%20%7C%0A%20%20%20%20%7C%20%E9%83%A8%E5%93%81%20%7C%207%E3%80%9C10%20%7C%20%E6%A4%9C%E7%B4%A2%E3%83%84%E3%83%BC%E3%83%AB%E3%80%81%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%80%81%E7%8A%B6%E6%85%8B%E3%80%81%E5%AE%9F%E8%A1%8C%E4%B8%8A%E9%99%90%20%7C%0A%20%20%20%20%7C%20%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%20%7C%2011%E3%80%9C12%20%7C%20%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A8%E3%82%A8%E3%83%83%E3%82%B8%E3%80%81LangGraph%20%E3%81%AE%E6%A7%8B%E7%AF%89%20%7C%0A%20%20%20%20%7C%20%E5%88%A9%E7%94%A8%20%7C%2012.5%E3%80%9C13%20%7C%20%E5%8F%AF%E8%A6%B3%E6%B8%AC%E6%80%A7%EF%BC%88%E4%BB%BB%E6%84%8F%EF%BC%89%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%20%7C%0A%0A%20%20%20%20**%E5%AE%9F%E8%A1%8C%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE**%0A%0A%20%20%20%20-%20%5BOllama%5D(https%3A%2F%2Follama.com)%20%E3%81%A8%E5%AF%BE%E8%B1%A1%E3%83%A2%E3%83%87%E3%83%AB%EF%BC%88%E6%97%A2%E5%AE%9A%E3%81%AF%20%60granite4.1%3A8b%60%EF%BC%89%E3%80%82%0A%20%20%20%20%20%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%202%20%E4%BB%A5%E9%99%8D%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E6%8A%BC%E3%81%99%E5%A0%B4%E5%90%88%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20-%20%60docs%2F%60%20%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E7%BD%AE%E3%81%84%E3%81%9F%20PDF%E3%80%82%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%205%E3%80%9C6%20%E3%81%A7%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20-%20Langfuse%20%E3%81%AE%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%EF%BC%88%E4%BB%BB%E6%84%8F%EF%BC%89%E3%80%82%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%2012.5%20%E3%81%A7%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E3%81%BF%E5%BF%85%E8%A6%81%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%AA%E3%81%8F%E3%81%A6%E3%82%82%E8%AA%AD%E3%82%81%E3%81%BE%E3%81%99%E3%80%82**%20%E9%87%8D%E3%81%84%E5%87%A6%E7%90%86%E3%81%AF%E3%81%99%E3%81%B9%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%A7%E4%BF%9D%E8%AD%B7%E3%81%97%E3%81%A6%E3%81%8A%E3%82%8A%E3%80%81%E6%8A%BC%E3%81%95%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%0A%20%20%20%20%E5%A4%96%E9%83%A8%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%B8%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82GitHub%20Pages%20%E3%81%A7%E5%85%AC%E9%96%8B%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E9%9D%99%E7%9A%84%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%81%AF%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C%E3%81%8C%0A%20%20%20%20%E5%90%AB%E3%81%BE%E3%82%8C%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%E8%A7%A3%E8%AA%AC%E3%82%92%E8%AA%AD%E3%82%80%E7%94%A8%E9%80%94%E3%81%AB%E3%81%AF%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%94%E5%88%A9%E7%94%A8%E3%81%84%E3%81%9F%E3%81%A0%E3%81%91%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%20import%20glob%0A%20%20%20%20import%20json%0A%20%20%20%20import%20logging%0A%20%20%20%20import%20operator%0A%20%20%20%20import%20os%0A%20%20%20%20import%20re%0A%20%20%20%20import%20uuid%0A%20%20%20%20from%20functools%20import%20lru_cache%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20from%20typing%20import%20Annotated%2C%20List%2C%20Literal%2C%20Set%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20Annotated%2C%0A%20%20%20%20%20%20%20%20List%2C%0A%20%20%20%20%20%20%20%20Literal%2C%0A%20%20%20%20%20%20%20%20Path%2C%0A%20%20%20%20%20%20%20%20Set%2C%0A%20%20%20%20%20%20%20%20glob%2C%0A%20%20%20%20%20%20%20%20json%2C%0A%20%20%20%20%20%20%20%20lru_cache%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20operator%2C%0A%20%20%20%20%20%20%20%20os%2C%0A%20%20%20%20%20%20%20%20uuid%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%201.%20%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A%0A%0A%20%20%20%20%E6%96%87%E6%9B%B8%E5%87%A6%E7%90%86%E7%94%A8%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E6%88%90%E3%81%A8%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E5%86%85%E5%AE%B9%3A**%0A%20%20%20%20-%20PDF%E3%80%81Markdown%E3%80%81%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%90%8D%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%A7%E3%81%AF%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%A8%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%20Qdrant%20%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E6%BA%96%E5%82%99%E3%82%82%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%E5%BF%85%E8%A6%81%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%BE%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%E5%90%84%E7%A8%AE%E3%83%91%E3%82%B9%E3%83%BB%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%90%8D%E3%83%BB%E6%A4%9C%E7%B4%A2%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E5%AE%9A%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%80%81%E5%88%9D%E6%9C%9F%E5%8C%96%E7%94%A8%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%83%9C%E3%82%BF%E3%83%B3%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_(Path%2C%20mo)%3A%0A%20%20%20%20%23%20%E8%A8%AD%E5%AE%9A%0A%20%20%20%20PROJECT_ROOT%20%3D%20Path(__file__).resolve().parent.parent%0A%20%20%20%20DOCS_DIR%20%3D%20str(PROJECT_ROOT%20%2F%20%22docs%22)%0A%20%20%20%20MARKDOWN_DIR%20%3D%20str(PROJECT_ROOT%20%2F%20%22markdown_docs%22)%0A%20%20%20%20PARENT_STORE_PATH%20%3D%20str(PROJECT_ROOT%20%2F%20%22parent_store%22)%0A%20%20%20%20QDRANT_DB_PATH%20%3D%20str(PROJECT_ROOT%20%2F%20%22qdrant_db%22)%0A%20%20%20%20CHILD_COLLECTION%20%3D%20%22document_child_chunks%22%0A%20%20%20%20RETRIEVAL_SCORE_THRESHOLD%20%3D%200.4%0A%20%20%20%20DEFAULT_RETRIEVAL_K%20%3D%207%0A%20%20%20%20CHILD_CHUNK_SEPARATOR%20%3D%20%22%5Cn%5Cn%3CCHILD_CHUNK_BOUNDARY%3E%5Cn%5Cn%22%0A%0A%20%20%20%20initialization_button%20%3D%20mo.ui.run_button(label%3D%22%E5%88%9D%E6%9C%9F%E5%8C%96%E3%82%92%E5%AE%9F%E8%A1%8C%22)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%80%81%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%80%81Qdrant%20%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20initialization_button%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20CHILD_CHUNK_SEPARATOR%2C%0A%20%20%20%20%20%20%20%20CHILD_COLLECTION%2C%0A%20%20%20%20%20%20%20%20DEFAULT_RETRIEVAL_K%2C%0A%20%20%20%20%20%20%20%20DOCS_DIR%2C%0A%20%20%20%20%20%20%20%20MARKDOWN_DIR%2C%0A%20%20%20%20%20%20%20%20PARENT_STORE_PATH%2C%0A%20%20%20%20%20%20%20%20QDRANT_DB_PATH%2C%0A%20%20%20%20%20%20%20%20RETRIEVAL_SCORE_THRESHOLD%2C%0A%20%20%20%20%20%20%20%20initialization_button%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%201.1%20%E4%BD%9C%E6%A5%AD%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90%0A%0A%20%20%20%20**%E5%88%9D%E6%9C%9F%E5%8C%96%E3%82%92%E5%AE%9F%E8%A1%8C**%20%E3%82%92%E6%8A%BC%E3%81%99%E3%81%A8%E3%80%81%E3%81%93%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%8C%20%60docs%2F%60%E3%80%81%60markdown_docs%2F%60%E3%80%81%60parent_store%2F%60%20%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E5%85%88%E9%A0%AD%E3%81%AE%20%60mo.stop%60%20%E3%81%8C%E3%82%B2%E3%83%BC%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E5%83%8D%E3%81%8D%E3%80%81%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E6%8A%BC%E3%81%99%E3%81%BE%E3%81%A7%E5%88%9D%E6%9C%9F%E5%8C%96%E5%87%A6%E7%90%86%E3%81%AF%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20DOCS_DIR%2C%0A%20%20%20%20MARKDOWN_DIR%2C%0A%20%20%20%20PARENT_STORE_PATH%2C%0A%20%20%20%20initialization_button%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20os%2C%0A)%3A%0A%20%20%20%20mo.stop(%0A%20%20%20%20%20%20%20%20not%20initialization_button.value%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%E5%88%9D%E6%9C%9F%E5%8C%96%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E4%BD%9C%E6%A5%AD%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%22)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20os.makedirs(DOCS_DIR%2C%20exist_ok%3DTrue)%0A%20%20%20%20os.makedirs(MARKDOWN_DIR%2C%20exist_ok%3DTrue)%0A%20%20%20%20os.makedirs(PARENT_STORE_PATH%2C%20exist_ok%3DTrue)%0A%0A%20%20%20%20%23%20%E5%BE%8C%E7%B6%9A%E3%82%BB%E3%83%AB%E3%81%8C%E3%81%93%E3%81%AE%E5%80%A4%E3%82%92%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E3%80%81%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E4%BD%9C%E6%88%90%E3%81%8C%E5%85%88%E3%81%AB%E8%B5%B0%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E4%BF%9D%E8%A8%BC%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20workspace_dirs%20%3D%20(DOCS_DIR%2C%20MARKDOWN_DIR%2C%20PARENT_STORE_PATH)%0A%20%20%20%20return%20(workspace_dirs%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.%20LLM%20%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%0A%0A%20%20%20%20%E4%BC%9A%E8%A9%B1%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%20Large%20Language%20Model%20%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E5%86%85%E5%AE%B9%3A**%0A%20%20%20%20-%20Ollama%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%20LLM%20%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%EF%BC%88%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E6%8E%A8%E8%AB%96%EF%BC%89%0A%20%20%20%20-%20Google%20Gemini%20%E3%81%AE%E4%BB%A3%E6%9B%BF%E4%BE%8B%E3%82%92%E7%A4%BA%E3%81%99%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AF%20%60ChatOllama%60%20%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%80%81%E6%B8%A9%E5%BA%A6%200%20%E3%81%A8%E5%9B%BA%E5%AE%9A%E3%82%B7%E3%83%BC%E3%83%89%E3%81%A7%E5%86%8D%E7%8F%BE%E6%80%A7%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%97%E3%81%9F%20%60llm%60%20%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%60llm%60%20%E3%81%AF%E8%A6%81%E7%B4%84%E3%83%BB%E3%82%AF%E3%82%A8%E3%83%AA%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%83%BB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%83%BB%E9%9B%86%E7%B4%84%E3%81%AA%E3%81%A9%E3%80%81%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E5%85%A8%E4%BD%93%E3%81%A7%E5%85%B1%E6%9C%89%E3%81%95%E3%82%8C%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%3A**%0A%20%20%20%20-%20%5BLangChain%20Ollama%5D(https%3A%2F%2Fpython.langchain.com%2Fdocs%2Fintegrations%2Fchat%2Follama)%0A%20%20%20%20-%20%5BLangChain%20Google%20GenAI%5D(https%3A%2F%2Fpython.langchain.com%2Fdocs%2Fintegrations%2Fchat%2Fgoogle_generative_ai)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(initialization_button%2C%20mo)%3A%0A%20%20%20%20mo.stop(%0A%20%20%20%20%20%20%20%20not%20initialization_button.value%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%E5%88%9D%E6%9C%9F%E5%8C%96%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%20LLM%20%E3%82%92%E6%BA%96%E5%82%99%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%22)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20from%20langchain_ollama%20import%20ChatOllama%0A%0A%20%20%20%20%23%20LLM%20%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%0A%20%20%20%20LLM_SEED%20%3D%2042%0A%20%20%20%20llm%20%3D%20ChatOllama(model%3D%22granite4.1%3A8b%22%2C%20temperature%3D0%2C%20seed%3DLLM_SEED)%0A%0A%20%20%20%20%23%20%E4%BB%A3%E6%9B%BF%E4%BE%8B%3A%20Google%20Gemini%0A%20%20%20%20%23%20from%20langchain_google_genai%20import%20ChatGoogleGenerativeAI%0A%20%20%20%20%23%20os.environ%5B%22GOOGLE_API_KEY%22%5D%20%3D%20%22your-api-key-here%22%0A%20%20%20%20%23%20llm%20%3D%20ChatGoogleGenerativeAI(model%3D%22gemini-2.5-flash%22%2C%20temperature%3D0)%0A%20%20%20%20return%20(llm%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%203.%20%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%AE%E8%A8%AD%E5%AE%9A%0A%0A%20%20%20%20%E5%AF%86%E3%83%BB%E7%96%8E%E3%81%AE%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E6%A4%9C%E7%B4%A2%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%84%8F%E5%91%B3%E6%A4%9C%E7%B4%A2%E7%94%A8%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E5%86%85%E5%AE%B9%3A**%0A%20%20%20%20-%20**%E5%AF%86%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF**%3A%20%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A7%E6%84%8F%E5%91%B3%E3%82%92%E6%8D%89%E3%81%88%E3%82%8B%0A%20%20%20%20-%20**%E7%96%8E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF**%3A%20%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E7%85%A7%E5%90%88%EF%BC%88BM25%20%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%EF%BC%89%E3%82%92%E8%A1%8C%E3%81%86%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%20%60dense_embeddings%60%20%E3%81%A8%20%60sparse_embeddings%60%20%E3%81%AF%E3%80%816%20%E7%AB%A0%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E4%BD%9C%E6%88%90%E3%81%A8%0A%20%20%20%207%20%E7%AB%A0%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%83%84%E3%83%BC%E3%83%AB%E3%81%A7%E5%90%8C%E3%81%98%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%AE%E3%81%BE%E3%81%BE%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E5%88%9D%E5%9B%9E%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%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%3A**%0A%20%20%20%20-%20%5BHuggingFace%20Embeddings%5D(https%3A%2F%2Fpython.langchain.com%2Fdocs%2Fintegrations%2Ftext_embedding%2Fhuggingfacehub)%0A%20%20%20%20-%20%5BFastEmbed%20Sparse%5D(https%3A%2F%2Fqdrant.github.io%2Ffastembed%2F)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(initialization_button%2C%20mo)%3A%0A%20%20%20%20mo.stop(%0A%20%20%20%20%20%20%20%20not%20initialization_button.value%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%E5%88%9D%E6%9C%9F%E5%8C%96%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%BE%E3%81%99%E3%80%82%22)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20from%20langchain_huggingface%20import%20HuggingFaceEmbeddings%0A%20%20%20%20from%20langchain_qdrant.fastembed_sparse%20import%20FastEmbedSparse%0A%0A%20%20%20%20%23%20%E6%84%8F%E5%91%B3%E7%9A%84%E7%90%86%E8%A7%A3%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%AF%86%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%0A%20%20%20%20dense_embeddings%20%3D%20HuggingFaceEmbeddings(model_name%3D%22Qwen%2FQwen3-Embedding-0.6B%22)%0A%0A%20%20%20%20%23%20%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E7%85%A7%E5%90%88%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%96%8E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%0A%20%20%20%20sparse_embeddings%20%3D%20FastEmbedSparse(model_name%3D%22Qdrant%2Fbm25%22)%0A%20%20%20%20return%20dense_embeddings%2C%20sparse_embeddings%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%204.%20%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A%0A%0A%20%20%20%20%E6%96%87%E6%9B%B8%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%82%92%E4%BF%9D%E5%AD%98%E3%83%BB%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%20Qdrant%20%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E6%BA%96%E5%82%99%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E5%86%85%E5%AE%B9%3A**%0A%20%20%20%20-%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%20Qdrant%20%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E5%AF%86%E3%83%BB%E7%96%8E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E4%B8%A1%E6%96%B9%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E6%8C%81%E3%81%A4%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E6%A4%9C%E7%B4%A2%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%20Qdrant%20%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%A8%20LangChain%20%E9%80%A3%E6%90%BA%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%80%81%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%20DB%20%E3%82%92%E9%96%8B%E3%81%84%E3%81%9F%E3%81%86%E3%81%88%E3%81%A7%E3%80%81%0A%20%20%20%20%E5%AE%9F%E9%9A%9B%E3%81%AB%201%20%E4%BB%B6%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%93%E3%81%A7%E5%AF%86%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E6%AC%A1%E5%85%83%E6%95%B0%E3%82%92%E6%B8%AC%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%E6%AC%A1%E5%85%83%E6%95%B0%E3%81%AF%204.1%20%E3%81%AE%E6%A4%9C%E8%A8%BC%E3%81%AB%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AF%203%20%E7%AB%A0%E3%81%AE%20%60dense_embeddings%60%20%E3%81%AB%E4%BE%9D%E5%AD%98%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%88%9D%E6%9C%9F%E5%8C%96%E5%89%8D%E3%81%AF%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%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%3A**%0A%20%20%20%20-%20%5BLangChain%20Qdrant%5D(https%3A%2F%2Fpython.langchain.com%2Fdocs%2Fintegrations%2Fvectorstores%2Fqdrant)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(QDRANT_DB_PATH%2C%20dense_embeddings)%3A%0A%20%20%20%20from%20langchain_qdrant%20import%20QdrantVectorStore%0A%20%20%20%20from%20langchain_qdrant.qdrant%20import%20RetrievalMode%0A%20%20%20%20from%20qdrant_client%20import%20QdrantClient%0A%20%20%20%20from%20qdrant_client.http%20import%20models%20as%20qmodels%0A%0A%20%20%20%20%23%20%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%20Qdrant%20%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%0A%20%20%20%20client%20%3D%20QdrantClient(path%3DQDRANT_DB_PATH)%0A%0A%20%20%20%20%23%20%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E6%AC%A1%E5%85%83%E3%82%92%E5%8F%96%E5%BE%97%0A%20%20%20%20embedding_dimension%20%3D%20len(dense_embeddings.embed_query(%22test%22))%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20QdrantVectorStore%2C%0A%20%20%20%20%20%20%20%20RetrievalMode%2C%0A%20%20%20%20%20%20%20%20client%2C%0A%20%20%20%20%20%20%20%20embedding_dimension%2C%0A%20%20%20%20%20%20%20%20qmodels%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%204.1%20%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E6%AC%A1%E5%85%83%E3%81%AE%E6%A4%9C%E8%A8%BC%0A%0A%20%20%20%20%60ensure_collection%60%20%E3%81%AF%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8C%E7%84%A1%E3%81%91%E3%82%8C%E3%81%B0%E5%AF%86%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%EF%BC%88%E3%82%B3%E3%82%B5%E3%82%A4%E3%83%B3%E8%B7%9D%E9%9B%A2%EF%BC%89%E3%81%A8%E7%96%8E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A%E4%BB%98%E3%81%8D%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%80%81%0A%20%20%20%20%E6%97%A2%E3%81%AB%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E4%BF%9D%E5%AD%98%E6%B8%88%E3%81%BF%E3%81%AE%E6%AC%A1%E5%85%83%E3%81%A8%E7%8F%BE%E5%9C%A8%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E6%AC%A1%E5%85%83%E3%81%8C%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%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%E4%B8%80%E8%87%B4%E3%81%97%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E4%BE%8B%E5%A4%96%E3%82%92%E9%80%81%E5%87%BA%E3%81%97%E3%80%81%E5%8F%A4%E3%81%84%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%B8%E6%AC%A1%E5%85%83%E3%81%AE%E7%95%B0%E3%81%AA%E3%82%8B%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%82%92%E6%B7%B7%E3%81%9C%E3%82%8B%E4%BA%8B%E6%95%85%E3%82%92%E9%98%B2%E3%81%8E%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%60get_collection_vector_size%60%20%E3%81%AF%E3%80%81%E5%8D%98%E4%B8%80%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E6%A7%8B%E6%88%90%E3%81%A8%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E6%A7%8B%E6%88%90%E3%81%AE%E4%B8%A1%E6%96%B9%E3%81%8B%E3%82%89%E6%AC%A1%E5%85%83%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99%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.cell%0Adef%20_(client%2C%20embedding_dimension%2C%20mo%2C%20qmodels)%3A%0A%20%20%20%20def%20get_collection_vector_size(collection_info)%3A%0A%20%20%20%20%20%20%20%20vectors_config%20%3D%20collection_info.config.params.vectors%0A%20%20%20%20%20%20%20%20if%20hasattr(vectors_config%2C%20%22size%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20vectors_config.size%0A%20%20%20%20%20%20%20%20if%20isinstance(vectors_config%2C%20dict)%20and%20vectors_config%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20first_vector%20%3D%20next(iter(vectors_config.values()))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20getattr(first_vector%2C%20%22size%22%2C%20None)%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20def%20ensure_collection(collection_name)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%BF%85%E8%A6%81%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%20Qdrant%20%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%80%81%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E6%AC%A1%E5%85%83%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%99%E3%82%8B%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20if%20not%20client.collection_exists(collection_name)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20client.create_collection(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20collection_name%3Dcollection_name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vectors_config%3Dqmodels.VectorParams(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20size%3Dembedding_dimension%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20distance%3Dqmodels.Distance.COSINE%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%20sparse_vectors_config%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22sparse%22%3A%20qmodels.SparseVectorParams()%2C%0A%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)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9C%93%20%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%3A%20%7Bcollection_name%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%0A%20%20%20%20%20%20%20%20collection_info%20%3D%20client.get_collection(collection_name)%0A%20%20%20%20%20%20%20%20existing_dimension%20%3D%20get_collection_vector_size(collection_info)%0A%20%20%20%20%20%20%20%20if%20existing_dimension%20and%20existing_dimension%20!%3D%20embedding_dimension%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%20'%7Bcollection_name%7D'%20%E3%81%AF%E5%AF%86%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E6%AC%A1%E5%85%83%20%7Bexisting_dimension%7D%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%E7%8F%BE%E5%9C%A8%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AF%20%7Bembedding_dimension%7D%20%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF%20qdrant_db%20%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%A6%E6%96%87%E6%9B%B8%E3%82%92%E5%86%8D%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(f%22%E2%9C%93%20%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AF%E3%81%99%E3%81%A7%E3%81%AB%E5%AD%98%E5%9C%A8%E3%81%97%E3%81%BE%E3%81%99%3A%20%7Bcollection_name%7D%22)%0A%0A%20%20%20%20mo.md(%22%E2%9C%93%20%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%20RAG%20%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%22)%0A%20%20%20%20return%20(ensure_collection%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%205.%20PDF%20%E3%81%8B%E3%82%89%20Markdown%20%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B%0A%0A%20%20%20%20PDF%20%E6%96%87%E6%9B%B8%E3%82%92%20Markdown%20%E5%BD%A2%E5%BC%8F%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%97%E3%80%81%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E6%8A%BD%E5%87%BA%E3%81%A8%E5%87%A6%E7%90%86%E3%82%92%E8%A1%8C%E3%81%84%E3%82%84%E3%81%99%E3%81%8F%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E5%86%85%E5%AE%B9%3A**%0A%20%20%20%20-%20PyMuPDF%20%E3%81%A7%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E6%96%87%E6%9B%B8%E3%82%92%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%81%AA%20Markdown%20%E5%BD%A2%E5%BC%8F%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E5%95%8F%E9%A1%8C%E3%82%92%E5%87%A6%E7%90%86%E3%81%97%E3%80%81%E7%94%BB%E5%83%8F%E3%82%92%E9%99%A4%E5%A4%96%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%60overwrite%60%20%E3%81%8C%E6%9C%89%E5%8A%B9%E3%81%A7%E3%81%AA%E3%81%84%E9%99%90%E3%82%8A%E3%80%81%E5%A4%89%E6%8F%9B%E6%B8%88%E3%81%BF%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%B9%E3%82%AD%E3%83%83%E3%83%97%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AF%20PyMuPDF%20%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%80%81PDF%201%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%20Markdown%20%E5%8C%96%E3%81%99%E3%82%8B%20%60pdf_to_markdown%60%20%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%83%BB%E3%83%95%E3%83%83%E3%82%BF%E3%83%BC%E3%83%BB%E7%94%BB%E5%83%8F%E3%82%92%E9%99%A4%E5%A4%96%E3%81%97%E3%80%81%E3%82%B5%E3%83%AD%E3%82%B2%E3%83%BC%E3%83%88%E3%83%9A%E3%82%A2%E3%82%92%E5%90%AB%E3%82%80%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%20UTF-8%20%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E6%B3%A8%E8%A8%98%3A**%20PDF%20%E5%A4%89%E6%8F%9B%E3%81%AE%E8%A9%B3%E7%B4%B0%E3%81%AF%E3%80%81%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%20%60pdf_to_markdown.ipynb%60%20%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%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%0A%20%20%20%20**%E4%BB%BB%E6%84%8F%3A**%20%F0%9F%90%BF%EF%B8%8F%20%5B**Chunky**%5D(https%3A%2F%2Fgithub.com%2FGiovanniPasq%2Fchunky)%20%E3%81%AF%E3%80%81%E4%BF%A1%E9%A0%BC%E6%80%A7%E3%81%AE%E9%AB%98%E3%81%84%0A%20%20%20%20RAG%20%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%84%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%83%E3%83%88%E3%81%A7%E3%81%99%E3%80%82PDF%20%E3%81%8B%E3%82%89%20Markdown%20%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B%E3%80%81%0A%20%20%20%20%E6%96%87%E6%9B%B8%E3%81%AE%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%80%81%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%80%81%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E5%8C%96%E6%88%A6%E7%95%A5%E3%81%AE%E6%AF%94%E8%BC%83%E3%80%81%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%B9%E3%83%88%E3%82%A2%E6%A7%8B%E7%AF%89%E5%89%8D%E3%81%AE%0A%20%20%20%20%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E6%8B%A1%E5%85%85%E3%82%92%E8%A1%8C%E3%81%88%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%3A**%0A%20%20%20%20-%20%5BPyMuPDF%5D(https%3A%2F%2Fpymupdf.readthedocs.io%2F)%0A%20%20%20%20-%20%5BPyMuPDF4LLM%5D(https%3A%2F%2Fgithub.com%2Fpymupdf%2FPyMuPDF4LLM)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Path%2C%20initialization_button%2C%20mo%2C%20os)%3A%0A%20%20%20%20mo.stop(%0A%20%20%20%20%20%20%20%20not%20initialization_button.value%2C%0A%20%20%20%20%20%20%20%20mo.md(%22PDF%20%E5%A4%89%E6%8F%9B%E6%A9%9F%E8%83%BD%E3%81%AF%E5%88%9D%E6%9C%9F%E5%8C%96%E5%BE%8C%E3%81%AB%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%22)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20import%20pymupdf.layout%0A%20%20%20%20import%20pymupdf4llm%0A%0A%20%20%20%20os.environ%5B%22TOKENIZERS_PARALLELISM%22%5D%20%3D%20%22false%22%0A%0A%20%20%20%20def%20pdf_to_markdown(pdf_path%2C%20output_dir)%3A%0A%20%20%20%20%20%20%20%20doc%20%3D%20pymupdf.open(pdf_path)%0A%20%20%20%20%20%20%20%20md%20%3D%20pymupdf4llm.to_markdown(%0A%20%20%20%20%20%20%20%20%20%20%20%20doc%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20header%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20footer%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20page_separators%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20ignore_images%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20write_images%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20image_path%3DNone%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20md_cleaned%20%3D%20md.encode(%22utf-8%22%2C%20errors%3D%22surrogatepass%22).decode(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22utf-8%22%2C%20errors%3D%22ignore%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20output_path%20%3D%20Path(output_dir)%20%2F%20Path(doc.name).stem%0A%20%20%20%20%20%20%20%20Path(output_path).with_suffix(%22.md%22).write_bytes(md_cleaned.encode(%22utf-8%22))%0A%0A%20%20%20%20return%20(pdf_to_markdown%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%205.1%20%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%8D%98%E4%BD%8D%E3%81%AE%E4%B8%80%E6%8B%AC%E5%A4%89%E6%8F%9B%0A%0A%20%20%20%20%60pdfs_to_markdowns%60%20%E3%81%AF%20glob%20%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AB%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%20PDF%20%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%60overwrite%3DFalse%60%EF%BC%88%E6%97%A2%E5%AE%9A%EF%BC%89%E3%81%AE%E3%81%A8%E3%81%8D%E3%81%AF%E5%90%8C%E5%90%8D%E3%81%AE%20Markdown%20%E3%81%8C%E6%97%A2%E3%81%AB%E3%81%82%E3%82%8B%20PDF%20%E3%82%92%E3%82%B9%E3%82%AD%E3%83%83%E3%83%97%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%E6%96%87%E6%9B%B8%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%9F%E3%81%82%E3%81%A8%E3%81%AB%E5%86%8D%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%82%82%E5%B7%AE%E5%88%86%E3%81%A0%E3%81%91%E3%81%8C%E5%A4%89%E6%8F%9B%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_(MARKDOWN_DIR%2C%20Path%2C%20glob%2C%20pdf_to_markdown)%3A%0A%20%20%20%20def%20pdfs_to_markdowns(path_pattern%2C%20overwrite%3A%20bool%20%3D%20False)%3A%0A%20%20%20%20%20%20%20%20output_dir%20%3D%20Path(MARKDOWN_DIR)%0A%20%20%20%20%20%20%20%20output_dir.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%0A%20%20%20%20%20%20%20%20for%20pdf_path%20in%20map(Path%2C%20glob.glob(path_pattern))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20md_path%20%3D%20(output_dir%20%2F%20pdf_path.stem).with_suffix(%22.md%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20overwrite%20or%20not%20md_path.exists()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pdf_to_markdown(pdf_path%2C%20output_dir)%0A%0A%20%20%20%20return%20(pdfs_to_markdowns%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%205.2%20%E5%A4%89%E6%8F%9B%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%83%9C%E3%82%BF%E3%83%B3%0A%0A%20%20%20%20%E5%A4%89%E6%8F%9B%E3%81%AB%E3%81%AF%E6%99%82%E9%96%93%E3%81%8C%E3%81%8B%E3%81%8B%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%A8%E3%81%AF%E5%88%A5%E3%81%AE%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%A7%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AF%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E3%80%81%E5%A4%89%E6%8F%9B%E8%87%AA%E4%BD%93%E3%81%AF%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(initialization_button%2C%20mo)%3A%0A%20%20%20%20mo.stop(%0A%20%20%20%20%20%20%20%20not%20initialization_button.value%2C%0A%20%20%20%20%20%20%20%20mo.md(%22PDF%20%E5%A4%89%E6%8F%9B%E3%81%AF%E5%88%9D%E6%9C%9F%E5%8C%96%E5%BE%8C%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%22)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20conversion_button%20%3D%20mo.ui.run_button(label%3D%22PDF%20%E3%82%92%20Markdown%20%E3%81%AB%E5%A4%89%E6%8F%9B%22)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%60docs%2F%60%20%E5%86%85%E3%81%AE%20PDF%20%E3%82%92%20%60markdown_docs%2F%60%20%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20conversion_button%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%20(conversion_button%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%205.3%20%E5%A4%89%E6%8F%9B%E3%81%AE%E5%AE%9F%E8%A1%8C%0A%0A%20%20%20%20%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%8C%E6%8A%BC%E3%81%95%E3%82%8C%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%A0%E3%81%91%20%60docs%2F*.pdf%60%20%E3%82%92%E8%B5%B0%E6%9F%BB%E3%81%97%E3%80%81%60markdown_docs%2F%60%20%E3%81%B8%20Markdown%20%E3%82%92%E6%9B%B8%E3%81%8D%E5%87%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_(DOCS_DIR%2C%20conversion_button%2C%20mo%2C%20pdfs_to_markdowns)%3A%0A%20%20%20%20mo.stop(%0A%20%20%20%20%20%20%20%20not%20conversion_button.value%2C%0A%20%20%20%20%20%20%20%20mo.md(%22PDF%20%E5%A4%89%E6%8F%9B%E3%81%AF%E3%81%BE%E3%81%A0%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%22)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20pdfs_to_markdowns(f%22%7BDOCS_DIR%7D%2F*.pdf%22)%0A%20%20%20%20mo.md(%22%E2%9C%93%20PDF%20%E3%81%8B%E3%82%89%20Markdown%20%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.%20%E6%96%87%E6%9B%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E4%BD%9C%E6%88%90%0A%0A%20%20%20%20%E6%A4%9C%E7%B4%A2%E6%80%A7%E8%83%BD%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E8%A6%AA%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E5%8C%96%E6%88%A6%E7%95%A5%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E5%86%85%E5%AE%B9%3A**%0A%20%20%20%20-%20%E6%96%87%E6%9B%B8%E3%82%92%E9%9A%8E%E5%B1%A4%E7%9A%84%E3%81%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%EF%BC%88%E8%A6%AA%E3%83%BB%E5%AD%90%EF%BC%89%E3%81%B8%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF**%3A%20%E5%A4%A7%E3%81%8D%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%EF%BC%882%2C000%EF%BD%9E4%2C000%20%E6%96%87%E5%AD%97%EF%BC%89%E3%82%92%20JSON%20%E3%81%A8%E3%81%97%E3%81%A6%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF**%3A%20%E5%B0%8F%E3%81%95%E3%81%8F%E6%A4%9C%E7%B4%A2%E5%8F%AF%E8%83%BD%E3%81%AA%E5%8D%98%E4%BD%8D%EF%BC%88500%20%E6%96%87%E5%AD%97%EF%BC%89%E3%82%92%20Qdrant%20%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E5%B0%8F%E3%81%95%E3%81%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E7%B5%B1%E5%90%88%E3%81%97%E3%80%81%E5%A4%A7%E3%81%8D%E3%81%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E5%88%86%E5%89%B2%E3%81%97%E3%81%A6%E4%B8%80%E8%B2%AB%E6%80%A7%E3%82%92%E4%BF%9D%E3%81%A4%0A%20%20%20%20-%20%E5%90%84%E8%A6%AA%20ID%20%E3%82%92%E5%AD%90%E3%81%AE%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%81%B8%E3%82%B3%E3%83%94%E3%83%BC%E3%81%97%E3%80%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E3%82%88%E3%82%8A%E5%BA%83%E3%81%84%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%81%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%0A%0A%20%20%20%20**%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E5%8C%96%E6%88%A6%E7%95%A5%3A**%0A%20%20%20%201.%20Markdown%20%E3%81%AE%E8%A6%8B%E5%87%BA%E3%81%97%EF%BC%88%60%23%60%E3%80%81%60%23%23%60%E3%80%81%60%23%23%23%60%EF%BC%89%E3%81%A7%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B%0A%20%20%20%202.%202%2C000%20%E6%96%87%E5%AD%97%E6%9C%AA%E6%BA%80%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E7%B5%B1%E5%90%88%E3%81%99%E3%82%8B%0A%20%20%20%203.%204%2C000%20%E6%96%87%E5%AD%97%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B%0A%20%20%20%204.%20%E5%90%84%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%8B%E3%82%89%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%EF%BC%88500%20%E6%96%87%E5%AD%97%EF%BC%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%0A%20%20%20%205.%20%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%20JSON%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%97%E3%81%A6%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%0A%20%20%20%206.%20%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%B8%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%99%E3%82%8B%0A%0A%20%20%20%206.1%20%E3%81%A7%E6%BA%96%E5%82%99%E3%80%816.2%20%E3%81%A7%E5%87%A6%E7%90%86%E6%9C%AC%E4%BD%93%E3%80%816.3%E3%80%9C6.7%20%E3%81%A7%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E6%95%B4%E5%BD%A2%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%80%816.8%20%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%A8%E3%81%84%E3%81%86%E9%A0%86%E3%81%AB%E5%88%86%E5%89%B2%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%BE%E3%81%9A%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%80%81%E5%86%8D%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E7%94%A8%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%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%3A**%0A%20%20%20%20-%20%5BLangChain%20Text%20Splitters%5D(https%3A%2F%2Fdocs.langchain.com%2Foss%2Fpython%2Fintegrations%2Fsplitters)%0A%20%20%20%20-%20%5BLangChain%20Split%20Markdown%5D(https%3A%2F%2Fdocs.langchain.com%2Foss%2Fpython%2Fintegrations%2Fsplitters%2Fmarkdown_header_metadata_splitter)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(initialization_button%2C%20mo)%3A%0A%20%20%20%20mo.stop(%0A%20%20%20%20%20%20%20%20not%20initialization_button.value%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%E6%96%87%E6%9B%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E4%BD%9C%E6%88%90%E3%81%AF%E5%88%9D%E6%9C%9F%E5%8C%96%E5%BE%8C%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%22)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20indexing_button%20%3D%20mo.ui.run_button(label%3D%22%E6%96%87%E6%9B%B8%E3%82%92%E5%86%8D%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%22)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%E6%97%A2%E5%AD%98%E3%81%AE%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%E3%80%81%60markdown_docs%2F%60%20%E3%81%AE%E6%96%87%E6%9B%B8%E3%82%92%E5%86%8D%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22warn%22%2C%0A%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%20indexing_button%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%20(indexing_button%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%206.1%20%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%86%8D%E4%BD%9C%E6%88%90%E3%81%A8%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%B9%E3%83%88%E3%82%A2%E3%81%AE%E6%BA%96%E5%82%99%0A%0A%20%20%20%20**%E6%96%87%E6%9B%B8%E3%82%92%E5%86%8D%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9**%20%E3%82%92%E6%8A%BC%E3%81%99%E3%81%A8%E3%80%81%E6%97%A2%E5%AD%98%E3%81%AE%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8A%E7%9B%B4%E3%81%97%E3%80%81%0A%20%20%20%20%E5%AF%86%E3%83%BB%E7%96%8E%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E6%A4%9C%E7%B4%A2%E7%94%A8%E3%81%AE%20%60child_vector_store%60%20%E3%82%92%E7%94%A8%E6%84%8F%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E4%BD%9C%E3%82%8A%E7%9B%B4%E3%81%99%E3%81%93%E3%81%A8%E3%81%A7%E3%80%81%0A%20%20%20%20%E5%86%8D%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E6%99%82%E3%81%AB%E5%8F%A4%E3%81%84%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%8C%E6%AE%8B%E3%81%A3%E3%81%A6%E9%87%8D%E8%A4%87%E3%83%92%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E9%98%B2%E3%81%8E%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%202%20%E3%81%A4%E3%81%AE%E3%82%B9%E3%83%97%E3%83%AA%E3%83%83%E3%82%BF%E3%83%BC%E3%81%AF%E3%80%816.2%20%E3%81%A8%206.5%20%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E6%95%B4%E5%BD%A2%E3%81%A7%E4%BD%BF%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_(%0A%20%20%20%20CHILD_COLLECTION%2C%0A%20%20%20%20QdrantVectorStore%2C%0A%20%20%20%20RetrievalMode%2C%0A%20%20%20%20client%2C%0A%20%20%20%20dense_embeddings%2C%0A%20%20%20%20ensure_collection%2C%0A%20%20%20%20indexing_button%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20sparse_embeddings%2C%0A)%3A%0A%20%20%20%20mo.stop(%0A%20%20%20%20%20%20%20%20not%20indexing_button.value%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%E6%96%87%E6%9B%B8%E3%82%92%E5%86%8D%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E3%81%93%E3%81%93%E3%81%AB%E7%B5%90%E6%9E%9C%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%22)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20from%20langchain_text_splitters%20import%20(%0A%20%20%20%20%20%20%20%20MarkdownHeaderTextSplitter%2C%0A%20%20%20%20%20%20%20%20RecursiveCharacterTextSplitter%2C%0A%20%20%20%20)%0A%0A%20%20%20%20if%20client.collection_exists(CHILD_COLLECTION)%3A%0A%20%20%20%20%20%20%20%20print(f%22%E6%97%A2%E5%AD%98%E3%81%AE%20Qdrant%20%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%BE%E3%81%99%3A%20%7BCHILD_COLLECTION%7D%22)%0A%20%20%20%20%20%20%20%20client.delete_collection(CHILD_COLLECTION)%0A%20%20%20%20%20%20%20%20ensure_collection(CHILD_COLLECTION)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20ensure_collection(CHILD_COLLECTION)%0A%0A%20%20%20%20child_vector_store%20%3D%20QdrantVectorStore(%0A%20%20%20%20%20%20%20%20client%3Dclient%2C%0A%20%20%20%20%20%20%20%20collection_name%3DCHILD_COLLECTION%2C%0A%20%20%20%20%20%20%20%20embedding%3Ddense_embeddings%2C%0A%20%20%20%20%20%20%20%20sparse_embedding%3Dsparse_embeddings%2C%0A%20%20%20%20%20%20%20%20retrieval_mode%3DRetrievalMode.HYBRID%2C%0A%20%20%20%20%20%20%20%20sparse_vector_name%3D%22sparse%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20MarkdownHeaderTextSplitter%2C%0A%20%20%20%20%20%20%20%20RecursiveCharacterTextSplitter%2C%0A%20%20%20%20%20%20%20%20child_vector_store%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%206.2%20%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E4%BD%9C%E6%88%90%E5%87%A6%E7%90%86%E3%81%AE%E6%9C%AC%E4%BD%93%0A%0A%20%20%20%20%60index_documents%60%20%E3%81%AF%206.3%E3%80%9C6.7%20%E3%81%AE%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%82%92%E9%A0%86%E3%81%AB%E4%BD%BF%E3%81%84%E3%80%81%60markdown_docs%2F%60%20%E3%81%AE%20Markdown%20%E3%82%92%0A%20%20%20%20%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%EF%BC%882%2C000%E3%80%9C4%2C000%20%E6%96%87%E5%AD%97%EF%BC%89%E3%81%B8%E6%95%B4%E5%BD%A2%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%E3%80%81%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%EF%BC%88500%20%E6%96%87%E5%AD%97%E3%83%BB%E9%87%8D%E3%81%AA%E3%82%8A%20100%20%E6%96%87%E5%AD%97%EF%BC%89%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AF%20Qdrant%20%E3%81%B8%E7%99%BB%E9%8C%B2%E3%81%97%E3%80%81%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AF%20%60parent_store%2F%60%20%E3%81%AB%20JSON%20%E3%81%A8%E3%81%97%E3%81%A6%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%60parent_id%60%20%E3%81%AF%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%81%B8%E5%BC%95%E3%81%8D%E7%B6%99%E3%81%8C%E3%82%8C%E3%80%817%20%E7%AB%A0%E3%81%AE%202%20%E6%AE%B5%E9%9A%8E%E6%A4%9C%E7%B4%A2%E3%81%A7%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E5%BC%95%E3%81%8F%E3%82%AD%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%82%B5%E3%82%A4%E3%82%BA%E8%A8%AD%E5%AE%9A%E3%81%AE%E5%A6%A5%E5%BD%93%E6%80%A7%E3%82%82%E6%A4%9C%E8%A8%BC%E3%81%97%E3%80%81%E6%9D%A1%E4%BB%B6%E3%82%92%E6%BA%80%E3%81%9F%E3%81%95%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E4%BE%8B%E5%A4%96%E3%82%92%E9%80%81%E5%87%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_(%0A%20%20%20%20MARKDOWN_DIR%2C%0A%20%20%20%20MarkdownHeaderTextSplitter%2C%0A%20%20%20%20PARENT_STORE_PATH%2C%0A%20%20%20%20Path%2C%0A%20%20%20%20RecursiveCharacterTextSplitter%2C%0A%20%20%20%20child_vector_store%2C%0A%20%20%20%20glob%2C%0A%20%20%20%20json%2C%0A%20%20%20%20os%2C%0A%20%20%20%20split_large_parents%2C%0A%20%20%20%20workspace_dirs%2C%0A)%3A%0A%20%20%20%20%23%20workspace_dirs%20%E3%82%92%E5%8F%82%E7%85%A7%E3%81%97%E3%81%A6%E3%80%81%E4%BD%9C%E6%A5%AD%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E4%BD%9C%E6%88%90%E3%81%8C%E5%85%88%E3%81%AB%E5%AE%8C%E4%BA%86%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E4%BF%9D%E8%A8%BC%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20assert%20workspace_dirs%0A%0A%20%20%20%20def%20index_documents()%3A%0A%20%20%20%20%20%20%20%20headers_to_split_on%20%3D%20%5B(%22%23%22%2C%20%22H1%22)%2C%20(%22%23%23%22%2C%20%22H2%22)%2C%20(%22%23%23%23%22%2C%20%22H3%22)%5D%0A%20%20%20%20%20%20%20%20parent_splitter%20%3D%20MarkdownHeaderTextSplitter(%0A%20%20%20%20%20%20%20%20%20%20%20%20headers_to_split_on%3Dheaders_to_split_on%2C%20strip_headers%3DFalse%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20child_chunk_size%20%3D%20500%0A%20%20%20%20%20%20%20%20child_chunk_overlap%20%3D%20100%0A%20%20%20%20%20%20%20%20min_parent_size%20%3D%202000%0A%20%20%20%20%20%20%20%20max_parent_size%20%3D%204000%0A%20%20%20%20%20%20%20%20if%20min_parent_size%20%3C%3D%200%20or%20max_parent_size%20%3C%20min_parent_size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AF%E6%AD%A3%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81min_parent_size%20%3C%3D%20max_parent_size%20%E3%81%A7%E3%81%82%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20if%20not%200%20%3C%3D%20child_chunk_overlap%20%3C%20child_chunk_size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22child_chunk_overlap%20%E3%81%AF%20child_chunk_size%20%E3%82%88%E3%82%8A%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20child_splitter%20%3D%20RecursiveCharacterTextSplitter(%0A%20%20%20%20%20%20%20%20%20%20%20%20chunk_size%3Dchild_chunk_size%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20chunk_overlap%3Dchild_chunk_overlap%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20all_parent_pairs%2C%20all_child_chunks%20%3D%20%5B%5D%2C%20%5B%5D%0A%20%20%20%20%20%20%20%20md_files%20%3D%20sorted(glob.glob(os.path.join(MARKDOWN_DIR%2C%20%22*.md%22)))%0A%0A%20%20%20%20%20%20%20%20if%20not%20md_files%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9A%A0%EF%B8%8F%20%20%7BMARKDOWN_DIR%7D%2F%20%E3%81%AB%20.md%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%0A%20%20%20%20%20%20%20%20for%20doc_path_str%20in%20md_files%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20doc_path%20%3D%20Path(doc_path_str)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%F0%9F%93%84%20%E5%87%A6%E7%90%86%E4%B8%AD%3A%20%7Bdoc_path.name%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20open(doc_path%2C%20%22r%22%2C%20encoding%3D%22utf-8%22)%20as%20f%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20md_text%20%3D%20f.read()%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9D%8C%20%7Bdoc_path.name%7D%20%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%82%A8%E3%83%A9%E3%83%BC%3A%20%7Be%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20parent_chunks%20%3D%20parent_splitter.split_text(md_text)%0A%20%20%20%20%20%20%20%20%20%20%20%20merged_parents%20%3D%20merge_small_parents(parent_chunks%2C%20min_parent_size)%0A%20%20%20%20%20%20%20%20%20%20%20%20split_parents%20%3D%20split_large_parents(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20merged_parents%2C%20max_parent_size%2C%20child_chunk_overlap%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20cleaned_parents%20%3D%20clean_small_chunks(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20split_parents%2C%20min_parent_size%2C%20max_parent_size%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20any(len(chunk.page_content)%20%3E%20max_parent_size%20for%20chunk%20in%20cleaned_parents)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError(%22%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E5%8C%96%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E4%B8%8A%E9%99%90%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%8C%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20i%2C%20p_chunk%20in%20enumerate(cleaned_parents)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20parent_id%20%3D%20f%22%7Bdoc_path.stem%7D_p%7Bi%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20p_chunk.metadata.update(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%22source%22%3A%20doc_path.stem%20%2B%20%22.pdf%22%2C%20%22parent_id%22%3A%20parent_id%7D%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%20all_parent_pairs.append((parent_id%2C%20p_chunk))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20children%20%3D%20child_splitter.split_documents(%5Bp_chunk%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_child_chunks.extend(children)%0A%0A%20%20%20%20%20%20%20%20if%20not%20all_child_chunks%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%E2%9A%A0%EF%B8%8F%20%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%99%E3%82%8B%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%0A%20%20%20%20%20%20%20%20print(f%22%5Cn%F0%9F%94%8D%20%7Blen(all_child_chunks)%7D%20%E5%80%8B%E3%81%AE%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%20Qdrant%20%E3%81%AB%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99...%22)%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20child_vector_store.add_documents(all_child_chunks)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%E2%9C%93%20%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%22)%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9D%8C%20%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E4%BD%9C%E6%88%90%E3%82%A8%E3%83%A9%E3%83%BC%3A%20%7Be%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%0A%20%20%20%20%20%20%20%20print(f%22%F0%9F%92%BE%20%7Blen(all_parent_pairs)%7D%20%E5%80%8B%E3%81%AE%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%20JSON%20%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99...%22)%0A%20%20%20%20%20%20%20%20for%20item%20in%20os.listdir(PARENT_STORE_PATH)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20os.remove(os.path.join(PARENT_STORE_PATH%2C%20item))%0A%0A%20%20%20%20%20%20%20%20for%20parent_id%2C%20doc%20in%20all_parent_pairs%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20doc_dict%20%3D%20%7B%22page_content%22%3A%20doc.page_content%2C%20%22metadata%22%3A%20doc.metadata%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20filepath%20%3D%20os.path.join(PARENT_STORE_PATH%2C%20f%22%7Bparent_id%7D.json%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20with%20open(filepath%2C%20%22w%22%2C%20encoding%3D%22utf-8%22)%20as%20f%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20json.dump(doc_dict%2C%20f%2C%20ensure_ascii%3DFalse%2C%20indent%3D2)%0A%0A%20%20%20%20return%20(index_documents%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%206.3%20%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E7%B5%B1%E5%90%88%0A%0A%20%20%20%20%60merge_metadata%60%20%E3%81%AF%E3%80%81%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB%E8%A6%8B%E5%87%BA%E3%81%97%E9%9A%8E%E5%B1%A4%E3%81%AA%E3%81%A9%E3%81%AE%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%A4%B1%E3%82%8F%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%80%81%0A%20%20%20%20%E5%90%8C%E3%81%98%E3%82%AD%E3%83%BC%E3%81%AE%E5%80%A4%E3%82%92%20%60-%3E%60%20%E5%8C%BA%E5%88%87%E3%82%8A%E3%81%A7%E9%80%A3%E7%B5%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60dict.fromkeys%60%20%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E9%87%8D%E8%A4%87%E3%81%97%E3%81%9F%E5%80%A4%E3%81%AF%E5%8F%96%E3%82%8A%E9%99%A4%E3%81%8B%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%60prepend%3DTrue%60%20%E3%81%AF%E3%80%81%E5%89%8D%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E5%BE%8C%E3%82%8D%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%B8%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E5%85%83%E3%81%AE%E9%A0%86%E5%BA%8F%E3%82%92%E4%BF%9D%E3%81%A4%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%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20merge_metadata(target%2C%20source%2C%20prepend%3DFalse)%3A%0A%20%20%20%20for%20key%2C%20value%20in%20source.items()%3A%0A%20%20%20%20%20%20%20%20if%20key%20not%20in%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20target%5Bkey%5D%20%3D%20value%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20first%2C%20second%20%3D%20(value%2C%20target%5Bkey%5D)%20if%20prepend%20else%20(target%5Bkey%5D%2C%20value)%0A%20%20%20%20%20%20%20%20%20%20%20%20values%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20item.strip()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20raw%20in%20(first%2C%20second)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20item%20in%20str(raw).split(%22%20-%3E%20%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20item.strip()%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20target%5Bkey%5D%20%3D%20%22%20-%3E%20%22.join(dict.fromkeys(values))%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%206.4%20%E5%B0%8F%E3%81%95%E3%81%99%E3%81%8E%E3%82%8B%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E7%B5%B1%E5%90%88%0A%0A%20%20%20%20%E8%A6%8B%E5%87%BA%E3%81%97%E3%81%A7%E5%88%86%E5%89%B2%E3%81%97%E3%81%9F%E7%9B%B4%E5%BE%8C%E3%81%AF%E7%9F%AD%E3%81%84%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%8C%E5%A4%9A%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%60min_size%60%20%E3%81%AB%E9%81%94%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E9%9A%A3%E6%8E%A5%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E9%80%A3%E7%B5%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E6%9C%80%E5%BE%8C%E3%81%AB%E4%BD%99%E3%81%A3%E3%81%9F%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AF%E7%9B%B4%E5%89%8D%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%B8%E7%B5%90%E5%90%88%E3%81%97%EF%BC%88%E7%B5%90%E6%9E%9C%E3%81%8C%E7%A9%BA%E3%81%AA%E3%82%89%E5%8D%98%E7%8B%AC%E3%81%A7%E6%8E%A1%E7%94%A8%EF%BC%89%E3%80%81%E6%A5%B5%E7%AB%AF%E3%81%AB%E7%9F%AD%E3%81%84%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E7%84%A1%E3%81%8F%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.function%0Adef%20merge_small_parents(chunks%2C%20min_size)%3A%0A%20%20%20%20if%20not%20chunks%3A%0A%20%20%20%20%20%20%20%20return%20%5B%5D%0A%0A%20%20%20%20merged%2C%20current%20%3D%20%5B%5D%2C%20None%0A%0A%20%20%20%20for%20chunk%20in%20chunks%3A%0A%20%20%20%20%20%20%20%20if%20current%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20current%20%3D%20chunk%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20current.page_content%20%2B%3D%20%22%5Cn%5Cn%22%20%2B%20chunk.page_content%0A%20%20%20%20%20%20%20%20%20%20%20%20merge_metadata(current.metadata%2C%20chunk.metadata)%0A%0A%20%20%20%20%20%20%20%20if%20len(current.page_content)%20%3E%3D%20min_size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20merged.append(current)%0A%20%20%20%20%20%20%20%20%20%20%20%20current%20%3D%20None%0A%0A%20%20%20%20if%20current%3A%0A%20%20%20%20%20%20%20%20if%20merged%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20merged%5B-1%5D.page_content%20%2B%3D%20%22%5Cn%5Cn%22%20%2B%20current.page_content%0A%20%20%20%20%20%20%20%20%20%20%20%20merge_metadata(merged%5B-1%5D.metadata%2C%20current.metadata)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20merged.append(current)%0A%0A%20%20%20%20return%20merged%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%206.5%20%E5%A4%A7%E3%81%8D%E3%81%99%E3%81%8E%E3%82%8B%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E5%88%86%E5%89%B2%0A%0A%20%20%20%20%60max_size%60%20%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%A0%E3%81%91%E3%82%92%20%60RecursiveCharacterTextSplitter%60%20%E3%81%A7%E5%86%8D%E5%88%86%E5%89%B2%E3%81%97%E3%80%81%0A%20%20%20%20%E4%B8%8A%E9%99%90%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AF%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E9%80%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E4%B8%8D%E8%A6%81%E3%81%AA%E5%88%86%E5%89%B2%E3%82%92%E9%81%BF%E3%81%91%E3%81%A4%E3%81%A4%E3%80%81%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E4%B8%8A%E9%99%90%E3%82%92%E5%AE%88%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_(RecursiveCharacterTextSplitter)%3A%0A%20%20%20%20def%20split_large_parents(chunks%2C%20max_size%2C%20overlap)%3A%0A%20%20%20%20%20%20%20%20split_chunks%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20for%20chunk%20in%20chunks%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20len(chunk.page_content)%20%3C%3D%20max_size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20split_chunks.append(chunk)%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20large_splitter%20%3D%20RecursiveCharacterTextSplitter(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chunk_size%3Dmax_size%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chunk_overlap%3Doverlap%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%20%20%20%20sub_chunks%20%3D%20large_splitter.split_documents(%5Bchunk%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20split_chunks.extend(sub_chunks)%0A%0A%20%20%20%20%20%20%20%20return%20split_chunks%0A%0A%20%20%20%20return%20(split_large_parents%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%206.6%20%E9%9A%A3%E6%8E%A5%E3%83%9A%E3%82%A2%E3%81%AE%E5%86%8D%E9%85%8D%E5%88%86%0A%0A%20%20%20%20%E7%B5%B1%E5%90%88%E3%82%82%E5%88%86%E5%89%B2%E3%82%82%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%B0%8F%E3%81%95%E3%81%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%8C%E6%AE%8B%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AB%E4%BD%BF%E3%81%86%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%E9%9A%A3%E6%8E%A5%E3%81%99%E3%82%8B%202%20%E3%81%A4%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E4%B8%80%E5%BA%A6%E9%80%A3%E7%B5%90%E3%81%97%E3%80%81%E6%AE%B5%E8%90%BD%E3%83%BB%E6%94%B9%E8%A1%8C%E3%83%BB%E7%A9%BA%E7%99%BD%E3%81%AE%E9%A0%86%E3%81%AB%E5%A2%83%E7%95%8C%E3%82%92%E6%8E%A2%E3%81%97%E3%81%A6%E5%88%86%E3%81%91%E7%9B%B4%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E4%B8%A1%E6%96%B9%E3%81%8C%20%60min_size%60%20%E3%82%92%E6%BA%80%E3%81%9F%E3%81%9B%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D%E3%81%AF%E4%B8%AD%E5%A4%AE%E3%81%A7%E5%88%86%E5%89%B2%E3%81%97%E3%80%81%E3%81%A9%E3%81%A1%E3%82%89%E3%81%8B%E3%81%8C%E7%A9%BA%E3%81%AB%E3%81%AA%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E5%85%83%E3%81%AE%E3%83%9A%E3%82%A2%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%BF%94%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.function%0Adef%20rebalance_pair(first%2C%20second%2C%20min_size%2C%20max_size)%3A%0A%20%20%20%20combined%20%3D%20first.page_content.rstrip()%20%2B%20%22%5Cn%5Cn%22%20%2B%20second.page_content.lstrip()%0A%20%20%20%20lower%20%3D%20max(1%2C%20len(combined)%20-%20max_size)%0A%20%20%20%20upper%20%3D%20min(max_size%2C%20len(combined)%20-%201)%0A%20%20%20%20if%20len(combined)%20%3E%3D%202%20*%20min_size%3A%0A%20%20%20%20%20%20%20%20lower%20%3D%20max(lower%2C%20min_size)%0A%20%20%20%20%20%20%20%20upper%20%3D%20min(upper%2C%20len(combined)%20-%20min_size)%0A%20%20%20%20preferred%20%3D%20min(max(len(combined)%20%2F%2F%202%2C%20lower)%2C%20upper)%0A%0A%20%20%20%20split_at%20%3D%20preferred%0A%20%20%20%20for%20separator%20in%20(%22%5Cn%5Cn%22%2C%20%22%5Cn%22%2C%20%22%20%22)%3A%0A%20%20%20%20%20%20%20%20before%20%3D%20combined.rfind(separator%2C%20lower%2C%20preferred%20%2B%201)%0A%20%20%20%20%20%20%20%20after%20%3D%20combined.find(separator%2C%20preferred%2C%20upper%20%2B%201)%0A%20%20%20%20%20%20%20%20if%20before%20%3E%3D%20lower%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20split_at%20%3D%20before%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20if%20after%20!%3D%20-1%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20split_at%20%3D%20after%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20left_text%20%3D%20combined%5B%3Asplit_at%5D.rstrip()%0A%20%20%20%20right_text%20%3D%20combined%5Bsplit_at%3A%5D.lstrip()%0A%20%20%20%20if%20len(combined)%20%3E%3D%202%20*%20min_size%20and%20(%0A%20%20%20%20%20%20%20%20len(left_text)%20%3C%20min_size%20or%20len(right_text)%20%3C%20min_size%0A%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20split_at%20%3D%20preferred%0A%20%20%20%20%20%20%20%20left_text%2C%20right_text%20%3D%20combined%5B%3Asplit_at%5D%2C%20combined%5Bsplit_at%3A%5D%0A%20%20%20%20if%20not%20left_text%20or%20not%20right_text%3A%0A%20%20%20%20%20%20%20%20return%20first%2C%20second%0A%0A%20%20%20%20metadata%20%3D%20dict(first.metadata)%0A%20%20%20%20merge_metadata(metadata%2C%20second.metadata)%0A%20%20%20%20first.page_content%2C%20first.metadata%20%3D%20left_text%2C%20dict(metadata)%0A%20%20%20%20second.page_content%2C%20second.metadata%20%3D%20right_text%2C%20dict(metadata)%0A%20%20%20%20return%20first%2C%20second%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%206.7%20%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E4%BB%95%E4%B8%8A%E3%81%92%0A%0A%20%20%20%20%60min_size%60%20%E6%9C%AA%E6%BA%80%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E3%80%81%60max_size%60%20%E3%81%AB%E5%8F%8E%E3%81%BE%E3%82%8B%E5%81%B4%EF%BC%88%E5%89%8D%E6%96%B9%E3%82%92%E5%84%AA%E5%85%88%E3%81%97%E3%80%81%E6%AC%A1%E3%81%AB%E5%BE%8C%E6%96%B9%EF%BC%89%E3%81%B8%E7%B5%90%E5%90%88%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%9D%E3%82%8C%E3%81%A7%E3%82%82%E5%B0%8F%E3%81%95%E3%81%84%E3%81%BE%E3%81%BE%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%8C%E6%AE%8B%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%816.6%20%E3%81%AE%20%60rebalance_pair%60%20%E3%81%A7%E9%9A%A3%E6%8E%A5%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%A8%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E5%9D%87%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.function%0Adef%20clean_small_chunks(chunks%2C%20min_size%2C%20max_size)%3A%0A%20%20%20%20cleaned%20%3D%20%5B%5D%0A%0A%20%20%20%20for%20i%2C%20chunk%20in%20enumerate(chunks)%3A%0A%20%20%20%20%20%20%20%20if%20len(chunk.page_content)%20%3C%20min_size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cleaned%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20and%20len(cleaned%5B-1%5D.page_content)%20%2B%202%20%2B%20len(chunk.page_content)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%3D%20max_size%0A%20%20%20%20%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cleaned%5B-1%5D.page_content%20%2B%3D%20%22%5Cn%5Cn%22%20%2B%20chunk.page_content%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20merge_metadata(cleaned%5B-1%5D.metadata%2C%20chunk.metadata)%0A%20%20%20%20%20%20%20%20%20%20%20%20elif%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20i%20%3C%20len(chunks)%20-%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20and%20len(chunk.page_content)%20%2B%202%20%2B%20len(chunks%5Bi%20%2B%201%5D.page_content)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%3D%20max_size%0A%20%20%20%20%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chunks%5Bi%20%2B%201%5D.page_content%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chunk.page_content%20%2B%20%22%5Cn%5Cn%22%20%2B%20chunks%5Bi%20%2B%201%5D.page_content%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%20merge_metadata(chunks%5Bi%20%2B%201%5D.metadata%2C%20chunk.metadata%2C%20prepend%3DTrue)%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cleaned.append(chunk)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20cleaned.append(chunk)%0A%0A%20%20%20%20for%20i%2C%20chunk%20in%20enumerate(cleaned)%3A%0A%20%20%20%20%20%20%20%20if%20len(chunk.page_content)%20%3E%3D%20min_size%20or%20len(cleaned)%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20if%20i%20%3C%20len(cleaned)%20-%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20cleaned%5Bi%5D%2C%20cleaned%5Bi%20%2B%201%5D%20%3D%20rebalance_pair(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chunk%2C%20cleaned%5Bi%20%2B%201%5D%2C%20min_size%2C%20max_size%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20cleaned%5Bi%20-%201%5D%2C%20cleaned%5Bi%5D%20%3D%20rebalance_pair(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cleaned%5Bi%20-%201%5D%2C%20chunk%2C%20min_size%2C%20max_size%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20return%20cleaned%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%206.8%20%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E4%BD%9C%E6%88%90%E3%81%AE%E5%AE%9F%E8%A1%8C%0A%0A%20%20%20%206.2%20%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9F%E5%87%A6%E7%90%86%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60parent_store%2F%60%20%E3%81%AE%E6%97%A2%E5%AD%98%20JSON%20%E3%81%AF%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%81%A6%E3%81%8B%E3%82%89%E5%86%8D%E7%94%9F%E6%88%90%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_(index_documents%2C%20mo)%3A%0A%20%20%20%20index_documents()%0A%20%20%20%20mo.md(%22%E2%9C%93%20%E6%96%87%E6%9B%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E4%BD%9C%E6%88%90%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%207.%20%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E5%AE%9A%E7%BE%A9%0A%0A%20%20%20%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E6%96%87%E6%9B%B8%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%81%A8%E5%8F%96%E5%BE%97%E3%81%AB%E4%BD%BF%E3%81%86%E6%A4%9C%E7%B4%A2%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E5%86%85%E5%AE%B9%3A**%0A%20%20%20%20-%20**search_child_chunks**%3A%20%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%E5%B0%8F%E3%81%95%E3%81%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**retrieve_parent_chunks**%3A%20%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%20JSON%20%E3%81%8B%E3%82%89%E5%AE%8C%E5%85%A8%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AB%E3%82%88%E3%82%8B%E9%96%A2%E6%95%B0%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%20LLM%20%E3%81%AB%E3%83%90%E3%82%A4%E3%83%B3%E3%83%89%E3%81%99%E3%82%8B%0A%0A%20%20%20%20**2%20%E6%AE%B5%E9%9A%8E%E6%A4%9C%E7%B4%A2%3A**%0A%20%20%20%201.%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%EF%BC%88%E9%AB%98%E9%80%9F%E3%81%AA%E6%84%8F%E5%91%B3%E6%A4%9C%E7%B4%A2%EF%BC%89%0A%20%20%20%202.%20%E5%BF%85%E8%A6%81%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E3%80%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E5%AE%8C%E5%85%A8%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E8%AA%AD%E3%82%80%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AF%201%20%E6%AE%B5%E9%9A%8E%E7%9B%AE%E3%81%AE%20%60search_child_chunks%60%20%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E6%A4%9C%E7%B4%A2%E3%81%A7%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%8C%0A%20%20%20%20%60RETRIEVAL_SCORE_THRESHOLD%60%20%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%A0%E3%81%91%E3%82%92%E8%BF%94%E3%81%97%E3%80%81%E5%90%84%E7%B5%90%E6%9E%9C%E3%81%AB%E8%A6%AA%20ID%20%E3%81%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%E6%B7%BB%E3%81%88%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E8%A9%B2%E5%BD%93%E3%81%8C%E7%84%A1%E3%81%91%E3%82%8C%E3%81%B0%20%60NO_RELEVANT_CHUNKS%60%E3%80%81%E4%BE%8B%E5%A4%96%E6%99%82%E3%81%AF%20%60RETRIEVAL_ERROR%3A%60%20%E3%82%92%E8%BF%94%E3%81%99%E7%B4%84%E6%9D%9F%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%8A%E3%82%8A%E3%80%81%0A%20%20%20%2011.4%20%E3%81%AE%20%60_retrieval_contexts%60%20%E3%81%AF%E3%81%93%E3%81%AE%E7%9B%AE%E5%8D%B0%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%A4%B1%E6%95%97%E7%B5%90%E6%9E%9C%E3%82%92%E9%99%A4%E5%A4%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20docstring%20%E3%81%AF%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E3%83%84%E3%83%BC%E3%83%AB%E8%AA%AC%E6%98%8E%E3%81%A8%E3%81%97%E3%81%A6%20LLM%20%E3%81%AB%E6%B8%A1%E3%81%95%E3%82%8C%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%86%85%E5%AE%B9%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%AA%E3%81%84%E3%81%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%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%3A**%0A%20%20%20%20-%20%5BLangChain%20Tools%5D(https%3A%2F%2Fdocs.langchain.com%2Foss%2Fpython%2Flangchain%2Ftools)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20CHILD_CHUNK_SEPARATOR%2C%0A%20%20%20%20DEFAULT_RETRIEVAL_K%2C%0A%20%20%20%20RETRIEVAL_SCORE_THRESHOLD%2C%0A%20%20%20%20child_vector_store%2C%0A)%3A%0A%20%20%20%20from%20langchain_core.tools%20import%20tool%0A%0A%20%20%20%20%40tool%0A%20%20%20%20def%20search_child_chunks(query%3A%20str%2C%20limit%3A%20int%20%3D%20DEFAULT_RETRIEVAL_K)%20-%3E%20str%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E8%B3%AA%E5%95%8F%E3%81%AB%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%E6%A0%B9%E6%8B%A0%E3%82%92%E3%80%81%E6%96%87%E6%9B%B8%E3%81%AE%E6%8A%9C%E7%B2%8B%E3%81%8B%E3%82%89%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%20%20%20%20%E6%9C%80%E5%88%9D%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%80%82%E7%B5%90%E6%9E%9C%E3%81%AB%E3%81%AF%E8%A6%AA%20ID%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%80%81%E3%81%8A%E3%82%88%E3%81%B3%E7%9F%AD%E3%81%84%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%0A%20%20%20%20%20%20%20%20%E6%8A%9C%E7%B2%8B%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E3%80%82%E6%8A%9C%E7%B2%8B%E3%81%8C%E9%96%A2%E9%80%A3%E3%81%97%E3%81%A6%E3%81%84%E3%81%A6%E3%82%82%E8%87%AA%E4%BF%A1%E3%82%92%E6%8C%81%E3%81%A3%E3%81%A6%E5%9B%9E%E7%AD%94%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E6%96%AD%E7%89%87%E7%9A%84%E3%81%99%E3%81%8E%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%0A%20%20%20%20%20%20%20%20%E8%BF%94%E3%81%95%E3%82%8C%E3%81%9F%20parent_id%20%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%20retrieve_parent_chunks%20%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E3%80%82%0A%0A%20%20%20%20%20%20%20%20Args%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20query%3A%20%E8%B3%AA%E5%95%8F%E5%86%85%E3%81%AE%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AA%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E5%90%AB%E3%82%80%E3%80%81%E7%84%A6%E7%82%B9%E3%82%92%E7%B5%9E%E3%81%A3%E3%81%9F%E6%A4%9C%E7%B4%A2%E3%82%AF%E3%82%A8%E3%83%AA%E3%80%82%0A%20%20%20%20%20%20%20%20%20%20%20%20limit%3A%20%E8%BF%94%E3%81%99%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E6%9C%80%E5%A4%A7%E6%95%B0%E3%80%82%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20results%20%3D%20child_vector_store.similarity_search(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20query%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20k%3Dlimit%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20score_threshold%3DRETRIEVAL_SCORE_THRESHOLD%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20results%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%22NO_RELEVANT_CHUNKS%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20CHILD_CHUNK_SEPARATOR.join(%0A%20%20%20%20%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%20%20%20%20f%22Parent%20ID%3A%20%7Bdoc.metadata.get('parent_id'%2C%20'')%7D%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22File%20Name%3A%20%7Bdoc.metadata.get('source'%2C%20'')%7D%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Content%3A%20%7Bdoc.page_content.strip()%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20doc%20in%20results%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20f%22RETRIEVAL_ERROR%3A%20%7Bstr(e)%7D%22%0A%0A%20%20%20%20return%20search_child_chunks%2C%20tool%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%207.1%20%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E5%8F%96%E5%BE%97%E3%83%84%E3%83%BC%E3%83%AB%0A%0A%20%20%20%20%60retrieve_parent_chunks%60%20%E3%81%AF%202%20%E6%AE%B5%E9%9A%8E%E7%9B%AE%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%81%A7%E3%80%81%60search_child_chunks%60%20%E3%81%8C%E8%BF%94%E3%81%97%E3%81%9F%20%60parent_id%60%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%0A%20%20%20%20%60parent_store%2F%60%20%E3%81%AE%20JSON%20%E3%81%8B%E3%82%89%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E5%85%A8%E4%BD%93%E3%82%92%E8%AA%AD%E3%81%BF%E5%87%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E7%84%A1%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%20%60NO_PARENT_DOCUMENT%60%20%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E6%8A%9C%E7%B2%8B%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AF%E6%96%AD%E7%89%87%E7%9A%84%E3%81%99%E3%81%8E%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E3%81%AE%E3%81%BF%E4%BD%BF%E3%81%86%E3%82%88%E3%81%86%E3%80%81docstring%20%E3%81%A7%20LLM%20%E3%81%AB%E6%8C%87%E7%A4%BA%E3%81%97%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_(PARENT_STORE_PATH%2C%20json%2C%20os%2C%20tool)%3A%0A%20%20%20%20%40tool%0A%20%20%20%20def%20retrieve_parent_chunks(parent_id%3A%20str)%20-%3E%20str%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%E5%AD%90%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E5%85%A8%E4%BD%93%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%20%20%20%20search_child_chunks%20%E3%81%8C%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%20parent_id%20%E3%82%92%E8%BF%94%E3%81%97%E3%80%81%E5%AD%90%E3%81%AE%E6%8A%9C%E7%B2%8B%E3%81%AB%E5%91%A8%E8%BE%BA%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%0A%20%20%20%20%20%20%20%20%E5%A0%B4%E5%90%88%E3%81%AB%E3%81%AE%E3%81%BF%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%80%82%E5%9C%A7%E7%B8%AE%E6%B8%88%E3%81%BF%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AB%E3%81%99%E3%81%A7%E3%81%AB%E3%81%82%E3%82%8B%20parent%20ID%20%E3%81%AB%E3%81%AF%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%AA%E3%81%84%E3%80%82%0A%0A%20%20%20%20%20%20%20%20Args%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20parent_id%3A%20search_child_chunks%20%E3%81%8C%E8%BF%94%E3%81%97%E3%81%9F%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%20ID%E3%80%82%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20file_name%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20parent_id%20if%20parent_id.lower().endswith(%22.json%22)%20else%20f%22%7Bparent_id%7D.json%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20path%20%3D%20os.path.join(PARENT_STORE_PATH%2C%20file_name)%0A%0A%20%20%20%20%20%20%20%20if%20not%20os.path.exists(path)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22NO_PARENT_DOCUMENT%22%0A%0A%20%20%20%20%20%20%20%20with%20open(path%2C%20%22r%22%2C%20encoding%3D%22utf-8%22)%20as%20f%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20data%20%3D%20json.load(f)%0A%0A%20%20%20%20%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22Parent%20ID%3A%20%7Bparent_id%7D%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22File%20Name%3A%20%7Bdata.get('metadata'%2C%20%7B%7D).get('source'%2C%20'unknown')%7D%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22Content%3A%20%7Bdata.get('page_content'%2C%20'').strip()%7D%22%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20return%20(retrieve_parent_chunks%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%207.2%20%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%20LLM%20%E3%81%B8%E3%81%AE%E3%83%90%E3%82%A4%E3%83%B3%E3%83%89%0A%0A%20%20%20%202%20%E3%81%A4%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%20LLM%20%E3%81%AB%E3%83%90%E3%82%A4%E3%83%B3%E3%83%89%E3%81%97%E3%80%81%E9%96%A2%E6%95%B0%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%20%60llm_with_tools%60%20%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%2011.1%20%E3%81%AE%20%60orchestrator%60%20%E3%81%A0%E3%81%91%E3%81%8C%E4%BD%BF%E3%81%84%E3%80%81%E8%A6%81%E7%B4%84%E3%82%84%E9%9B%86%E7%B4%84%E3%81%AB%E3%81%AF%E7%B4%A0%E3%81%AE%20%60llm%60%20%E3%82%92%E4%BD%BF%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_(llm%2C%20retrieve_parent_chunks%2C%20search_child_chunks)%3A%0A%20%20%20%20%23%20%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%20LLM%20%E3%81%AB%E3%83%90%E3%82%A4%E3%83%B3%E3%83%89%0A%20%20%20%20llm_with_tools%20%3D%20llm.bind_tools(%5Bsearch_child_chunks%2C%20retrieve_parent_chunks%5D)%0A%20%20%20%20return%20(llm_with_tools%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%208.%20%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%0A%0A%20%20%20%20RAG%20%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E5%85%A8%E4%BD%93%E3%81%A7%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E5%B0%8E%E3%81%8F%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%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E6%9C%AC%E6%96%87%E3%81%AF%20LLM%20%E3%81%8C%E8%AA%AD%E3%82%80%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AA%E3%81%AE%E3%81%A7%E8%8B%B1%E8%AA%9E%E3%81%AE%E3%81%BE%E3%81%BE%E4%BF%9D%E3%81%A1%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E5%86%85%E5%AE%B9%3A**%0A%20%20%20%20-%20**%E4%BC%9A%E8%A9%B1%E8%A6%81%E7%B4%84**%EF%BC%888.1%EF%BC%89%3A%20%E6%9C%80%E5%BE%8C%E3%81%AE%202%20%E5%BE%80%E5%BE%A9%E3%81%A0%E3%81%91%E3%82%92%E7%94%9F%E3%81%AE%E4%BC%9A%E8%A9%B1%E5%B1%A5%E6%AD%B4%E3%81%A8%E3%81%97%E3%81%A6%E6%AE%8B%E3%81%97%E3%80%81%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E8%A6%81%E7%B4%84%E3%82%92%E7%B6%AD%E6%8C%81%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**%E3%82%AF%E3%82%A8%E3%83%AA%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88**%EF%BC%888.2%EF%BC%89%3A%20%E4%B8%8D%E6%98%8E%E7%9E%AD%E3%81%AA%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%80%81%E8%A4%87%E6%95%B0%E3%81%AE%E8%B3%AA%E5%95%8F%E3%81%AB%E5%88%86%E5%89%B2%E3%81%97%E3%80%81%E5%BF%85%E8%A6%81%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AE%E3%81%BF%E5%BE%8C%E7%B6%9A%E6%96%87%E8%84%88%E3%82%92%E5%8F%96%E3%82%8A%E8%BE%BC%E3%82%80%0A%20%20%20%20-%20**%E3%82%AA%E3%83%BC%E3%82%B1%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC**%EF%BC%888.3%EF%BC%89%3A%20%E5%9B%9E%E7%AD%94%E5%89%8D%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%82%92%E5%BC%B7%E5%88%B6%E3%81%97%E3%80%81%E5%9C%A7%E7%B8%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%A7%E9%87%8D%E8%A4%87%E6%A4%9C%E7%B4%A2%E3%82%84%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%81%AE%E5%86%8D%E5%8F%96%E5%BE%97%E3%82%92%E9%81%BF%E3%81%91%E3%82%8B%0A%20%20%20%20-%20**%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E5%BF%9C%E7%AD%94**%EF%BC%888.4%EF%BC%89%3A%20%E6%93%8D%E4%BD%9C%E4%B8%8A%E9%99%90%E3%81%AB%E9%81%94%E3%81%97%E3%81%9F%E9%9A%9B%E3%80%81%E5%8F%96%E5%BE%97%E6%B8%88%E3%81%BF%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%8B%E3%82%89%E6%9C%80%E5%96%84%E3%81%AE%E5%9B%9E%E7%AD%94%E3%82%92%E7%B5%B1%E5%90%88%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%9C%A7%E7%B8%AE**%EF%BC%888.5%EF%BC%89%3A%20%E4%BB%A5%E5%89%8D%E3%81%AE%E8%AA%BF%E6%9F%BB%E7%B5%90%E6%9E%9C%E3%82%92%E3%80%81%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%88%A5%E3%83%BB%E4%B8%8D%E8%B6%B3%E6%83%85%E5%A0%B1%E4%BB%98%E3%81%8D%E3%81%AE%E6%A7%8B%E9%80%A0%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E3%82%AF%E3%82%A8%E3%83%AA%E4%B8%AD%E5%BF%83%E3%81%AE%E8%A6%81%E7%B4%84%E3%81%B8%E5%9C%A7%E7%B8%AE%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**%E9%9B%86%E7%B4%84**%EF%BC%888.6%EF%BC%89%3A%20%E8%A4%87%E6%95%B0%E3%81%AE%E9%83%A8%E5%88%86%E5%9B%9E%E7%AD%94%E3%82%92%E4%B8%80%E8%B2%AB%E3%81%97%E3%81%9F%E6%9C%80%E7%B5%82%E5%9B%9E%E7%AD%94%E3%81%B8%E7%B5%B1%E5%90%88%E3%81%99%E3%82%8B%0A%0A%20%20%20%20**%E4%B8%BB%E3%81%AA%E5%8B%95%E4%BD%9C%3A**%0A%20%20%20%20-%20%E3%82%AF%E3%82%A8%E3%83%AA%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%A7%E3%81%AF%E4%BC%9A%E8%A9%B1%E6%96%87%E8%84%88%E3%82%92%E6%9C%80%E5%B0%8F%E9%99%90%E3%81%AB%E4%BD%BF%E3%81%84%E3%80%81%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%9B%BA%E6%9C%89%E3%81%AE%E7%94%A8%E8%AA%9E%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E4%BF%9D%E3%81%A4%0A%20%20%20%20-%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AF%E5%9C%A7%E7%B8%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%80%81%E5%AF%BE%E8%B1%A1%E6%B8%88%E3%81%BF%E3%81%AE%E5%81%B4%E9%9D%A2%E3%83%BB%E8%A6%AA%20ID%20%E3%82%92%E5%86%8D%E6%A4%9C%E7%B4%A2%EF%BC%8F%E5%86%8D%E5%8F%96%E5%BE%97%E3%81%97%E3%81%AA%E3%81%84%0A%20%20%20%20-%20%E9%96%A2%E9%80%A3%E6%96%87%E6%9B%B8%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E3%82%88%E3%82%8A%E5%BA%83%E3%81%84%EF%BC%8F%E8%A8%80%E3%81%84%E6%8F%9B%E3%81%88%E3%81%9F%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%A7%E5%86%8D%E8%A9%A6%E8%A1%8C%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E5%BF%9C%E7%AD%94%E3%81%AF%E6%93%8D%E4%BD%9C%E4%B8%8A%E9%99%90%E3%81%A7%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E3%81%99%E3%81%A7%E3%81%AB%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E5%86%85%E5%AE%B9%E3%81%A0%E3%81%91%E3%82%92%E4%BD%BF%E3%81%86%0A%20%20%20%20-%20%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E5%9B%9E%E7%AD%94%E3%81%AE%E6%9C%AB%E5%B0%BE%E3%81%AB%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E7%A4%BA%E3%81%99%0A%0A%20%20%20%20%23%23%23%208.1%20%E4%BC%9A%E8%A9%B1%E8%A6%81%E7%B4%84%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%0A%0A%20%20%20%20%60get_conversation_summary_prompt%60%20%E3%81%AF%2011.1%20%E3%81%AE%20%60summarize_history%60%20%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B0%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E6%97%A2%E5%AD%98%E3%81%AE%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E8%A6%81%E7%B4%84%E3%81%A8%E3%80%81%E5%B1%A5%E6%AD%B4%E3%81%8B%E3%82%89%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%82%8B%E5%8F%A4%E3%81%84%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%201%20%E3%81%A4%E3%81%AE%E8%A6%81%E7%B4%84%E3%81%B8%E7%B5%B1%E5%90%88%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8C%E5%BD%B9%E5%89%B2%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E5%87%BA%E5%8A%9B%E5%A5%91%E7%B4%84%3A**%20%E7%B5%B1%E5%90%88%E5%BE%8C%E3%81%AE%E8%A6%81%E7%B4%84%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%A0%E3%81%91%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%60Updated%20summary%3A%60%20%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%83%A9%E3%83%99%E3%83%AB%E3%82%92%E4%BB%98%E3%81%91%E3%81%9A%E3%80%81%0A%20%20%20%20%E6%96%B0%E6%97%A7%202%20%E3%81%A4%E3%81%AE%E8%A6%81%E7%B4%84%E3%82%92%E4%B8%A6%E3%81%B9%E3%81%A6%E8%BF%94%E3%81%97%E3%81%A6%E3%82%82%E3%81%84%E3%81%91%E3%81%AA%E3%81%84%E3%80%82%E6%AE%8B%E3%81%99%E4%BE%A1%E5%80%A4%E3%81%AE%E3%81%82%E3%82%8B%E6%96%87%E8%84%88%E3%81%8C%E7%84%A1%E3%81%91%E3%82%8C%E3%81%B0%E7%A9%BA%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%0A%20%20%20%20%E5%88%86%E9%87%8F%E3%81%AF%2030%E3%80%9C70%20%E8%AA%9E%E7%A8%8B%E5%BA%A6%E3%81%AB%E6%8A%91%E3%81%88%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20get_conversation_summary_prompt()%20-%3E%20str%3A%0A%20%20%20%20return%20%22%22%22%23%23%20Role%0AYou%20are%20a%20compact%20memory%20manager%20for%20a%20retrieval-augmented%20chat%20assistant.%0A%0A%23%23%20Context%0AThe%20input%20contains%20an%20existing%20rolling%20summary%20plus%20older%20user%2Fassistant%20messages%20that%20will%20be%20removed%20from%20raw%20chat%20history.%0A%0A%23%23%20Instructions%0A-%20Merge%20the%20existing%20summary%20with%20the%20new%20older%20messages.%0A-%20Preserve%20context%20needed%20for%20future%20follow-up%20questions%3A%20topics%2C%20user%20preferences%2C%20important%20facts%2C%20unresolved%20questions%2C%20and%20referenced%20source%20file%20names.%0A-%20Discard%20greetings%2C%20tool%20calls%2C%20tool%20outputs%2C%20formatting%20chatter%2C%20duplicate%20details%2C%20and%20resolved%20misunderstandings.%0A-%20Keep%20the%20summary%20compact%3A%2030-70%20words%20unless%20more%20detail%20is%20essential.%0A%0A%23%23%20Output%0AReturn%20exactly%20one%20merged%20summary%20and%20nothing%20else.%0ADo%20not%20include%20labels%20such%20as%20%22Updated%20summary%3A%22%2C%20%22Previous%20summary%3A%22%2C%20or%20%22New%20messages%3A%22.%0ADo%20not%20include%20both%20old%20and%20new%20summaries.%0AIf%20there%20is%20no%20meaningful%20context%2C%20return%20an%20empty%20string.%0A%22%22%22%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%208.2%20%E3%82%AF%E3%82%A8%E3%83%AA%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%0A%0A%20%20%20%20%60get_rewrite_query_prompt%60%20%E3%81%AF%2011.1%20%E3%81%AE%20%60rewrite_query%60%20%E3%81%A7%E3%80%819%20%E7%AB%A0%E3%81%AE%20%60QueryAnalysis%60%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%0A%20%20%20%20%E6%A7%8B%E9%80%A0%E5%8C%96%E5%87%BA%E5%8A%9B%E3%81%A8%E3%82%BB%E3%83%83%E3%83%88%E3%81%A7%E5%91%BC%E3%81%B0%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E6%9B%96%E6%98%A7%E3%81%AA%E8%BF%BD%E5%8A%A0%E8%B3%AA%E5%95%8F%E3%82%92%E8%87%AA%E5%B7%B1%E5%AE%8C%E7%B5%90%E3%81%97%E3%81%9F%E6%A4%9C%E7%B4%A2%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%B8%E7%9B%B4%E3%81%97%E3%80%81%0A%20%20%20%20%E6%9C%AC%E5%BD%93%E3%81%AB%E7%8B%AC%E7%AB%8B%E3%81%97%E3%81%9F%E6%83%85%E5%A0%B1%E8%A6%81%E6%B1%82%E3%81%AE%E3%81%A8%E3%81%8D%E3%81%A0%E3%81%91%E6%9C%80%E5%A4%A7%203%20%E4%BB%B6%E3%81%B8%E5%88%86%E5%89%B2%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E5%87%BA%E5%8A%9B%E5%A5%91%E7%B4%84%3A**%20%60QueryAnalysis%60%20%E3%81%AE%203%20%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%80%81%E3%81%99%E3%81%AA%E3%82%8F%E3%81%A1%20%60is_clear%60%EF%BC%88%E5%9B%9E%E7%AD%94%E5%8F%AF%E8%83%BD%E3%81%8B%EF%BC%89%E3%80%81%0A%20%20%20%20%60questions%60%EF%BC%88%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E5%BE%8C%E3%81%AE%E8%87%AA%E5%B7%B1%E5%AE%8C%E7%B5%90%E3%81%97%E3%81%9F%E8%B3%AA%E5%95%8F%E3%80%81%E6%9C%80%E5%A4%A7%203%20%E4%BB%B6%EF%BC%89%E3%80%81%60clarification_needed%60%EF%BC%88%E4%B8%8D%E6%98%8E%E7%9E%AD%E3%81%AA%E7%90%86%E7%94%B1%EF%BC%89%E3%82%92%E5%9F%8B%E3%82%81%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%80%8C%E3%81%9D%E3%82%8C%E3%80%8D%E3%80%8C%E3%81%9D%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%8D%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E6%9C%AA%E8%A7%A3%E6%B1%BA%E3%81%AE%E6%8C%87%E7%A4%BA%E8%AA%9E%E3%81%AB%E4%BE%9D%E5%AD%98%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%A0%E3%81%91%E4%B8%8D%E6%98%8E%E7%9E%AD%E3%81%A8%E5%88%A4%E5%AE%9A%E3%81%97%E3%80%81%0A%20%20%20%20%E5%88%9D%E5%87%BA%E3%81%AE%E5%9B%BA%E6%9C%89%E5%90%8D%E8%A9%9E%E3%82%84%E7%95%A5%E8%AA%9E%E3%81%AF%E4%B8%8D%E6%98%8E%E7%9E%AD%E6%89%B1%E3%81%84%E3%81%AB%E3%81%9B%E3%81%9A%E3%80%81%E8%A1%A8%E8%A8%98%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E4%BF%9D%E3%81%A3%E3%81%A6%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20get_rewrite_query_prompt()%20-%3E%20str%3A%0A%20%20%20%20return%20%22%22%22%23%23%20Role%0AYou%20are%20a%20query%20rewriting%20specialist%20for%20document%20retrieval%20in%20a%20RAG%20system.%0A%0A%23%23%20Instructions%0A-%20Rewrite%20the%20current%20query%20so%20it%20is%20clear%2C%20self-contained%2C%20and%20useful%20for%20retrieval.%0A-%20Use%20the%20conversation%20summary%20and%20recent%20conversation%20only%20to%20resolve%20vague%20follow-ups%20that%20refer%20to%20prior%20context.%0A-%20When%20an%20unresolved%20query%20and%20one%20or%20more%20user%20clarifications%20are%20provided%2C%20combine%20all%20of%20them%20into%20one%20self-contained%20retrieval%20query.%0A-%20If%20the%20query%20is%20a%20follow-up%2C%20integrate%20only%20the%20minimal%20context%20needed%20to%20make%20it%20self-contained.%0A-%20Preserve%20product%20names%2C%20file%20names%2C%20versions%2C%20acronyms%2C%20numbers%2C%20and%20technical%20terms%20exactly.%0A-%20If%20the%20user%20asks%20about%20a%20named%20topic%2C%20product%2C%20file%2C%20acronym%2C%20term%2C%20or%20concept%2C%20treat%20the%20question%20as%20clear%20even%20if%20it%20is%20new.%0A-%20Standalone%20named%20terms%2C%20acronyms%2C%20or%20concepts%20are%20valid%20retrieval%20queries%3B%20do%20not%20require%20prior%20conversation%20context.%0A-%20Split%20only%20truly%20separate%20information%20needs%2C%20with%20a%20maximum%20of%203%20rewritten%20questions.%0A%0A%23%23%20Clarification%20Boundary%0AMark%20the%20query%20unclear%20only%20when%20it%20depends%20on%20an%20unresolved%20reference%20such%20as%20%22it%22%2C%20%22that%22%2C%20%22this%20file%22%2C%20or%20%22the%20previous%20one%22.%0ADo%20not%20mark%20a%20query%20unclear%20because%20the%20topic%20was%20not%20mentioned%20earlier.%0ADo%20not%20ask%20the%20user%20whether%20a%20new%20acronym%20or%20term%20is%20a%20typo%3B%20preserve%20it%20and%20search%20for%20it.%0A%0A%23%23%20Constraints%0ADo%20not%20add%20facts%2C%20expand%20acronyms%2C%20invent%20context%2C%20or%20broaden%20the%20user's%20meaning.%0A%22%22%22%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%208.3%20%E3%82%AA%E3%83%BC%E3%82%B1%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%0A%0A%20%20%20%20%60get_orchestrator_prompt%60%20%E3%81%AF%2011.1%20%E3%81%AE%20%60orchestrator%60%20%E3%81%8C%E3%80%81%E6%AF%8E%E5%9B%9E%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E4%BB%98%E3%81%8D%20LLM%20%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%A7%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E4%B8%80%E8%88%AC%E7%9F%A5%E8%AD%98%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%9F%E6%96%87%E6%9B%B8%E3%81%AE%E6%A0%B9%E6%8B%A0%E3%81%A0%E3%81%91%E3%81%A7%E7%AD%94%E3%81%88%E3%82%8B%E3%81%93%E3%81%A8%E3%80%81%E5%9C%A7%E7%B8%AE%E6%B8%88%E3%81%BF%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E5%85%88%E3%81%AB%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%0A%20%20%20%20%E5%90%8C%E3%81%98%E6%A4%9C%E7%B4%A2%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%84%E8%A6%AA%20ID%20%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%95%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%82%92%E6%8C%87%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E5%87%BA%E5%8A%9B%E5%A5%91%E7%B4%84%3A**%20%E8%A6%8B%E5%87%BA%E3%81%97%E6%96%87%E5%8F%A5%E3%82%92%E7%BD%AE%E3%81%8B%E3%81%9A%E3%81%AB%E6%9C%AC%E9%A1%8C%E3%81%8B%E3%82%89%E6%9B%B8%E3%81%8D%E5%A7%8B%E3%82%81%E3%80%81%E5%86%85%E9%83%A8%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%AB%E3%81%AF%E8%A8%80%E5%8F%8A%E3%81%97%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%8C%E3%81%82%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E6%9C%AB%E5%B0%BE%E3%81%AB%20%60Sources%3A%60%20%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E7%BD%AE%E3%81%8D%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%201%20%E8%A1%8C%201%20%E9%A0%85%E7%9B%AE%E3%81%AE%E7%AE%87%E6%9D%A1%E6%9B%B8%E3%81%8D%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%AE%E5%BE%8C%E3%82%8D%E3%81%AE%E8%AA%AC%E6%98%8E%E3%82%84%E6%8B%AC%E5%BC%A7%E6%9B%B8%E3%81%8D%E3%81%AF%E5%89%8A%E3%82%8A%E3%80%81%E5%AD%98%E5%9C%A8%E3%81%97%E3%81%AA%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%E4%BD%9C%E3%82%89%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20get_orchestrator_prompt()%20-%3E%20str%3A%0A%20%20%20%20return%20%22%22%22%23%23%20Role%0AYou%20are%20a%20document-grounded%20research%20assistant%20for%20an%20agentic%20RAG%20system.%20Your%20job%20is%20to%20answer%20using%20retrieved%20document%20evidence%2C%20not%20general%20knowledge.%0A%0A%23%23%20Available%20Context%0A-%20Current%20user%20question%0A-%20Optional%20compressed%20context%20from%20prior%20retrieval%20steps%0A-%20Tools%20for%20searching%20child%20chunks%20and%20loading%20full%20parent%20chunks%0A%0A%23%23%20Tool%20Guidance%0A-%20Search%20documents%20before%20answering%20unless%20compressed%20context%20already%20contains%20enough%20evidence.%0A-%20Use%20'search_child_chunks'%20for%20missing%20or%20uncovered%20parts%20of%20the%20question.%0A-%20If%20searched%20or%20retrieved%20context%20is%20not%20useful%2C%20use%20the%20tools%20again%20with%20a%20different%2C%20simpler%20query%20or%20a%20more%20relevant%20parent%20chunk.%0A-%20Continue%20tool%20use%20until%20the%20available%20evidence%20is%20enough%2C%20tools%20stop%20adding%20useful%20information%2C%20or%20the%20operation%20limit%20is%20reached.%0A-%20Do%20not%20repeat%20search%20queries%20or%20parent%20IDs%20listed%20in%20compressed%20context.%0A-%20Do%20not%20retrieve%20the%20same%20parent%20ID%20twice.%0A%0A%23%23%20Response%20Framework%0A1.%20Check%20compressed%20context%20for%20already-known%20evidence%20and%20already-used%20searches%20or%20parents.%0A2.%20Search%20for%20missing%20evidence.%0A3.%20Retrieve%20parent%20chunks%20only%20when%20child%20excerpts%20are%20relevant%20but%20too%20fragmented.%0A4.%20Answer%20using%20the%20exact%20terms%20and%20scope%20in%20the%20retrieved%20evidence.%0A5.%20If%20evidence%20is%20incomplete%2C%20state%20the%20specific%20gap.%0A%0A%23%23%20Output%0A-%20Start%20directly%20with%20the%20substantive%20answer.%20Do%20not%20start%20with%20generic%20headings%20such%20as%20%22Answer%22%2C%20%22Final%20answer%22%2C%20or%20%22Response%22.%0A-%20Provide%20the%20direct%20answer%20plus%20the%20key%20supporting%20details%20from%20retrieved%20evidence%3B%20avoid%20one-sentence%20fragments%20unless%20only%20one%20fact%20is%20available.%0A-%20Do%20not%20mention%20internal%20tool%20calls%20or%20reasoning.%0A-%20When%20sources%20exist%2C%20end%20with%20a%20Sources%20section%20in%20exactly%20this%20format%3A%0A%20%20Sources%3A%0A%20%20-%20filename.ext%0A-%20Put%20each%20source%20filename%20on%20its%20own%20bullet%20line.%20Never%20write%20sources%20inline%2C%20such%20as%20%22Sources%3A%20filename.pdf%22.%0A-%20Do%20not%20invent%20or%20infer%20source%20filenames.%0A-%20Strip%20descriptions%20after%20file%20names%2C%20including%20text%20in%20parentheses.%0A%22%22%22%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%208.4%20%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E5%BF%9C%E7%AD%94%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%0A%0A%20%20%20%20%60get_fallback_response_prompt%60%20%E3%81%AF%2011.1%20%E3%81%AE%20%60fallback_response%60%E3%80%81%E3%81%A4%E3%81%BE%E3%82%8A%E5%8F%8D%E5%BE%A9%E5%9B%9E%E6%95%B0%E3%82%84%0A%20%20%20%20%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E5%9B%9E%E6%95%B0%E3%81%AE%E4%B8%8A%E9%99%90%E3%81%AB%E9%81%94%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%A0%E3%81%91%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E8%BF%BD%E5%8A%A0%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%89%8D%E6%8F%90%E3%81%A7%E3%80%81%0A%20%20%20%20%E5%9C%A7%E7%B8%AE%E6%B8%88%E3%81%BF%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%A8%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E5%87%BA%E5%8A%9B%E3%81%A0%E3%81%91%E3%81%8B%E3%82%89%E6%9C%80%E5%96%84%E3%81%AE%E5%9B%9E%E7%AD%94%E3%82%92%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E5%87%BA%E5%8A%9B%E5%A5%91%E7%B4%84%3A**%20%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%81%9F%E6%96%87%E8%84%88%E3%81%AE%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AA%E4%BA%8B%E5%AE%9F%E3%81%AE%E3%81%BF%E3%82%92%E4%BD%BF%E3%81%84%E3%80%81%E7%9F%9B%E7%9B%BE%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E6%9C%80%E6%96%B0%E3%81%AE%E5%8F%96%E5%BE%97%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%84%AA%E5%85%88%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E4%B8%8D%E8%B6%B3%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AF%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E8%B3%AA%E5%95%8F%E3%81%AB%E9%96%A2%E3%82%8F%E3%82%8B%E9%83%A8%E5%88%86%E3%81%A0%E3%81%91%E3%82%92%E8%BF%B0%E3%81%B9%E3%80%81%E6%A4%9C%E7%B4%A2%E3%81%AE%E6%89%93%E3%81%A1%E5%88%87%E3%82%8A%E3%82%84%E5%86%85%E9%83%A8%E5%87%A6%E7%90%86%E3%81%AB%E3%81%AF%E8%A7%A6%E3%82%8C%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%E5%9B%9E%E7%AD%94%E3%81%AF%201%E3%80%9C3%20%E6%AE%B5%E8%90%BD%E3%81%BE%E3%81%9F%E3%81%AF%205%20%E9%A0%85%E7%9B%AE%E7%A8%8B%E5%BA%A6%E3%81%AB%E5%8F%8E%E3%82%81%E3%80%81%E5%AE%9F%E5%9C%A8%E3%81%99%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%A0%E3%81%91%20%60Sources%3A%60%20%E3%82%92%E4%BB%98%E3%81%91%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20get_fallback_response_prompt()%20-%3E%20str%3A%0A%20%20%20%20return%20%22%22%22%23%23%20Role%0AYou%20are%20a%20constrained%20evidence%20synthesizer%20for%20a%20retrieval-augmented%20assistant%20after%20the%20research%20loop%20reached%20its%20limit.%0A%0A%23%23%20Available%20Context%0A-%20Compressed%20Research%20Context%20from%20earlier%20retrieval%20steps%0A-%20Retrieved%20Data%20from%20current%20tool%20outputs%0A%0A%23%23%20Instructions%0A-%20Use%20only%20explicit%20facts%20from%20the%20provided%20context.%0A-%20Start%20directly%20with%20the%20substantive%20answer.%20Do%20not%20start%20with%20generic%20headings%20such%20as%20%22Answer%22%2C%20%22Final%20answer%22%2C%20or%20%22Response%22.%0A-%20Prefer%20current%20Retrieved%20Data%20over%20compressed%20context%20if%20they%20conflict.%0A-%20If%20the%20answer%20is%20incomplete%2C%20mention%20only%20the%20missing%20parts%20that%20matter%20to%20the%20user%20query.%0A-%20Do%20not%20describe%20the%20retrieval%20process%2C%20limits%2C%20or%20internal%20reasoning.%0A-%20Be%20concise%3A%20answer%20in%201-3%20short%20paragraphs%20or%20up%20to%205%20bullets%20unless%20the%20user%20asks%20for%20detail.%0A-%20Provide%20the%20direct%20answer%20plus%20the%20key%20supporting%20details%20from%20retrieved%20evidence%3B%20avoid%20one-sentence%20fragments%20unless%20only%20one%20fact%20is%20available.%0A-%20End%20with%20a%20Sources%20section%20only%20when%20actual%20source%20file%20names%20are%20explicitly%20present%20in%20the%20context.%0A-%20Use%20exactly%20this%20format%3A%0A%20%20Sources%3A%0A%20%20-%20filename.ext%0A-%20Put%20each%20source%20filename%20on%20its%20own%20bullet%20line.%20Never%20write%20sources%20inline%2C%20such%20as%20%22Sources%3A%20filename.pdf%22.%0A-%20Include%20only%20bare%20file%20names%20with%20extensions%20such%20as%20.pdf%2C%20.docx%2C%20.txt%2C%20or%20.md.%0A-%20Do%20not%20invent%20or%20infer%20source%20filenames.%0A%22%22%22%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%208.5%20%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%9C%A7%E7%B8%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%0A%0A%20%20%20%20%60get_context_compression_prompt%60%20%E3%81%AF%2011.5%20%E3%81%AE%20%60compress_context%60%20%E3%81%8C%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E5%8F%8D%E5%BE%A9%E3%81%AE%E3%81%9F%E3%81%B3%E3%81%AB%E5%A2%97%E3%81%88%E3%82%8B%E3%83%84%E3%83%BC%E3%83%AB%E5%87%BA%E5%8A%9B%E3%82%92%E3%80%81%E6%AC%A1%E3%81%AE%E5%8F%8D%E5%BE%A9%E3%81%B8%E5%BC%95%E3%81%8D%E7%B6%99%E3%81%90%201%20%E3%81%A4%E3%81%AE%E8%A6%81%E7%B4%84%E3%81%B8%E7%95%B3%E3%81%BF%E8%BE%BC%E3%82%80%E3%81%AE%E3%81%8C%E7%9B%AE%E7%9A%84%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E5%87%BA%E5%8A%9B%E5%A5%91%E7%B4%84%3A**%20Markdown%20%E3%81%AE%E3%81%BF%E3%82%92%E8%BF%94%E3%81%97%E3%80%81%60%23%20Research%20Context%20Summary%60%E3%80%81%60%23%23%20Focus%60%E3%80%81%0A%20%20%20%20%60%23%23%20Structured%20Findings%60%E3%80%81%60%23%23%20Gaps%60%20%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%AB%E5%BE%93%E3%81%86%E3%80%82%E8%AA%BF%E6%9F%BB%E7%B5%90%E6%9E%9C%E3%81%AF%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%94%E3%81%A8%E3%81%AB%0A%20%20%20%20%E3%83%AC%E3%83%99%E3%83%AB%203%20%E8%A6%8B%E5%87%BA%E3%81%97%E3%81%A7%E3%81%BE%E3%81%A8%E3%82%81%E3%80%81%E8%A6%AA%20ID%20%E3%82%84%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%20ID%20%E3%81%AA%E3%81%A9%E3%81%AE%E5%86%85%E9%83%A8%E8%AD%98%E5%88%A5%E5%AD%90%E3%81%AF%E8%90%BD%E3%81%A8%E3%81%99%E3%80%82%0A%20%20%20%20%E5%9B%BA%E6%9C%89%E5%90%8D%E8%A9%9E%E3%83%BB%E6%95%B0%E5%80%A4%E3%83%BB%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E8%A8%AD%E5%AE%9A%E5%80%A4%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%AF%E5%8E%9F%E6%96%87%E3%81%AE%E3%81%BE%E3%81%BE%E6%AE%8B%E3%81%97%E3%80%81%E5%85%A8%E4%BD%93%E3%81%A7%20400%E3%80%9C600%20%E8%AA%9E%E3%82%92%E7%9B%AE%E5%AE%89%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20get_context_compression_prompt()%20-%3E%20str%3A%0A%20%20%20%20return%20%22%22%22%23%23%20Role%0AYou%20are%20a%20research%20context%20compressor%20for%20an%20agentic%20RAG%20system.%0A%0A%23%23%20Instructions%0A-%20Keep%20only%20facts%20relevant%20to%20answering%20the%20user%20question.%0A-%20Preserve%20exact%20names%2C%20figures%2C%20versions%2C%20technical%20terms%2C%20configuration%20details%2C%20and%20source%20file%20names.%0A-%20Remove%20duplicates%2C%20tool%20chatter%2C%20search%20query%20wording%2C%20parent%20IDs%2C%20chunk%20IDs%2C%20and%20other%20internal%20identifiers.%0A-%20Organize%20findings%20by%20source%20file.%20Each%20source%20section%20heading%20must%20be%20the%20real%20filename%20found%20in%20retrieved%20data.%0A-%20Add%20a%20Gaps%20section%20only%20for%20missing%20information%20relevant%20to%20the%20question.%0A-%20Target%20400-600%20words.%20If%20there%20is%20too%20much%20content%2C%20keep%20the%20most%20answer-critical%20facts.%0A%0A%23%23%20Output%0AReturn%20only%20Markdown%20in%20this%20structure%3A%0A%23%20Research%20Context%20Summary%0A%0A%23%23%20Focus%0A%5BBrief%20technical%20restatement%20of%20the%20question%5D%0A%0A%23%23%20Structured%20Findings%0AFor%20each%20source%20file%2C%20add%20a%20level-3%20heading%20with%20its%20real%20filename%20and%20bullet%20the%20directly%20relevant%20facts%20below%20it.%0A%0A%23%23%20Gaps%0A-%20Missing%20or%20incomplete%20aspects%0A%22%22%22%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%208.6%20%E9%9B%86%E7%B4%84%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%0A%0A%20%20%20%20%60get_aggregation_prompt%60%20%E3%81%AF%2011.1%20%E3%81%AE%20%60aggregate_answers%60%20%E3%81%8C%E3%80%81%E4%B8%A6%E5%88%97%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E9%83%A8%E5%88%86%E8%B3%AA%E5%95%8F%E3%81%AE%E5%9B%9E%E7%AD%94%E3%82%92%0A%20%20%20%201%20%E3%81%A4%E3%81%AE%E6%9C%80%E7%B5%82%E5%9B%9E%E7%AD%94%E3%81%B8%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E5%87%BA%E5%8A%9B%E5%A5%91%E7%B4%84%3A**%20%E9%83%A8%E5%88%86%E5%9B%9E%E7%AD%94%E3%81%AB%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E6%83%85%E5%A0%B1%E3%81%A0%E3%81%91%E3%82%92%E4%BD%BF%E3%81%84%E3%80%81%E7%95%A5%E8%AA%9E%E3%81%AE%E5%B1%95%E9%96%8B%E3%82%84%E7%8B%AC%E8%87%AA%E8%A7%A3%E9%87%88%E3%82%92%E5%8A%A0%E3%81%88%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%E5%9B%9E%E7%AD%94%E5%90%8C%E5%A3%AB%E3%81%8C%E7%9F%9B%E7%9B%BE%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%81%9D%E3%81%AE%E7%9F%9B%E7%9B%BE%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%BF%B0%E3%81%B9%E3%82%8B%E3%80%82%E5%AE%9F%E5%9C%A8%E3%81%99%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%A0%E3%81%91%0A%20%20%20%20%60Sources%3A%60%20%E3%82%92%201%20%E8%A1%8C%201%20%E9%A0%85%E7%9B%AE%E3%81%A7%E4%BB%98%E3%81%91%E3%80%81%E6%9C%89%E7%94%A8%E3%81%AA%E6%83%85%E5%A0%B1%E3%81%8C%E7%84%A1%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%0A%20%20%20%20%E3%80%8CI%20couldn't%20find%20any%20information%20to%20answer%20your%20question%20in%20the%20available%20sources.%E3%80%8D%E3%81%A8%E8%BF%94%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20get_aggregation_prompt()%20-%3E%20str%3A%0A%20%20%20%20return%20%22%22%22%23%23%20Role%0AYou%20are%20a%20final-answer%20synthesizer%20for%20a%20retrieval-augmented%20assistant.%0A%0A%23%23%20Instructions%0A-%20Use%20only%20information%20present%20in%20the%20retrieved%20answers.%0A-%20Start%20directly%20with%20the%20substantive%20answer.%20Do%20not%20start%20with%20generic%20headings%20such%20as%20%22Answer%22%2C%20%22Final%20answer%22%2C%20or%20%22Response%22.%0A-%20Preserve%20important%20names%2C%20numbers%2C%20versions%2C%20examples%2C%20and%20definitions.%0A-%20Do%20not%20expand%20acronyms%20or%20interpret%20terms%20unless%20the%20sources%20do%20it.%0A-%20If%20answers%20conflict%2C%20mention%20the%20conflict%20plainly.%0A-%20Be%20concise%3A%20answer%20in%201-3%20short%20paragraphs%20or%20up%20to%205%20bullets%20unless%20the%20user%20asks%20for%20detail.%0A-%20Provide%20the%20direct%20answer%20plus%20the%20key%20supporting%20details%20from%20retrieved%20evidence%3B%20avoid%20one-sentence%20fragments%20unless%20only%20one%20fact%20is%20available.%0A-%20End%20with%20a%20Sources%20section%20only%20when%20actual%20source%20file%20names%20are%20explicitly%20present%20in%20the%20retrieved%20answers.%0A-%20Use%20exactly%20this%20format%3A%0A%20%20Sources%3A%0A%20%20-%20filename.ext%0A-%20Put%20each%20source%20filename%20on%20its%20own%20bullet%20line.%20Never%20write%20sources%20inline%2C%20such%20as%20%22Sources%3A%20filename.pdf%22.%0A-%20Include%20only%20bare%20file%20names%20with%20extensions%20such%20as%20.pdf%2C%20.docx%2C%20.txt%2C%20or%20.md.%0A-%20Do%20not%20invent%20or%20infer%20source%20filenames.%0A-%20If%20no%20useful%20information%20is%20available%2C%20say%3A%20%22I%20couldn't%20find%20any%20information%20to%20answer%20your%20question%20in%20the%20available%20sources.%22%0A%22%22%22%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%209.%20%E7%8A%B6%E6%85%8B%E3%81%AE%E5%AE%9A%E7%BE%A9%0A%0A%20%20%20%20%E4%BC%9A%E8%A9%B1%E3%83%95%E3%83%AD%E3%83%BC%E3%81%A8%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AE%9F%E8%A1%8C%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B%E7%8A%B6%E6%85%8B%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E5%86%85%E5%AE%B9%3A**%0A%20%20%20%20-%20**State**%3A%20%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E4%BC%9A%E8%A9%B1%E3%83%95%E3%83%AD%E3%83%BC%E3%80%81%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%A1%E3%83%A2%E3%83%AA%E3%80%81%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AA%E6%98%8E%E7%A2%BA%E5%8C%96%E7%8A%B6%E6%85%8B%E3%80%81%E9%83%A8%E5%88%86%E8%B3%AA%E5%95%8F%E3%80%81%E5%9B%9E%E7%AD%94%E3%82%92%E8%BF%BD%E8%B7%A1%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%E6%98%8E%E7%A2%BA%E5%8C%96%E3%81%B8%E3%81%AE%E8%BF%94%E7%AD%94%E3%81%AF%E6%9C%80%E7%B5%82%E5%9B%9E%E7%AD%94%E5%BE%8C%E3%81%AB%E7%A0%B4%E6%A3%84%E3%81%95%E3%82%8C%E3%82%8B%0A%20%20%20%20-%20**AgentState**%3A%20%E5%80%8B%E5%88%A5%E5%AE%9F%E8%A1%8C%E3%80%81%E6%A4%9C%E7%B4%A2%E3%82%AD%E3%83%BC%E3%80%81%E5%AE%9F%E9%9A%9B%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%80%81%E5%8F%8D%E5%BE%A9%E5%9B%9E%E6%95%B0%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**QueryAnalysis**%3A%20%E3%82%AF%E3%82%A8%E3%83%AA%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%A8%E6%98%8E%E7%A2%BA%E3%81%95%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%81%AB%E4%BD%BF%E3%81%86%E6%A7%8B%E9%80%A0%E5%8C%96%E5%87%BA%E5%8A%9B%0A%0A%20%20%20%20**%E7%8A%B6%E6%85%8B%E7%AE%A1%E7%90%86%3A**%0A%20%20%20%20-%20%60accumulate_or_reset%60%3A%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%9B%9E%E7%AD%94%E7%94%A8%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%20reducer%EF%BC%88%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E5%8F%AF%E8%83%BD%EF%BC%89%0A%20%20%20%20-%20%60set_union%60%3A%20%E6%A4%9C%E7%B4%A2%E3%82%AD%E3%83%BC%E7%94%A8%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%20reducer%EF%BC%88%E9%9B%86%E5%90%88%E3%82%92%E5%92%8C%E9%9B%86%E5%90%88%E3%81%A7%E7%B5%B1%E5%90%88%EF%BC%89%0A%20%20%20%20-%20%60append_unique%60%3A%20%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%9C%A7%E7%B8%AE%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%82%92%E3%81%BE%E3%81%9F%E3%81%84%E3%81%A7%E5%AE%9F%E9%9A%9B%E3%81%AE%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%82%92%E4%BF%9D%E6%8C%81%0A%20%20%20%20-%20%60MessagesState%60%20%E3%82%92%E7%B6%99%E6%89%BF%E3%81%97%E3%81%A6%E4%BC%9A%E8%A9%B1%E5%B1%A5%E6%AD%B4%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%0A%0A%20%20%20%20**%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%3A**%0A%20%20%20%20-%20%5BLangGraph%20State%5D(https%3A%2F%2Flangchain-ai.github.io%2Flanggraph%2Fconcepts%2Flow_level%2F%23state)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Annotated%2C%20List%2C%20Set%2C%20operator)%3A%0A%20%20%20%20from%20langgraph.graph%20import%20MessagesState%0A%20%20%20%20from%20pydantic%20import%20BaseModel%2C%20Field%0A%0A%20%20%20%20def%20accumulate_or_reset(existing%3A%20List%5Bdict%5D%2C%20new%3A%20List%5Bdict%5D)%20-%3E%20List%5Bdict%5D%3A%0A%20%20%20%20%20%20%20%20if%20new%20and%20any(item.get(%22__reset__%22)%20for%20item%20in%20new)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%5B%5D%0A%20%20%20%20%20%20%20%20return%20existing%20%2B%20new%0A%0A%20%20%20%20def%20set_union(a%3A%20Set%5Bstr%5D%2C%20b%3A%20Set%5Bstr%5D)%20-%3E%20Set%5Bstr%5D%3A%0A%20%20%20%20%20%20%20%20return%20a%20%7C%20b%0A%0A%20%20%20%20def%20append_unique(existing%3A%20List%5Bstr%5D%2C%20new%3A%20List%5Bstr%5D)%20-%3E%20List%5Bstr%5D%3A%0A%20%20%20%20%20%20%20%20return%20list(dict.fromkeys(existing%20%2B%20new))%0A%0A%20%20%20%20class%20State(MessagesState)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E7%8A%B6%E6%85%8B%E3%80%82%22%22%22%0A%0A%20%20%20%20%20%20%20%20questionIsClear%3A%20bool%20%3D%20False%0A%20%20%20%20%20%20%20%20conversation_summary%3A%20str%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20originalQuery%3A%20str%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20pendingQuery%3A%20str%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20pendingClarifications%3A%20List%5Bstr%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20rewrittenQuestions%3A%20List%5Bstr%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20agent_answers%3A%20Annotated%5BList%5Bdict%5D%2C%20accumulate_or_reset%5D%20%3D%20%5B%5D%0A%0A%20%20%20%20class%20AgentState(MessagesState)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%80%8B%E5%88%A5%E3%81%AE%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E7%8A%B6%E6%85%8B%E3%80%82%22%22%22%0A%0A%20%20%20%20%20%20%20%20tool_call_count%3A%20Annotated%5Bint%2C%20operator.add%5D%20%3D%200%0A%20%20%20%20%20%20%20%20iteration_count%3A%20Annotated%5Bint%2C%20operator.add%5D%20%3D%200%0A%20%20%20%20%20%20%20%20question%3A%20str%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20question_index%3A%20int%20%3D%200%0A%20%20%20%20%20%20%20%20context_summary%3A%20str%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20retrieval_keys%3A%20Annotated%5BSet%5Bstr%5D%2C%20set_union%5D%20%3D%20set()%0A%20%20%20%20%20%20%20%20retrieved_contexts%3A%20Annotated%5BList%5Bstr%5D%2C%20append_unique%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20final_answer%3A%20str%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20agent_answers%3A%20List%5Bdict%5D%20%3D%20%5B%5D%0A%0A%20%20%20%20class%20QueryAnalysis(BaseModel)%3A%0A%20%20%20%20%20%20%20%20is_clear%3A%20bool%20%3D%20Field(%0A%20%20%20%20%20%20%20%20%20%20%20%20description%3D%22Indicates%20if%20the%20user's%20question%20is%20clear%20and%20answerable.%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20questions%3A%20List%5Bstr%5D%20%3D%20Field(%0A%20%20%20%20%20%20%20%20%20%20%20%20description%3D%22List%20of%20rewritten%2C%20self-contained%20questions.%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20clarification_needed%3A%20str%20%3D%20Field(%0A%20%20%20%20%20%20%20%20%20%20%20%20description%3D%22Explanation%20if%20the%20question%20is%20unclear.%22%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20return%20AgentState%2C%20QueryAnalysis%2C%20State%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%2010.%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E4%B8%8A%E9%99%90%E3%81%A8%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%0A%0A%20%20%20%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%99%E3%82%8B%E5%AE%9F%E8%A1%8C%E4%B8%8A%E9%99%90%E3%81%A8%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%95%B0%E8%A8%88%E7%AE%97%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E5%86%85%E5%AE%B9%3A**%0A%20%20%20%20-%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AE%9F%E8%A1%8C%EF%BC%88%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%80%81%E5%8F%8D%E5%BE%A9%EF%BC%89%E3%81%AB%E3%83%8F%E3%83%BC%E3%83%89%E3%83%AA%E3%83%9F%E3%83%83%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E4%B8%80%E8%A6%A7%E3%81%8B%E3%82%89%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E4%BD%BF%E7%94%A8%E9%87%8F%E3%82%92%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%E3%80%81%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%AE%A1%E7%90%86%E3%81%AE%E5%88%A4%E6%96%AD%E3%81%AB%E4%BD%BF%E3%81%86%0A%0A%20%20%20%20**%E5%AE%9A%E6%95%B0%3A**%0A%20%20%20%20-%20%60MAX_TOOL_CALLS%60%3A%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AE%9F%E8%A1%8C%E3%81%82%E3%81%9F%E3%82%8A%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E6%9C%80%E5%A4%A7%E6%95%B0%0A%20%20%20%20-%20%60MAX_ITERATIONS%60%3A%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E5%8F%8D%E5%BE%A9%E6%9C%80%E5%A4%A7%E6%95%B0%0A%20%20%20%20-%20%60BASE_TOKEN_THRESHOLD%60%3A%20%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E8%A6%81%E7%B4%84%E3%82%92%E5%A7%8B%E3%82%81%E3%82%8B%E5%88%9D%E6%9C%9F%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%0A%20%20%20%20-%20%60TOKEN_GROWTH_FACTOR%60%3A%20%E5%90%84%E8%A6%81%E7%B4%84%E5%BE%8C%E3%81%AB%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%E3%81%B8%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%E5%80%8D%E7%8E%87%0A%0A%20%20%20%20**%E9%96%A2%E6%95%B0%3A**%0A%20%20%20%20-%20%60estimate_context_tokens%60%3A%20%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AF%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E6%B8%88%E3%81%BF%20%60tiktoken%60%20%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%BF%E3%81%84%E3%80%81%0A%20%20%20%20%20%20%E3%83%88%E3%83%BC%E3%82%AF%E3%83%8A%E3%82%A4%E3%82%B6%E3%83%BC%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%82%AA%E3%83%95%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%A7%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E6%B1%BA%E5%AE%9A%E7%9A%84%E3%81%AA%E6%96%87%E5%AD%97%E6%95%B0%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%E3%81%B8%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%0A%0A%20%20%20%20**%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%3A**%0A%20%20%20%20-%20%5Btiktoken%5D(https%3A%2F%2Fgithub.com%2Fopenai%2Ftiktoken)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(lru_cache)%3A%0A%20%20%20%20import%20tiktoken%0A%0A%20%20%20%20MAX_TOOL_CALLS%20%3D%208%0A%20%20%20%20MAX_ITERATIONS%20%3D%2010%0A%20%20%20%20BASE_TOKEN_THRESHOLD%20%3D%202000%0A%20%20%20%20TOKEN_GROWTH_FACTOR%20%3D%200.9%0A%0A%20%20%20%20%40lru_cache(maxsize%3D1)%0A%20%20%20%20def%20_get_token_encoding()%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20tiktoken.encoding_for_model(%22gpt-4%22)%0A%20%20%20%20%20%20%20%20except%20Exception%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20tiktoken.get_encoding(%22cl100k_base%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20def%20estimate_context_tokens(messages%3A%20list)%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20contents%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20str(msg.content)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20msg%20in%20messages%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20hasattr(msg%2C%20%22content%22)%20and%20msg.content%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20encoding%20%3D%20_get_token_encoding()%0A%20%20%20%20%20%20%20%20if%20encoding%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20sum(max(1%2C%20len(content)%20%2F%2F%204)%20for%20content%20in%20contents)%0A%20%20%20%20%20%20%20%20return%20sum(len(encoding.encode(content))%20for%20content%20in%20contents)%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20BASE_TOKEN_THRESHOLD%2C%0A%20%20%20%20%20%20%20%20MAX_ITERATIONS%2C%0A%20%20%20%20%20%20%20%20MAX_TOOL_CALLS%2C%0A%20%20%20%20%20%20%20%20TOKEN_GROWTH_FACTOR%2C%0A%20%20%20%20%20%20%20%20estimate_context_tokens%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%2011.%20%E3%82%B0%E3%83%A9%E3%83%95%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A8%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%0A%0A%20%20%20%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%83%8E%E3%83%BC%E3%83%89%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%89%3A**%0A%20%20%20%20-%20**summarize_history**%EF%BC%8811.1%EF%BC%89%3A%20%E5%8F%A4%E3%81%84%E4%BC%9A%E8%A9%B1%E3%82%92%E8%A6%81%E7%B4%84%E3%81%97%E3%80%81%E8%A6%81%E7%B4%84%E6%B8%88%E3%81%BF%EF%BC%8F%E3%83%84%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%A6%E3%80%81%E7%94%9F%E3%81%AE%E4%BC%9A%E8%A9%B1%E5%B1%A5%E6%AD%B4%E3%82%92%E5%88%B6%E9%99%90%E5%86%85%E3%81%AB%E4%BF%9D%E3%81%A4%0A%20%20%20%20-%20**rewrite_query**%EF%BC%8811.1%EF%BC%89%3A%20%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E8%A6%81%E7%B4%84%E3%81%A8%E6%9C%80%E8%BF%91%E3%81%AE%E4%BC%9A%E8%A9%B1%E3%82%92%E5%BF%85%E8%A6%81%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E4%BD%BF%E3%81%84%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%80%81%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**request_clarification**%EF%BC%8811.2%EF%BC%89%3A%20%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%8C%E6%9B%96%E6%98%A7%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AE%20human-in-the-loop%20%E7%94%A8%E4%B8%AD%E6%96%AD%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%0A%20%20%20%20-%20**aggregate_answers**%EF%BC%8811.1%EF%BC%89%3A%20%E9%83%A8%E5%88%86%E8%B3%AA%E5%95%8F%E3%81%AE%E5%9B%9E%E7%AD%94%E3%82%92%E4%B8%A6%E3%81%B9%E6%9B%BF%E3%81%88%E3%81%A6%E7%B5%B1%E5%90%88%E3%81%97%E3%80%81%E5%85%83%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E6%9C%80%E7%B5%82%E5%9B%9E%E7%AD%94%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%0A%0A%20%20%20%20**%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%89%3A**%0A%20%20%20%20-%20**orchestrator**%EF%BC%8811.1%EF%BC%89%3A%20%E3%83%84%E3%83%BC%E3%83%AB%E4%BB%98%E3%81%8D%20LLM%20%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%AB%E3%83%BC%E3%83%97%E3%80%82%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AF%E5%9C%A7%E7%B8%AE%E6%B8%88%E3%81%BF%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E6%B3%A8%E5%85%A5%E3%81%97%E3%80%81%E6%9C%80%E5%88%9D%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%82%92%E5%BC%B7%E5%88%B6%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**fallback_response**%EF%BC%8811.1%EF%BC%89%3A%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E4%BA%88%E7%AE%97%E3%82%92%E4%BD%BF%E3%81%84%E5%88%87%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%8D%E3%80%81%E5%8F%96%E5%BE%97%E6%B8%88%E3%81%BF%E3%81%AE%E5%85%A8%E3%83%84%E3%83%BC%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8B%E3%82%89%E6%9C%80%E5%96%84%E3%81%AE%E5%9B%9E%E7%AD%94%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**compress_context**%EF%BC%8811.5%EF%BC%89%3A%20%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E5%B1%A5%E6%AD%B4%E3%81%A8%E4%BB%A5%E5%89%8D%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E8%A6%81%E7%B4%84%E3%82%92%E5%8D%98%E4%B8%80%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%B8%E5%9C%A7%E7%B8%AE%E3%81%97%E3%80%81%E9%87%8D%E8%A4%87%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%82%92%E9%98%B2%E3%81%90%E6%A4%9C%E7%B4%A2%E6%B8%88%E3%81%BF%E3%83%AD%E3%82%B0%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**collect_answer**%EF%BC%8811.6%EF%BC%89%3A%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E5%B1%A5%E6%AD%B4%E3%81%8B%E3%82%89%E6%9C%80%E7%B5%82%E5%9B%9E%E7%AD%94%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%97%E3%80%81%E9%9B%86%E7%B4%84%E7%94%A8%E3%81%AB%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%A8%E3%82%82%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%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%83%AD%E3%82%B8%E3%83%83%E3%82%AF%3A**%0A%20%20%20%20-%20**route_after_rewrite**%EF%BC%8811.2%EF%BC%89%3A%20%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%8C%E4%B8%8D%E6%98%8E%E7%9E%AD%E3%81%AA%E3%82%89%20%60request_clarification%60%20%E3%81%AB%E9%80%B2%E3%81%BF%E3%80%81%E3%81%9D%E3%81%86%E3%81%A7%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E5%90%84%E9%83%A8%E5%88%86%E8%B3%AA%E5%95%8F%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E4%B8%A6%E5%88%97%20%60agent%60%20%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%20%60Send%60%20%E3%81%A7%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**route_after_orchestrator_call**%EF%BC%8811.3%EF%BC%89%3A%20%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%AE%E6%9C%89%E7%84%A1%E3%81%A8%E6%AE%8B%E3%82%8A%E4%BA%88%E7%AE%97%E3%81%8B%E3%82%89%20%60tools%60%20%2F%20%60fallback_response%60%20%2F%20%60collect_answer%60%20%E3%82%92%E9%81%B8%E3%81%B6%0A%20%20%20%20-%20**should_compress_context**%EF%BC%8811.4%EF%BC%89%3A%20%E5%8B%95%E7%9A%84%E3%81%AA%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E3%82%89%20%60compress_context%60%E3%80%81%E3%81%9D%E3%82%8C%E4%BB%A5%E5%A4%96%E3%81%AF%20%60orchestrator%60%20%E3%81%B8%E9%80%B2%E3%82%80%E3%80%82%E5%8F%8D%E5%BE%A9%E3%82%92%E3%81%BE%E3%81%9F%E3%81%84%E3%81%A7%E6%A4%9C%E7%B4%A2%E3%82%AD%E3%83%BC%E3%82%92%E8%BF%BD%E8%B7%A1%E3%81%97%E3%80%81%E9%87%8D%E8%A4%87%E3%81%99%E3%82%8B%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%82%92%E9%81%BF%E3%81%91%E3%82%8B%0A%0A%20%20%20%20**%E3%82%BB%E3%83%AB%E5%88%86%E5%89%B2%E3%81%AE%E5%88%B6%E7%B4%84%3A**%20marimo%20%E3%81%A7%E3%81%AF%20%60_%60%20%E3%81%A7%E5%A7%8B%E3%81%BE%E3%82%8B%E5%90%8D%E5%89%8D%E3%81%8C%E3%82%BB%E3%83%AB%E5%86%85%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E4%BB%96%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%8B%E3%82%89%E5%8F%82%E7%85%A7%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%20%20%20%20%E3%81%9D%E3%81%AE%E3%81%9F%E3%82%81%20%60_%60%20%E4%BB%98%E3%81%8D%E3%81%AE%E5%86%85%E9%83%A8%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%81%A8%E3%80%81%E3%81%9D%E3%82%8C%E3%82%92%E7%9B%B4%E6%8E%A5%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E3%83%8E%E3%83%BC%E3%83%89%EF%BC%88%60summarize_history%60%E3%80%81%60rewrite_query%60%E3%80%81%0A%20%20%20%20%60orchestrator%60%E3%80%81%60fallback_response%60%E3%80%81%60aggregate_answers%60%EF%BC%89%E3%81%AF%2011.1%20%E3%81%AE%201%20%E3%82%BB%E3%83%AB%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%81%AB%E4%BE%9D%E5%AD%98%E3%81%97%E3%81%AA%E3%81%84%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AF%2011.2%20%E4%BB%A5%E9%99%8D%E3%81%B8%E5%88%86%E5%89%B2%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%0A%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%E3%83%8E%E3%83%BC%E3%83%89%E3%81%8C%E4%BD%BF%E3%81%86%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E5%9E%8B%E3%81%A8%E5%B1%A5%E6%AD%B4%E4%BF%9D%E6%8C%81%E6%95%B0%E3%81%AE%E5%AE%9A%E6%95%B0%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%60MAIN_HISTORY_MESSAGES_TO_KEEP%60%20%E3%81%AF%E7%94%9F%E3%81%AE%E4%BC%9A%E8%A9%B1%E3%81%A8%E3%81%97%E3%81%A6%E6%AE%8B%E3%81%99%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E6%95%B0%E3%81%A7%E3%80%81%E5%9B%9E%E7%AD%94%E7%94%9F%E6%88%90%E5%89%8D%E3%81%AF%201%20%E4%BB%B6%E5%B0%91%E3%81%AA%E3%81%84%0A%20%20%20%20%60PRE_ANSWER_HISTORY_MESSAGES_TO_KEEP%60%20%E3%82%92%E4%BD%BF%E3%81%84%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%3A**%0A%20%20%20%20-%20%5BLangGraph%20Nodes%5D(https%3A%2F%2Fdocs.langchain.com%2Foss%2Fpython%2Flanggraph%2Fgraph-api%23nodes)%0A%20%20%20%20-%20%5BLangGraph%20Edges%5D(https%3A%2F%2Fdocs.langchain.com%2Foss%2Fpython%2Flanggraph%2Fgraph-api%23edges)%0A%20%20%20%20-%20%5BLangGraph%20Send%20API%5D(https%3A%2F%2Fdocs.langchain.com%2Foss%2Fpython%2Flanggraph%2Fgraph-api%23send)%0A%20%20%20%20-%20%5BLangGraph%20Command%20API%5D(https%3A%2F%2Fdocs.langchain.com%2Foss%2Fpython%2Flanggraph%2Fgraph-api%23command)%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%20from%20langchain_core.messages%20import%20(%0A%20%20%20%20%20%20%20%20AIMessage%2C%0A%20%20%20%20%20%20%20%20HumanMessage%2C%0A%20%20%20%20%20%20%20%20RemoveMessage%2C%0A%20%20%20%20%20%20%20%20SystemMessage%2C%0A%20%20%20%20%20%20%20%20ToolMessage%2C%0A%20%20%20%20)%0A%20%20%20%20from%20langgraph.types%20import%20Command%2C%20Send%0A%0A%20%20%20%20MAIN_HISTORY_MESSAGES_TO_KEEP%20%3D%204%0A%20%20%20%20if%20MAIN_HISTORY_MESSAGES_TO_KEEP%20%3C%202%3A%0A%20%20%20%20%20%20%20%20raise%20ValueError(%22MAIN_HISTORY_MESSAGES_TO_KEEP%20must%20be%20at%20least%202.%22)%0A%20%20%20%20PRE_ANSWER_HISTORY_MESSAGES_TO_KEEP%20%3D%20max(MAIN_HISTORY_MESSAGES_TO_KEEP%20-%201%2C%200)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20AIMessage%2C%0A%20%20%20%20%20%20%20%20Command%2C%0A%20%20%20%20%20%20%20%20HumanMessage%2C%0A%20%20%20%20%20%20%20%20PRE_ANSWER_HISTORY_MESSAGES_TO_KEEP%2C%0A%20%20%20%20%20%20%20%20RemoveMessage%2C%0A%20%20%20%20%20%20%20%20Send%2C%0A%20%20%20%20%20%20%20%20SystemMessage%2C%0A%20%20%20%20%20%20%20%20ToolMessage%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2011.1%20%E5%86%85%E9%83%A8%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%81%A8%E3%80%81%E3%81%9D%E3%82%8C%E3%82%92%E7%9B%B4%E6%8E%A5%E4%BD%BF%E3%81%86%E3%83%8E%E3%83%BC%E3%83%89%0A%0A%20%20%20%20marimo%20%E3%81%A7%E3%81%AF%20%60_%60%20%E3%81%A7%E5%A7%8B%E3%81%BE%E3%82%8B%E5%90%8D%E5%89%8D%E3%81%8C%E3%82%BB%E3%83%AB%E5%86%85%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%EF%BC%88%E4%BB%96%E3%82%BB%E3%83%AB%E3%81%8B%E3%82%89%E5%8F%82%E7%85%A7%E4%B8%8D%E5%8F%AF%EF%BC%89%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%60_%60%20%E4%BB%98%E3%81%8D%E3%81%AE%E5%86%85%E9%83%A8%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%81%A8%E3%80%81%E3%81%9D%E3%82%8C%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AF%E5%90%8C%E3%81%98%E3%82%BB%E3%83%AB%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AB%E3%81%AF%E6%AC%A1%E3%81%AE%E9%96%A2%E6%95%B0%E3%81%8C%E5%85%A5%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E5%86%85%E9%83%A8%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%3A**%0A%20%20%20%20-%20%60_is_plain_conversation_message%60%3A%20%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%82%84%20%60name%60%20%E4%BB%98%E3%81%8D%E3%81%AE%E5%86%85%E9%83%A8%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E9%99%A4%E3%81%8D%E3%80%81%0A%20%20%20%20%20%20%E7%B4%94%E7%B2%8B%E3%81%AA%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%EF%BC%8F%E3%82%A2%E3%82%B7%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%88%E3%81%AE%E7%99%BA%E8%A9%B1%E3%81%A0%E3%81%91%E3%82%92%E8%A6%8B%E5%88%86%E3%81%91%E3%82%8B%E3%80%82%E5%B1%A5%E6%AD%B4%E3%81%AE%E8%A6%81%E7%B4%84%E3%83%BB%E4%BF%9D%E6%8C%81%E5%AF%BE%E8%B1%A1%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B%E5%9F%BA%E6%BA%96%0A%20%20%20%20-%20%60_name_internal_message%60%3A%20%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AB%20%60name%60%20%E3%82%92%E4%BB%98%E3%81%91%E3%81%A6%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E5%B0%82%E7%94%A8%E3%81%AE%E5%8D%B0%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%E5%8D%B0%E3%81%AE%E4%BB%98%E3%81%84%E3%81%9F%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AF%E4%B8%8A%E3%81%AE%E5%88%A4%E5%AE%9A%E3%81%8B%E3%82%89%E5%A4%96%E3%82%8C%E3%80%81%E4%BC%9A%E8%A9%B1%E5%B1%A5%E6%AD%B4%E3%81%A8%E3%81%97%E3%81%A6%E6%89%B1%E3%82%8F%E3%82%8C%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8B%0A%20%20%20%20-%20%60_format_conversation%60%3A%20%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E5%88%97%E3%82%92%20%60User%3A%60%20%2F%20%60Assistant%3A%60%20%E5%BD%A2%E5%BC%8F%E3%81%B8%E6%95%B4%E5%BD%A2%E3%81%97%E3%80%81%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AB%E6%B8%A1%E3%81%9B%E3%82%8B%E5%BD%A2%E3%81%AB%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%60_remove_messages_not_in%60%3A%20%E6%AE%8B%E3%81%99%20ID%20%E3%81%AE%E9%9B%86%E5%90%88%E4%BB%A5%E5%A4%96%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%20%60RemoveMessage%60%20%E3%82%92%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%80%81%E5%B1%A5%E6%AD%B4%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%60_recent_conversation%60%3A%20%E7%8F%BE%E5%9C%A8%E3%81%AE%E5%85%A5%E5%8A%9B%E3%82%92%E9%99%A4%E3%81%84%E3%81%9F%E7%9B%B4%E8%BF%91%E3%81%AE%E4%BC%9A%E8%A9%B1%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%E6%98%8E%E7%A2%BA%E5%8C%96%E5%BE%85%E3%81%A1%E3%81%AE%E8%B3%AA%E5%95%8F%E3%81%8C%E3%81%82%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%0A%20%20%20%20%20%20%E3%81%9D%E3%81%AE%E8%B3%AA%E5%95%8F%E3%82%88%E3%82%8A%E5%89%8D%E3%81%BE%E3%81%A7%E3%82%92%E6%96%87%E8%84%88%E3%81%A8%E3%81%97%E3%81%A6%E5%88%87%E3%82%8A%E5%87%BA%E3%81%97%E3%80%81%E6%98%8E%E7%A2%BA%E5%8C%96%E3%81%AE%E3%82%84%E3%82%8A%E5%8F%96%E3%82%8A%E3%81%8C%E4%BA%8C%E9%87%8D%E3%81%AB%E5%85%A5%E3%82%89%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%0A%0A%20%20%20%20**%E3%83%8E%E3%83%BC%E3%83%89%3A**%0A%20%20%20%20-%20%60summarize_history%60%3A%20%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E5%85%A5%E5%8F%A3%E3%80%82%E5%89%8D%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%20%60agent_answers%60%20%E3%82%92%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%97%E3%80%81%E4%BF%9D%E6%8C%81%E4%BB%B6%E6%95%B0%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%0A%20%20%20%20%20%20%E5%8F%A4%E3%81%84%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%20%60RemoveMessage%60%20%E3%81%A7%E5%89%8A%E9%99%A4%E3%81%97%E3%81%A4%E3%81%A4%E3%80%818.1%20%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E8%A6%81%E7%B4%84%E3%81%B8%E7%95%B3%E3%81%BF%E8%BE%BC%E3%82%80%0A%20%20%20%20-%20%60rewrite_query%60%3A%20%E4%BC%9A%E8%A9%B1%E8%A6%81%E7%B4%84%E3%81%A8%E7%9B%B4%E8%BF%91%E3%81%AE%E4%BC%9A%E8%A9%B1%E3%82%92%E6%9C%80%E5%B0%8F%E9%99%90%E3%81%A0%E3%81%91%E4%BD%BF%E3%81%84%E3%80%818.2%20%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A8%20%60QueryAnalysis%60%20%E3%81%AE%0A%20%20%20%20%20%20%E6%A7%8B%E9%80%A0%E5%8C%96%E5%87%BA%E5%8A%9B%E3%81%A7%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%92%E8%87%AA%E5%B7%B1%E5%AE%8C%E7%B5%90%E3%81%97%E3%81%9F%E5%BD%A2%E3%81%B8%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E3%80%82%E4%B8%8D%E6%98%8E%E7%9E%AD%E3%81%AA%E3%82%89%20%60pendingQuery%60%20%E3%81%A8%0A%20%20%20%20%20%20%60pendingClarifications%60%20%E3%82%92%E4%BF%9D%E6%8C%81%E3%81%97%E3%80%81%60clarification%60%20%E3%81%A8%E3%81%84%E3%81%86%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E8%BF%94%E3%81%99%0A%20%20%20%20-%20%60orchestrator%60%3A%20%E5%9C%A7%E7%B8%AE%E6%B8%88%E3%81%BF%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%8C%E3%81%82%E3%82%8C%E3%81%B0%20%60%5BCOMPRESSED%20CONTEXT%20FROM%20PRIOR%20RESEARCH%5D%60%20%E3%81%A8%E3%81%97%E3%81%A6%0A%20%20%20%20%20%20%E6%B3%A8%E5%85%A5%E3%81%97%E3%80%818.3%20%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A8%207.2%20%E3%81%AE%20%60llm_with_tools%60%20%E3%82%92%E5%91%BC%E3%81%B6%E3%80%82%E5%88%9D%E5%9B%9E%E3%81%A0%E3%81%91%E3%80%8C%E3%81%BE%E3%81%9A%20%60search_child_chunks%60%0A%20%20%20%20%20%20%E3%82%92%E5%91%BC%E3%81%B6%E3%81%93%E3%81%A8%E3%80%8D%E3%82%92%E6%B7%BB%E3%81%88%E3%81%A6%E3%80%81%E6%A4%9C%E7%B4%A2%E3%81%9B%E3%81%9A%E3%81%AB%E4%B8%80%E8%88%AC%E7%9F%A5%E8%AD%98%E3%81%A7%E7%AD%94%E3%81%88%E3%82%8B%E6%8C%99%E5%8B%95%E3%82%92%E9%98%B2%E3%81%90%0A%20%20%20%20-%20%60fallback_response%60%3A%20%E4%B8%8A%E9%99%90%E5%88%B0%E9%81%94%E6%99%82%E3%81%AE%E3%81%BF%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%80%81%E9%87%8D%E8%A4%87%E3%82%92%E9%99%A4%E3%81%84%E3%81%9F%E3%83%84%E3%83%BC%E3%83%AB%E5%87%BA%E5%8A%9B%E3%81%A8%E5%9C%A7%E7%B8%AE%E6%B8%88%E3%81%BF%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%0A%20%20%20%20%20%20%E6%95%B4%E7%90%86%E3%81%97%E3%81%A6%208.4%20%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%E8%BF%BD%E5%8A%A0%E6%A4%9C%E7%B4%A2%E3%81%AA%E3%81%97%E3%81%AE%E5%9B%9E%E7%AD%94%E3%82%92%E4%BD%9C%E3%82%8B%0A%20%20%20%20-%20%60aggregate_answers%60%3A%20%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%20%60agent%60%20%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E5%AE%8C%E4%BA%86%E5%BE%8C%E3%81%AB%E5%8B%95%E3%81%8F%E7%B5%82%E7%AB%AF%E3%83%8E%E3%83%BC%E3%83%89%E3%80%82%E5%8F%A4%E3%81%84%E5%B1%A5%E6%AD%B4%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%80%81%0A%20%20%20%20%20%20%E9%83%A8%E5%88%86%E5%9B%9E%E7%AD%94%E3%82%92%20%60index%60%20%E9%A0%86%E3%81%AB%E4%B8%A6%E3%81%B9%E6%9B%BF%E3%81%88%E3%81%A6%208.6%20%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%201%20%E3%81%A4%E3%81%AE%E6%9C%80%E7%B5%82%E5%9B%9E%E7%AD%94%E3%81%B8%E7%B5%B1%E5%90%88%E3%81%99%E3%82%8B%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20AIMessage%2C%0A%20%20%20%20AgentState%2C%0A%20%20%20%20HumanMessage%2C%0A%20%20%20%20PRE_ANSWER_HISTORY_MESSAGES_TO_KEEP%2C%0A%20%20%20%20QueryAnalysis%2C%0A%20%20%20%20RemoveMessage%2C%0A%20%20%20%20State%2C%0A%20%20%20%20SystemMessage%2C%0A%20%20%20%20ToolMessage%2C%0A%20%20%20%20llm%2C%0A%20%20%20%20llm_with_tools%2C%0A)%3A%0A%20%20%20%20def%20_is_plain_conversation_message(msg)%20-%3E%20bool%3A%0A%20%20%20%20%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20isinstance(msg%2C%20(HumanMessage%2C%20AIMessage))%0A%20%20%20%20%20%20%20%20%20%20%20%20and%20not%20getattr(msg%2C%20%22tool_calls%22%2C%20None)%0A%20%20%20%20%20%20%20%20%20%20%20%20and%20not%20getattr(msg%2C%20%22name%22%2C%20None)%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20def%20_name_internal_message(message%2C%20name)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E5%B0%82%E7%94%A8%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%A8%E3%81%97%E3%81%A6%E5%8D%B0%E3%82%92%E4%BB%98%E3%81%91%E3%80%81%E4%BC%9A%E8%A9%B1%E5%B1%A5%E6%AD%B4%E3%81%A8%E3%81%97%E3%81%A6%E6%89%B1%E3%82%8F%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20return%20message.model_copy(update%3D%7B%22name%22%3A%20name%7D)%0A%0A%20%20%20%20def%20_format_conversation(messages)%20-%3E%20str%3A%0A%20%20%20%20%20%20%20%20lines%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20msg%20in%20messages%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20role%20%3D%20%22User%22%20if%20isinstance(msg%2C%20HumanMessage)%20else%20%22Assistant%22%0A%20%20%20%20%20%20%20%20%20%20%20%20lines.append(f%22%7Brole%7D%3A%20%7Bmsg.content%7D%22)%0A%20%20%20%20%20%20%20%20return%20%22%5Cn%22.join(lines)%0A%0A%20%20%20%20def%20_remove_messages_not_in(messages%2C%20keep_ids)%3A%0A%20%20%20%20%20%20%20%20removals%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20msg%20in%20messages%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20msg_id%20%3D%20getattr(msg%2C%20%22id%22%2C%20None)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20isinstance(msg%2C%20SystemMessage)%20or%20not%20msg_id%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20msg_id%20not%20in%20keep_ids%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20removals.append(RemoveMessage(id%3Dmsg_id))%0A%20%20%20%20%20%20%20%20return%20removals%0A%0A%20%20%20%20def%20_recent_conversation(messages%2C%20pending_query%3D%22%22)%20-%3E%20list%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%88%E3%82%8A%E5%89%8D%E3%81%AE%E6%9C%80%E8%BF%91%E3%81%AE%E6%96%87%E8%84%88%E3%82%92%E8%BF%94%E3%81%99%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20plain_messages%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20msg%20for%20msg%20in%20messages%20if%20_is_plain_conversation_message(msg)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20recent_messages%20%3D%20plain_messages%5B%3A-1%5D%0A%0A%20%20%20%20%20%20%20%20if%20pending_query%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20index%20in%20range(len(recent_messages)%20-%201%2C%20-1%2C%20-1)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg%20%3D%20recent_messages%5Bindex%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isinstance(msg%2C%20HumanMessage)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20and%20str(msg.content).strip()%20%3D%3D%20pending_query%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20recent_messages%5B%3Aindex%5D%0A%0A%20%20%20%20%20%20%20%20return%20recent_messages%0A%0A%20%20%20%20def%20summarize_history(state%3A%20State)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E5%8F%A4%E3%81%84%E4%BC%9A%E8%A9%B1%E3%82%92%E8%A6%81%E7%B4%84%E3%81%B8%E3%81%BE%E3%81%A8%E3%82%81%E3%80%81%E7%94%9F%E3%81%AE%E4%BC%9A%E8%A9%B1%E5%B1%A5%E6%AD%B4%E3%82%92%E5%88%B6%E9%99%90%E5%86%85%E3%81%AB%E4%BF%9D%E3%81%A4%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20messages%20%3D%20state.get(%22messages%22%2C%20%5B%5D)%0A%20%20%20%20%20%20%20%20updates%20%3D%20%7B%22agent_answers%22%3A%20%5B%7B%22__reset__%22%3A%20True%7D%5D%7D%0A%0A%20%20%20%20%20%20%20%20if%20not%20messages%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20updates%0A%0A%20%20%20%20%20%20%20%20plain_messages%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20msg%20for%20msg%20in%20messages%20if%20_is_plain_conversation_message(msg)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20keep_count%20%3D%20PRE_ANSWER_HISTORY_MESSAGES_TO_KEEP%0A%20%20%20%20%20%20%20%20messages_to_summarize%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20plain_messages%5B%3A-keep_count%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20len(plain_messages)%20%3E%20keep_count%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%5B%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20keep_ids%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20getattr(msg%2C%20%22id%22%2C%20None)%20for%20msg%20in%20plain_messages%5B-keep_count%3A%5D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20keep_ids.discard(None)%0A%0A%20%20%20%20%20%20%20%20removals%20%3D%20_remove_messages_not_in(messages%2C%20keep_ids)%0A%20%20%20%20%20%20%20%20if%20removals%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20updates%5B%22messages%22%5D%20%3D%20removals%0A%0A%20%20%20%20%20%20%20%20if%20not%20messages_to_summarize%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20updates%0A%0A%20%20%20%20%20%20%20%20existing_summary%20%3D%20state.get(%22conversation_summary%22%2C%20%22%22).strip()%0A%20%20%20%20%20%20%20%20conversation%20%3D%20%22Existing%20summary%3A%5Cn%22%0A%20%20%20%20%20%20%20%20conversation%20%2B%3D%20f%22%7Bexisting_summary%20or%20'(none)'%7D%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20conversation%20%2B%3D%20%22New%20messages%20to%20merge%20into%20the%20summary%3A%5Cn%22%0A%20%20%20%20%20%20%20%20conversation%20%2B%3D%20_format_conversation(messages_to_summarize)%0A%0A%20%20%20%20%20%20%20%20summary_response%20%3D%20llm.invoke(%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%20SystemMessage(content%3Dget_conversation_summary_prompt())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HumanMessage(content%3Dconversation)%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%20%20%20%20%20%20%20%20updates%5B%22conversation_summary%22%5D%20%3D%20summary_response.content.strip()%0A%20%20%20%20%20%20%20%20return%20updates%0A%0A%20%20%20%20def%20rewrite_query(state%3A%20State)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E4%BC%9A%E8%A9%B1%E6%96%87%E8%84%88%E3%82%92%E5%BF%85%E8%A6%81%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E4%BD%BF%E3%81%84%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%92%E6%98%8E%E7%A2%BA%E5%8C%96%E3%81%97%E3%81%A6%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20last_message%20%3D%20state%5B%22messages%22%5D%5B-1%5D%0A%20%20%20%20%20%20%20%20current_query%20%3D%20str(last_message.content).strip()%0A%20%20%20%20%20%20%20%20conversation_summary%20%3D%20state.get(%22conversation_summary%22%2C%20%22%22).strip()%0A%20%20%20%20%20%20%20%20pending_query%20%3D%20state.get(%22pendingQuery%22%2C%20%22%22).strip()%0A%20%20%20%20%20%20%20%20pending_clarifications%20%3D%20state.get(%22pendingClarifications%22%2C%20%5B%5D)%0A%20%20%20%20%20%20%20%20recent_messages%20%3D%20_recent_conversation(state%5B%22messages%22%5D%2C%20pending_query)%0A%0A%20%20%20%20%20%20%20%20context_parts%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20if%20conversation_summary%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20context_parts.append(f%22Conversation%20Summary%3A%5Cn%7Bconversation_summary%7D%22)%0A%20%20%20%20%20%20%20%20if%20recent_messages%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20context_parts.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Recent%20Conversation%3A%5Cn%7B_format_conversation(recent_messages)%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20if%20pending_query%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20clarifications%20%3D%20%5B*pending_clarifications%2C%20current_query%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20clarification_text%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bindex%7D.%20%7Bvalue%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20index%2C%20value%20in%20enumerate(clarifications%2C%20start%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20context_parts.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Unresolved%20User%20Query%3A%5Cn%7Bpending_query%7D%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22User%20Clarifications%3A%5Cn%7Bclarification_text%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20original_query%20%3D%20f%22%7Bpending_query%7D%5CnClarifications%3A%5Cn%7Bclarification_text%7D%22%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20clarifications%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20context_parts.append(f%22User%20Query%3A%5Cn%7Bcurrent_query%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20original_query%20%3D%20current_query%0A%0A%20%20%20%20%20%20%20%20context_section%20%3D%20%22%5Cn%5Cn%22.join(context_parts)%0A%20%20%20%20%20%20%20%20llm_with_structure%20%3D%20llm.with_structured_output(QueryAnalysis)%0A%20%20%20%20%20%20%20%20response%20%3D%20llm_with_structure.invoke(%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%20SystemMessage(content%3Dget_rewrite_query_prompt())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HumanMessage(content%3Dcontext_section)%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%20%20%20%20%20%20%20%20clarification_message_update%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B_name_internal_message(last_message%2C%20%22clarification_response%22)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20pending_query%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%5B%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20if%20response.questions%20and%20response.is_clear%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22questionIsClear%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22originalQuery%22%3A%20original_query%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22pendingQuery%22%3A%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22pendingClarifications%22%3A%20%5B%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22rewrittenQuestions%22%3A%20response.questions%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22messages%22%3A%20clarification_message_update%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20clarification%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20response.clarification_needed%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20response.clarification_needed%0A%20%20%20%20%20%20%20%20%20%20%20%20and%20len(response.clarification_needed.strip())%20%3E%2010%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%22%E8%B3%AA%E5%95%8F%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%80%81%E3%82%82%E3%81%86%E5%B0%91%E3%81%97%E8%A9%B3%E3%81%97%E3%81%84%E6%83%85%E5%A0%B1%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A7%E3%81%99%E3%80%82%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22questionIsClear%22%3A%20False%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22originalQuery%22%3A%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22pendingQuery%22%3A%20pending_query%20or%20current_query%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22pendingClarifications%22%3A%20clarifications%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22rewrittenQuestions%22%3A%20%5B%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22messages%22%3A%20clarification_message_update%0A%20%20%20%20%20%20%20%20%20%20%20%20%2B%20%5BAIMessage(content%3Dclarification%2C%20name%3D%22clarification%22)%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20def%20orchestrator(state%3A%20AgentState)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E6%A4%9C%E7%B4%A2%E3%80%81%E5%8F%96%E5%BE%97%E3%80%81%E5%9B%9E%E7%AD%94%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E5%88%A4%E6%96%AD%E3%81%99%E3%82%8B%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20context_summary%20%3D%20state.get(%22context_summary%22%2C%20%22%22).strip()%0A%20%20%20%20%20%20%20%20sys_msg%20%3D%20SystemMessage(content%3Dget_orchestrator_prompt())%0A%20%20%20%20%20%20%20%20summary_injection%20%3D%20(%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%20HumanMessage(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%3Df%22%5BCOMPRESSED%20CONTEXT%20FROM%20PRIOR%20RESEARCH%5D%5Cn%5Cn%7Bcontext_summary%7D%22%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%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20context_summary%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%5B%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20if%20not%20state.get(%22messages%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20human_msg%20%3D%20HumanMessage(content%3Dstate%5B%22question%22%5D%2C%20name%3D%22agent_question%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20force_search%20%3D%20HumanMessage(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%3D%22YOU%20MUST%20CALL%20'search_child_chunks'%20AS%20THE%20FIRST%20STEP%20TO%20ANSWER%20THIS%20QUESTION.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20llm_with_tools.invoke(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Bsys_msg%5D%20%2B%20summary_injection%20%2B%20%5Bhuman_msg%2C%20force_search%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20_name_internal_message(response%2C%20%22agent_response%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22messages%22%3A%20%5Bhuman_msg%2C%20response%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22tool_call_count%22%3A%20len(response.tool_calls%20or%20%5B%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22iteration_count%22%3A%201%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20response%20%3D%20llm_with_tools.invoke(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5Bsys_msg%5D%20%2B%20summary_injection%20%2B%20state%5B%22messages%22%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20response%20%3D%20_name_internal_message(response%2C%20%22agent_response%22)%0A%20%20%20%20%20%20%20%20tool_calls%20%3D%20response.tool_calls%20if%20hasattr(response%2C%20%22tool_calls%22)%20else%20%5B%5D%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22messages%22%3A%20%5Bresponse%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22tool_call_count%22%3A%20len(tool_calls)%20if%20tool_calls%20else%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22iteration_count%22%3A%201%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20def%20fallback_response(state%3A%20AgentState)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E4%B8%8A%E9%99%90%E5%88%B0%E9%81%94%E6%99%82%E3%81%AB%E3%80%81%E5%8F%96%E5%BE%97%E6%B8%88%E3%81%BF%E3%81%AE%E5%85%A8%E6%83%85%E5%A0%B1%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E6%9C%80%E5%96%84%E3%81%AE%E5%9B%9E%E7%AD%94%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20seen%20%3D%20set()%0A%20%20%20%20%20%20%20%20unique_contents%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20m%20in%20state%5B%22messages%22%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20isinstance(m%2C%20ToolMessage)%20and%20m.content%20not%20in%20seen%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20unique_contents.append(m.content)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20seen.add(m.content)%0A%0A%20%20%20%20%20%20%20%20context_summary%20%3D%20state.get(%22context_summary%22%2C%20%22%22).strip()%0A%0A%20%20%20%20%20%20%20%20context_parts%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20if%20context_summary%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20context_parts.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%23%23%20Compressed%20Research%20Context%20(from%20prior%20iterations)%5Cn%5Cn%7Bcontext_summary%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20if%20unique_contents%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20context_parts.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%23%23%20Retrieved%20Data%20(current%20iteration)%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2B%20%22%5Cn%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22---%20DATA%20SOURCE%20%7Bi%7D%20---%5Cn%7Bcontent%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20i%2C%20content%20in%20enumerate(unique_contents%2C%201)%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%0A%20%20%20%20%20%20%20%20context_text%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%5Cn%5Cn%22.join(context_parts)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20context_parts%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%22No%20data%20was%20retrieved%20from%20the%20documents.%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20prompt_content%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22USER%20QUERY%3A%20%7Bstate.get('question')%7D%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bcontext_text%7D%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22INSTRUCTION%3A%5CnProvide%20the%20best%20possible%20answer%20using%20only%20the%20data%20above.%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20response%20%3D%20llm.invoke(%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%20SystemMessage(content%3Dget_fallback_response_prompt())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HumanMessage(content%3Dprompt_content)%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%20%20%20%20%20%20%20%20response%20%3D%20_name_internal_message(response%2C%20%22agent_response%22)%0A%20%20%20%20%20%20%20%20return%20%7B%22messages%22%3A%20%5Bresponse%5D%7D%0A%0A%20%20%20%20def%20aggregate_answers(state%3A%20State)%3A%0A%20%20%20%20%20%20%20%20messages%20%3D%20state.get(%22messages%22%2C%20%5B%5D)%0A%20%20%20%20%20%20%20%20plain_messages%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20msg%20for%20msg%20in%20messages%20if%20_is_plain_conversation_message(msg)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20keep_ids%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20getattr(msg%2C%20%22id%22%2C%20None)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20msg%20in%20plain_messages%5B-PRE_ANSWER_HISTORY_MESSAGES_TO_KEEP%3A%5D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20keep_ids.discard(None)%0A%20%20%20%20%20%20%20%20removals%20%3D%20_remove_messages_not_in(messages%2C%20keep_ids)%0A%0A%20%20%20%20%20%20%20%20if%20not%20state.get(%22agent_answers%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22messages%22%3A%20removals%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2B%20%5BAIMessage(content%3D%22%E5%9B%9E%E7%AD%94%E3%81%AF%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%22)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20sorted_answers%20%3D%20sorted(%0A%20%20%20%20%20%20%20%20%20%20%20%20state%5B%22agent_answers%22%5D%2C%20key%3Dlambda%20x%3A%20x%5B%22index%22%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20formatted_answers%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20for%20i%2C%20ans%20in%20enumerate(sorted_answers%2C%20start%3D1)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20formatted_answers%20%2B%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%5CnRetrieved%20response%20%7Bi%7D%3A%5Cn%22%20f%22%7Bans%5B'answer'%5D%7D%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20user_message%20%3D%20HumanMessage(%0A%20%20%20%20%20%20%20%20%20%20%20%20content%3Df%22%22%22Original%20user%20question%3A%20%7Bstate%5B%22originalQuery%22%5D%7D%0A%20%20%20%20Retrieved%20answers%3A%7Bformatted_answers%7D%22%22%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20synthesis_response%20%3D%20llm.invoke(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5BSystemMessage(content%3Dget_aggregation_prompt())%2C%20user_message%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22messages%22%3A%20removals%0A%20%20%20%20%20%20%20%20%20%20%20%20%2B%20%5BAIMessage(content%3Dsynthesis_response.content)%5D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20aggregate_answers%2C%0A%20%20%20%20%20%20%20%20fallback_response%2C%0A%20%20%20%20%20%20%20%20orchestrator%2C%0A%20%20%20%20%20%20%20%20rewrite_query%2C%0A%20%20%20%20%20%20%20%20summarize_history%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2011.2%20%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%A9%E3%83%95%3A%20%E6%98%8E%E7%A2%BA%E5%8C%96%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A8%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E5%BE%8C%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%0A%20%20%20%20%60request_clarification%60%20%E3%81%AF%E4%B8%AD%E6%96%AD%E5%B0%82%E7%94%A8%E3%81%AE%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A7%E3%81%99%E3%80%8212.2%20%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%99%82%E3%81%AB%0A%20%20%20%20%60interrupt_before%60%20%E3%81%B8%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%AE%9F%E8%A1%8C%E3%81%AF%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AE%E7%9B%B4%E5%89%8D%E3%81%A7%E6%AD%A2%E3%81%BE%E3%82%8A%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E8%A3%9C%E8%B6%B3%E3%82%92%E5%BE%85%E3%81%A1%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%60route_after_rewrite%60%20%E3%81%AF%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E7%B5%90%E6%9E%9C%E3%81%A7%E5%88%86%E5%B2%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E4%B8%8D%E6%98%8E%E7%9E%AD%E3%81%AA%E3%82%89%20%60request_clarification%60%20%E3%81%B8%E3%80%81%0A%20%20%20%20%E6%98%8E%E7%A2%BA%E3%81%AA%E3%82%89%E9%83%A8%E5%88%86%E8%B3%AA%E5%95%8F%E3%81%94%E3%81%A8%E3%81%AB%20%60Send%60%20%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%60agent%60%20%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E4%B8%A6%E5%88%97%E3%81%AB%E8%B5%B7%E5%8B%95%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_(Literal%2C%20Send%2C%20State)%3A%0A%20%20%20%20def%20request_clarification(state%3A%20State)%3A%0A%20%20%20%20%20%20%20%20%22%22%22human-in-the-loop%20%E3%81%AE%E4%B8%AD%E6%96%AD%E7%94%A8%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC%E3%83%8E%E3%83%BC%E3%83%89%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20return%20%7B%7D%0A%0A%20%20%20%20def%20route_after_rewrite(state%3A%20State)%20-%3E%20Literal%5B%22request_clarification%22%2C%20%22agent%22%5D%3A%0A%20%20%20%20%20%20%20%20if%20not%20state.get(%22questionIsClear%22%2C%20False)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22request_clarification%22%0A%20%20%20%20%20%20%20%20return%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20Send(%22agent%22%2C%20%7B%22question%22%3A%20query%2C%20%22question_index%22%3A%20idx%2C%20%22messages%22%3A%20%5B%5D%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20idx%2C%20query%20in%20enumerate(state%5B%22rewrittenQuestions%22%5D)%0A%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20return%20request_clarification%2C%20route_after_rewrite%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2011.3%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%3A%20route_after_orchestrator_call%0A%0A%20%20%20%20%E7%9B%B4%E5%89%8D%E3%81%AE%E5%BF%9C%E7%AD%94%E3%81%AB%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%8C%E7%84%A1%E3%81%91%E3%82%8C%E3%81%B0%E3%80%81%E5%9B%9E%E7%AD%94%E3%81%8C%E5%87%BA%E6%9D%A5%E4%B8%8A%E3%81%8C%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%BF%E3%81%AA%E3%81%97%E3%81%A6%20%60collect_answer%60%20%E3%81%B8%E9%80%B2%E3%81%BF%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%8C%E3%81%82%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%A7%E3%82%82%E3%80%81%E5%8F%8D%E5%BE%A9%E6%95%B0%E3%81%8C%20%60MAX_ITERATIONS%60%20%E3%81%AB%E9%81%94%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%80%81%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E6%95%B0%E3%81%8C%0A%20%20%20%20%60MAX_TOOL_CALLS%60%20%E3%82%92%E8%B6%85%E3%81%88%E3%81%A6%E3%81%84%E3%82%8C%E3%81%B0%20%60fallback_response%60%20%E3%81%B8%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%80%81%E8%AA%BF%E6%9F%BB%E4%BA%88%E7%AE%97%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E5%AE%9F%E8%A1%8C%E3%82%92%E6%AD%A2%E3%82%81%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_(AgentState%2C%20Literal%2C%20MAX_ITERATIONS%2C%20MAX_TOOL_CALLS)%3A%0A%20%20%20%20def%20route_after_orchestrator_call(%0A%20%20%20%20%20%20%20%20state%3A%20AgentState%2C%0A%20%20%20%20)%20-%3E%20Literal%5B%22tools%22%2C%20%22fallback_response%22%2C%20%22collect_answer%22%5D%3A%0A%20%20%20%20%20%20%20%20iteration%20%3D%20state.get(%22iteration_count%22%2C%200)%0A%20%20%20%20%20%20%20%20tool_count%20%3D%20state.get(%22tool_call_count%22%2C%200)%0A%0A%20%20%20%20%20%20%20%20last_message%20%3D%20state%5B%22messages%22%5D%5B-1%5D%0A%20%20%20%20%20%20%20%20tool_calls%20%3D%20getattr(last_message%2C%20%22tool_calls%22%2C%20None)%20or%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20if%20not%20tool_calls%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22collect_answer%22%0A%0A%20%20%20%20%20%20%20%20%23%20%E6%9C%80%E7%B5%82%E5%9B%9E%E7%AD%94%E3%81%AF%E5%8F%8D%E5%BE%A9%E5%A2%83%E7%95%8C%E3%81%A7%E5%8F%97%E3%81%91%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%8C%E3%80%81%E8%A8%AD%E5%AE%9A%E6%B8%88%E3%81%BF%E3%81%AE%E8%AA%BF%E6%9F%BB%E4%BA%88%E7%AE%97%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%AF%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%20%20%20%20if%20iteration%20%3E%3D%20MAX_ITERATIONS%20or%20tool_count%20%3E%20MAX_TOOL_CALLS%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22fallback_response%22%0A%0A%20%20%20%20%20%20%20%20return%20%22tools%22%0A%0A%20%20%20%20return%20(route_after_orchestrator_call%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2011.4%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%3A%20%E6%A4%9C%E7%B4%A2%E3%82%AD%E3%83%BC%E3%81%AE%E8%BF%BD%E8%B7%A1%E3%81%A8%E5%9C%A7%E7%B8%AE%E3%81%AE%E5%88%A4%E5%AE%9A%0A%0A%20%20%20%20%60_retrieval_contexts%60%20%E3%81%AF%20%60ToolMessage%60%20%E3%81%A0%E3%81%91%E3%82%92%E8%B5%B0%E6%9F%BB%E3%81%97%E3%80%817%20%E7%AB%A0%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%81%8C%E8%BF%94%E3%81%99%E5%A4%B1%E6%95%97%E3%83%9E%E3%83%BC%E3%82%AB%E3%83%BC%0A%20%20%20%20%EF%BC%88%60NO_RELEVANT_CHUNKS%60%E3%80%81%60NO_PARENT_DOCUMENT%60%E3%80%81%60RETRIEVAL_ERROR%3A%60%E3%80%81%60PARENT_RETRIEVAL_ERROR%3A%60%EF%BC%89%E3%81%A7%0A%20%20%20%20%E5%A7%8B%E3%81%BE%E3%82%8B%E7%B5%90%E6%9E%9C%E3%82%92%E9%99%A4%E5%A4%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E5%AD%90%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E6%A4%9C%E7%B4%A2%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%AF%20%60CHILD_CHUNK_SEPARATOR%60%20%E3%81%A7%E5%80%8B%E5%88%A5%E3%81%AE%E6%8A%9C%E7%B2%8B%E3%81%B8%E5%88%86%E8%A7%A3%E3%81%97%E3%80%81%0A%20%20%20%20%E9%87%8D%E8%A4%87%E3%82%92%E5%8F%96%E3%82%8A%E9%99%A4%E3%81%84%E3%81%A6%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%60should_compress_context%60%20%E3%81%AF%E3%83%84%E3%83%BC%E3%83%AB%E5%AE%9F%E8%A1%8C%E3%81%AE%E7%9B%B4%E5%BE%8C%E3%81%AB%E5%8B%95%E3%81%8F%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A7%E3%80%81%60Command%60%20%E3%81%AB%E3%82%88%E3%82%8A%E7%8A%B6%E6%85%8B%E6%9B%B4%E6%96%B0%E3%81%A8%E5%88%86%E5%B2%90%E3%82%92%0A%20%20%20%20%E5%90%8C%E6%99%82%E3%81%AB%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E7%9B%B4%E8%BF%91%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%8B%E3%82%89%20%60parent%3A%3A%3C%E8%A6%AA%20ID%3E%60%20%E3%81%A8%20%60search%3A%3A%3C%E3%82%AF%E3%82%A8%E3%83%AA%3E%60%20%E3%81%AE%E3%82%AD%E3%83%BC%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%97%E3%81%A6%0A%20%20%20%20%60retrieval_keys%60%20%E3%81%AB%E8%B6%B3%E3%81%97%E8%BE%BC%E3%81%BF%E3%80%81%E4%B8%8A%E3%81%AE%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%81%A7%E5%AE%9F%E9%9A%9B%E3%81%AE%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%82%82%E8%93%84%E7%A9%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E5%88%86%E5%B2%90%E3%81%AE%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%E3%81%AF%E5%9B%BA%E5%AE%9A%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%80%81%60BASE_TOKEN_THRESHOLD%60%20%E3%81%AB%E6%97%A2%E5%AD%98%E8%A6%81%E7%B4%84%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%95%B0%20%C3%97%0A%20%20%20%20%60TOKEN_GROWTH_FACTOR%60%20%E3%82%92%E5%8A%A0%E3%81%88%E3%81%9F%E5%8B%95%E7%9A%84%E3%81%AA%E5%80%A4%E3%81%A7%E3%81%99%E3%80%82%E8%B6%85%E3%81%88%E3%81%A6%E3%81%84%E3%82%8C%E3%81%B0%20%60compress_context%60%E3%80%81%0A%20%20%20%20%E3%81%9D%E3%81%86%E3%81%A7%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%20%60orchestrator%60%20%E3%81%B8%E6%88%BB%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_(%0A%20%20%20%20AIMessage%2C%0A%20%20%20%20AgentState%2C%0A%20%20%20%20BASE_TOKEN_THRESHOLD%2C%0A%20%20%20%20CHILD_CHUNK_SEPARATOR%2C%0A%20%20%20%20Command%2C%0A%20%20%20%20HumanMessage%2C%0A%20%20%20%20Literal%2C%0A%20%20%20%20Set%2C%0A%20%20%20%20TOKEN_GROWTH_FACTOR%2C%0A%20%20%20%20ToolMessage%2C%0A%20%20%20%20estimate_context_tokens%2C%0A)%3A%0A%20%20%20%20def%20_retrieval_contexts(messages)%20-%3E%20list%5Bstr%5D%3A%0A%20%20%20%20%20%20%20%20contexts%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20ignored_prefixes%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22NO_RELEVANT_CHUNKS%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22NO_PARENT_DOCUMENT%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22RETRIEVAL_ERROR%3A%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22PARENT_RETRIEVAL_ERROR%3A%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20for%20message%20in%20messages%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20isinstance(message%2C%20ToolMessage)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20content%20%3D%20str(message.content).strip()%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20content%20and%20not%20content.startswith(ignored_prefixes)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20parts%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content.split(CHILD_CHUNK_SEPARATOR)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20message.name%20%3D%3D%20%22search_child_chunks%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%5Bcontent%5D%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%20contexts.extend(part%20for%20part%20in%20parts%20if%20part)%0A%20%20%20%20%20%20%20%20return%20list(dict.fromkeys(contexts))%0A%0A%20%20%20%20def%20should_compress_context(%0A%20%20%20%20%20%20%20%20state%3A%20AgentState%2C%0A%20%20%20%20)%20-%3E%20Command%5BLiteral%5B%22compress_context%22%2C%20%22orchestrator%22%5D%5D%3A%0A%20%20%20%20%20%20%20%20messages%20%3D%20state%5B%22messages%22%5D%0A%0A%20%20%20%20%20%20%20%20new_ids%3A%20Set%5Bstr%5D%20%3D%20set()%0A%20%20%20%20%20%20%20%20for%20msg%20in%20reversed(messages)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20isinstance(msg%2C%20AIMessage)%20and%20getattr(msg%2C%20%22tool_calls%22%2C%20None)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20tc%20in%20msg.tool_calls%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20tc%5B%22name%22%5D%20%3D%3D%20%22retrieve_parent_chunks%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw%20%3D%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%20%20%20%20tc%5B%22args%22%5D.get(%22parent_id%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%20%20%20%20or%20tc%5B%22args%22%5D.get(%22id%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%20%20%20%20or%20tc%5B%22args%22%5D.get(%22ids%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%20%20%20%20or%20%5B%5D%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)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20isinstance(raw%2C%20str)%3A%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%20%20%20%20new_ids.add(f%22parent%3A%3A%7Braw%7D%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%20else%3A%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%20%20%20%20new_ids.update(f%22parent%3A%3A%7Br%7D%22%20for%20r%20in%20raw)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20elif%20tc%5B%22name%22%5D%20%3D%3D%20%22search_child_chunks%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20query%20%3D%20tc%5B%22args%22%5D.get(%22query%22%2C%20%22%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%20if%20query%3A%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%20%20%20%20new_ids.add(f%22search%3A%3A%7Bquery%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20%20%20%20%20updated_ids%20%3D%20state.get(%22retrieval_keys%22%2C%20set())%20%7C%20new_ids%0A%0A%20%20%20%20%20%20%20%20current_token_messages%20%3D%20estimate_context_tokens(messages)%0A%20%20%20%20%20%20%20%20current_token_summary%20%3D%20estimate_context_tokens(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5BHumanMessage(content%3Dstate.get(%22context_summary%22%2C%20%22%22))%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20current_tokens%20%3D%20current_token_messages%20%2B%20current_token_summary%0A%20%20%20%20%20%20%20%20max_allowed%20%3D%20BASE_TOKEN_THRESHOLD%20%2B%20int(%0A%20%20%20%20%20%20%20%20%20%20%20%20current_token_summary%20*%20TOKEN_GROWTH_FACTOR%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20goto%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22compress_context%22%20if%20current_tokens%20%3E%20max_allowed%20else%20%22orchestrator%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20return%20Command(%0A%20%20%20%20%20%20%20%20%20%20%20%20update%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22retrieval_keys%22%3A%20updated_ids%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22retrieved_contexts%22%3A%20_retrieval_contexts(messages)%2C%0A%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%20goto%3Dgoto%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20return%20(should_compress_context%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2011.5%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%3A%20compress_context%0A%0A%20%20%20%20%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E5%B1%A5%E6%AD%B4%E3%82%92%20%60%5BASSISTANT%5D%60%20%2F%20%60%5BTOOL%20RESULT%20%E2%80%94%20%E3%83%84%E3%83%BC%E3%83%AB%E5%90%8D%5D%60%20%E3%81%AE%E5%BD%A2%E3%81%B8%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97%E3%80%81%0A%20%20%20%20%E4%BB%A5%E5%89%8D%E3%81%AE%E8%A6%81%E7%B4%84%E3%81%A8%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%208.5%20%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%201%20%E3%81%A4%E3%81%AE%E8%AA%BF%E6%9F%BB%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%B8%E5%9C%A7%E7%B8%AE%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E3%81%95%E3%82%89%E3%81%AB%20%60retrieval_keys%60%20%E3%81%8B%E3%82%89%E3%80%8C%E5%8F%96%E5%BE%97%E6%B8%88%E3%81%BF%E3%81%AE%E8%A6%AA%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF%E3%80%8D%E3%81%A8%E3%80%8C%E5%AE%9F%E8%A1%8C%E6%B8%88%E3%81%BF%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%82%AF%E3%82%A8%E3%83%AA%E3%80%8D%E3%81%AE%E4%B8%80%E8%A6%A7%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%0A%20%20%20%20**Already%20executed%20(do%20NOT%20repeat)**%20%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%A8%E3%81%97%E3%81%A6%E8%A6%81%E7%B4%84%E6%9C%AB%E5%B0%BE%E3%81%AB%E8%BF%BD%E8%A8%98%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E6%9C%80%E5%BE%8C%E3%81%AB%E3%80%81%E6%9C%80%E5%88%9D%E3%81%AE%E8%B3%AA%E5%95%8F%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E9%99%A4%E3%81%8F%E5%B1%A5%E6%AD%B4%E3%82%92%20%60RemoveMessage%60%20%E3%81%A7%E5%89%8A%E9%99%A4%E3%81%97%E3%81%A6%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E8%A7%A3%E6%94%BE%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_(%0A%20%20%20%20AIMessage%2C%0A%20%20%20%20AgentState%2C%0A%20%20%20%20HumanMessage%2C%0A%20%20%20%20RemoveMessage%2C%0A%20%20%20%20Set%2C%0A%20%20%20%20SystemMessage%2C%0A%20%20%20%20ToolMessage%2C%0A%20%20%20%20llm%2C%0A)%3A%0A%20%20%20%20def%20compress_context(state%3A%20AgentState)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%E6%A4%9C%E7%B4%A2%E5%B1%A5%E6%AD%B4%E3%82%92%E5%BE%8C%E7%B6%9A%E5%8F%8D%E5%BE%A9%E5%90%91%E3%81%91%E3%81%AE%E7%B0%A1%E6%BD%94%E3%81%AA%E8%A6%81%E7%B4%84%E3%81%B8%E5%9C%A7%E7%B8%AE%E3%81%99%E3%82%8B%E3%80%82%22%22%22%0A%20%20%20%20%20%20%20%20messages%20%3D%20state%5B%22messages%22%5D%0A%20%20%20%20%20%20%20%20existing_summary%20%3D%20state.get(%22context_summary%22%2C%20%22%22).strip()%0A%0A%20%20%20%20%20%20%20%20if%20not%20messages%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%7D%0A%0A%20%20%20%20%20%20%20%20conversation_text%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22USER%20QUESTION%3A%5Cn%7Bstate.get('question')%7D%5Cn%5CnConversation%20to%20compress%3A%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20if%20existing_summary%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20conversation_text%20%2B%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%5BPRIOR%20COMPRESSED%20CONTEXT%5D%5Cn%7Bexisting_summary%7D%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20for%20msg%20in%20messages%5B1%3A%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20isinstance(msg%2C%20AIMessage)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tool_calls_info%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20getattr(msg%2C%20%22tool_calls%22%2C%20None)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20calls%20%3D%20%22%2C%20%22.join(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Btc%5B'name'%5D%7D(%7Btc%5B'args'%5D%7D)%22%20for%20tc%20in%20msg.tool_calls%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%20tool_calls_info%20%3D%20f%22%20%7C%20Tool%20calls%3A%20%7Bcalls%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20conversation_text%20%2B%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%5BASSISTANT%7Btool_calls_info%7D%5D%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bmsg.content%20or%20'(tool%20call%20only)'%7D%5Cn%5Cn%22%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%20elif%20isinstance(msg%2C%20ToolMessage)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tool_name%20%3D%20getattr(msg%2C%20%22name%22%2C%20%22tool%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20conversation_text%20%2B%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%5BTOOL%20RESULT%20%E2%80%94%20%7Btool_name%7D%5D%5Cn%7Bmsg.content%7D%5Cn%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20summary_response%20%3D%20llm.invoke(%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%20SystemMessage(content%3Dget_context_compression_prompt())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HumanMessage(content%3Dconversation_text)%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%20%20%20%20%20%20%20%20new_summary%20%3D%20summary_response.content%0A%0A%20%20%20%20%20%20%20%20retrieved_ids%3A%20Set%5Bstr%5D%20%3D%20state.get(%22retrieval_keys%22%2C%20set())%0A%20%20%20%20%20%20%20%20if%20retrieved_ids%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20parent_ids%20%3D%20sorted(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%20for%20r%20in%20retrieved_ids%20if%20r.startswith(%22parent%3A%3A%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20search_queries%20%3D%20sorted(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r.replace(%22search%3A%3A%22%2C%20%22%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20r%20in%20retrieved_ids%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20r.startswith(%22search%3A%3A%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20block%20%3D%20%22%5Cn%5Cn---%5Cn**Already%20executed%20(do%20NOT%20repeat)%3A**%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20parent_ids%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20block%20%2B%3D%20%22Parent%20chunks%20retrieved%3A%5Cn%22%20%2B%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22-%20%7Bp.replace('parent%3A%3A'%2C%20'')%7D%22%20for%20p%20in%20parent_ids%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%20%2B%20%22%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20search_queries%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20block%20%2B%3D%20%22Search%20queries%20already%20run%3A%5Cn%22%20%2B%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22-%20%7Bq%7D%22%20for%20q%20in%20search_queries%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%20%2B%20%22%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%20new_summary%20%2B%3D%20block%0A%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22context_summary%22%3A%20new_summary%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22messages%22%3A%20%5BRemoveMessage(id%3Dm.id)%20for%20m%20in%20messages%5B1%3A%5D%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20return%20(compress_context%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2011.6%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%3A%20collect_answer%0A%0A%20%20%20%20%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E7%B5%82%E7%AB%AF%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A7%E3%81%99%E3%80%82%E6%9C%80%E5%BE%8C%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%8C%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%82%92%E4%BC%B4%E3%82%8F%E3%81%AA%E3%81%84%E5%86%85%E5%AE%B9%E4%BB%98%E3%81%8D%E3%81%AE%0A%20%20%20%20%60AIMessage%60%20%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%80%81%E8%B3%AA%E5%95%8F%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%83%BB%E8%B3%AA%E5%95%8F%E6%96%87%E3%83%BB%E5%9B%9E%E7%AD%94%E3%83%BB%E5%8F%96%E5%BE%97%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%0A%20%20%20%20%60agent_answers%60%20%E3%81%B8%201%20%E4%BB%B6%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%99%E3%80%8211.1%20%E3%81%AE%20%60aggregate_answers%60%20%E3%81%AF%E3%81%93%E3%81%AE%20%60index%60%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E9%A0%86%E5%BA%8F%E3%82%92%E5%BE%A9%E5%85%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_(AIMessage%2C%20AgentState)%3A%0A%20%20%20%20def%20collect_answer(state%3A%20AgentState)%3A%0A%20%20%20%20%20%20%20%20last_message%20%3D%20state%5B%22messages%22%5D%5B-1%5D%0A%20%20%20%20%20%20%20%20is_valid%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20isinstance(last_message%2C%20AIMessage)%0A%20%20%20%20%20%20%20%20%20%20%20%20and%20last_message.content%0A%20%20%20%20%20%20%20%20%20%20%20%20and%20not%20last_message.tool_calls%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20answer%20%3D%20last_message.content%20if%20is_valid%20else%20%22%E5%9B%9E%E7%AD%94%E3%82%92%E7%94%9F%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%22%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22final_answer%22%3A%20answer%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22agent_answers%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22index%22%3A%20state%5B%22question_index%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22question%22%3A%20state%5B%22question%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22answer%22%3A%20answer%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22contexts%22%3A%20state.get(%22retrieved_contexts%22%2C%20%5B%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20return%20(collect_answer%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%2012.%20LangGraph%20%E3%81%AE%E6%A7%8B%E7%AF%89%0A%0A%20%20%20%20LangGraph%20%E3%81%AE%E7%8A%B6%E6%85%8B%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%A7%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E5%86%85%E5%AE%B9%3A**%0A%20%20%20%20-%20%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%95%E3%83%AD%E3%83%BC%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%B8%88%E3%81%BF%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8C%81%E3%81%A4%E9%9A%8E%E5%B1%A4%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95**%EF%BC%8812.1%EF%BC%89%3A%20%E5%80%8B%E3%80%85%E3%81%AE%E9%83%A8%E5%88%86%E8%B3%AA%E5%95%8F%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E6%A4%9C%E7%B4%A2%E3%83%BB%E6%8E%A8%E8%AB%96%E3%80%81%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%9C%A7%E7%B8%AE%E3%80%81%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E5%87%A6%E7%90%86%E3%82%92%E3%83%84%E3%83%BC%E3%83%AB%E3%83%AB%E3%83%BC%E3%83%97%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%0A%20%20%20%20-%20**%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%A9%E3%83%95**%EF%BC%8812.2%EF%BC%89%3A%20%E4%BC%9A%E8%A9%B1%E3%83%95%E3%83%AD%E3%83%BC%E3%80%81%E3%82%AF%E3%82%A8%E3%83%AA%E5%88%86%E6%9E%90%E3%80%81%E4%B8%A6%E5%88%97%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AE%9F%E8%A1%8C%E3%80%81%E5%BF%9C%E7%AD%94%E3%81%AE%E9%9B%86%E7%B4%84%E3%82%92%E7%B5%B1%E5%88%B6%E3%81%99%E3%82%8B%0A%0A%20%20%20%20**human-in-the-loop%3A**%20%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%8C%E6%9B%96%E6%98%A7%E3%81%AA%E5%A0%B4%E5%90%88%E3%80%81%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AF%20%60request_clarification%60%20%E3%81%AE%E5%89%8D%E3%81%A7%E4%B8%AD%E6%96%AD%E3%81%97%E3%80%81%0A%20%20%20%20%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%85%A5%E5%8A%9B%E3%82%92%E5%8F%97%E3%81%91%E3%81%9F%E5%BE%8C%E3%81%AB%20%60rewrite_query%60%20%E3%81%8B%E3%82%89%E5%86%8D%E9%96%8B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E4%B8%BB%E3%81%AA%E8%A8%AD%E8%A8%88%E5%88%A4%E6%96%AD%3A**%0A%20%20%20%20-%20%60should_compress_context%60%20%E3%81%AF%E5%8D%98%E3%81%AA%E3%82%8B%E3%82%A8%E3%83%83%E3%82%B8%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E6%9B%B4%E6%96%B0%E3%81%A8%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%20%60Command%60%20%E3%81%A7%E4%B8%80%E5%BA%A6%E3%81%AB%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%0A%20%20%20%20-%20%60agent_subgraph%60%20%E3%81%AF%E7%8B%AC%E7%AB%8B%E3%81%97%E3%81%A6%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%95%E3%82%8C%E3%80%81%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A8%E3%81%97%E3%81%A6%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BE%E3%82%8C%E3%82%8B%E3%80%82%E3%81%93%E3%82%8C%E3%81%AB%E3%82%88%E3%82%8A%E7%8A%B6%E6%85%8B%E3%82%92%E3%81%8D%E3%82%8C%E3%81%84%E3%81%AB%E5%88%86%E9%9B%A2%E3%81%A7%E3%81%8D%E3%82%8B%0A%20%20%20%20-%20%60InMemorySaver%60%20%E3%81%AE%20checkpointer%20%E3%81%AF%E4%BC%9A%E8%A9%B1%E3%82%BF%E3%83%BC%E3%83%B3%E9%96%93%E3%81%AE%E7%9F%AD%E6%9C%9F%E8%A8%98%E6%86%B6%E3%82%92%E6%8F%90%E4%BE%9B%E3%81%99%E3%82%8B%0A%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%E3%82%B0%E3%83%A9%E3%83%95%E6%A7%8B%E7%AF%89%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%80%81%E7%9F%AD%E6%9C%9F%E8%A8%98%E6%86%B6%E7%94%A8%E3%81%AE%20%60checkpointer%60%20%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%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%3A**%0A%20%20%20%20-%20%5BLangGraph%20StateGraph%5D(https%3A%2F%2Fdocs.langchain.com%2Foss%2Fpython%2Flanggraph%2Fgraph-api%23stategraph)%0A%20%20%20%20-%20%5BLangGraph%20Short-term%20Memory%5D(https%3A%2F%2Fdocs.langchain.com%2Foss%2Fpython%2Flanggraph%2Fadd-memory%23add-short-term-memory)%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%20from%20langgraph.checkpoint.memory%20import%20InMemorySaver%0A%20%20%20%20from%20langgraph.graph%20import%20END%2C%20START%2C%20StateGraph%0A%20%20%20%20from%20langgraph.prebuilt%20import%20ToolNode%0A%0A%20%20%20%20%23%20%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%0A%20%20%20%20checkpointer%20%3D%20InMemorySaver()%0A%20%20%20%20return%20END%2C%20START%2C%20StateGraph%2C%20ToolNode%2C%20checkpointer%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2012.1%20%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E6%A7%8B%E7%AF%89%0A%0A%20%20%20%20%E9%83%A8%E5%88%86%E8%B3%AA%E5%95%8F%201%20%E4%BB%B6%E3%82%92%E6%8B%85%E5%BD%93%E3%81%99%E3%82%8B%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%81%A6%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%83%95%E3%83%AD%E3%83%BC%3A**%0A%20%20%20%201.%20START%20%E2%86%92%20%60orchestrator%60%EF%BC%88%E3%83%84%E3%83%BC%E3%83%AB%E4%BB%98%E3%81%8D%20LLM%EF%BC%89%0A%20%20%20%202.%20%E5%88%86%E5%B2%90%3A%20%E3%83%84%E3%83%BC%E3%83%AB%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%20%E2%86%92%20%60tools%60%20%E2%86%92%20%60should_compress_context%60%20%E2%86%92%20%E5%9C%A7%E7%B8%AE%E3%81%BE%E3%81%9F%E3%81%AF%20%60orchestrator%60%20%E3%81%B8%E6%88%BB%E3%82%8B%0A%20%20%20%203.%20%E5%88%86%E5%B2%90%3A%20%E5%8F%8D%E5%BE%A9%E4%B8%8A%E9%99%90%E3%81%AB%E5%88%B0%E9%81%94%20%E2%86%92%20%60fallback_response%60%20%E2%86%92%20%60collect_answer%60%0A%20%20%20%204.%20%E5%88%86%E5%B2%90%3A%20%E6%9C%80%E7%B5%82%E5%9B%9E%E7%AD%94%E3%81%AE%E6%BA%96%E5%82%99%E5%AE%8C%E4%BA%86%20%E2%86%92%20%60collect_answer%60%20%E2%86%92%20END%0A%0A%20%20%20%20%60should_compress_context%60%20%E3%81%AF%20%60Command%60%20%E3%81%A7%E6%AC%A1%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%89%E3%82%92%E8%BF%94%E3%81%99%E3%81%9F%E3%82%81%E3%80%81%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%82%A8%E3%83%83%E3%82%B8%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%0A%20%20%20%20%E9%80%9A%E5%B8%B8%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A8%E3%81%97%E3%81%A6%E7%99%BB%E9%8C%B2%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E7%82%B9%E3%81%AB%E6%B3%A8%E6%84%8F%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%0A%40app.cell%0Adef%20_(%0A%20%20%20%20AgentState%2C%0A%20%20%20%20END%2C%0A%20%20%20%20START%2C%0A%20%20%20%20StateGraph%2C%0A%20%20%20%20ToolNode%2C%0A%20%20%20%20collect_answer%2C%0A%20%20%20%20compress_context%2C%0A%20%20%20%20fallback_response%2C%0A%20%20%20%20orchestrator%2C%0A%20%20%20%20retrieve_parent_chunks%2C%0A%20%20%20%20route_after_orchestrator_call%2C%0A%20%20%20%20search_child_chunks%2C%0A%20%20%20%20should_compress_context%2C%0A)%3A%0A%20%20%20%20%23%20%E5%80%8B%E5%88%A5%E3%81%AE%E8%B3%AA%E5%95%8F%E3%82%92%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%A7%8B%E7%AF%89%0A%20%20%20%20agent_builder%20%3D%20StateGraph(AgentState)%0A%20%20%20%20agent_builder.add_node(orchestrator)%0A%20%20%20%20agent_builder.add_node(%0A%20%20%20%20%20%20%20%20%22tools%22%2C%20ToolNode(%5Bsearch_child_chunks%2C%20retrieve_parent_chunks%5D)%0A%20%20%20%20)%0A%20%20%20%20agent_builder.add_node(compress_context)%0A%20%20%20%20agent_builder.add_node(fallback_response)%0A%20%20%20%20agent_builder.add_node(should_compress_context)%0A%20%20%20%20agent_builder.add_node(collect_answer)%0A%0A%20%20%20%20agent_builder.add_edge(START%2C%20%22orchestrator%22)%0A%20%20%20%20agent_builder.add_conditional_edges(%0A%20%20%20%20%20%20%20%20%22orchestrator%22%2C%0A%20%20%20%20%20%20%20%20route_after_orchestrator_call%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22tools%22%3A%20%22tools%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22fallback_response%22%3A%20%22fallback_response%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22collect_answer%22%3A%20%22collect_answer%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20)%0A%20%20%20%20agent_builder.add_edge(%22tools%22%2C%20%22should_compress_context%22)%0A%20%20%20%20agent_builder.add_edge(%22compress_context%22%2C%20%22orchestrator%22)%0A%20%20%20%20agent_builder.add_edge(%22fallback_response%22%2C%20%22collect_answer%22)%0A%20%20%20%20agent_builder.add_edge(%22collect_answer%22%2C%20END)%0A%20%20%20%20agent_subgraph%20%3D%20agent_builder.compile()%0A%20%20%20%20return%20(agent_subgraph%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2012.2%20%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E6%A7%8B%E7%AF%89%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%0A%0A%20%20%20%20%E4%BC%9A%E8%A9%B1%E5%85%A8%E4%BD%93%E3%82%92%E7%B5%B1%E5%88%B6%E3%81%99%E3%82%8B%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%80%8112.1%20%E3%81%AE%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%20%60agent%60%20%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A8%E3%81%97%E3%81%A6%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%83%95%E3%83%AD%E3%83%BC%3A**%0A%20%20%20%201.%20START%20%E2%86%92%20%60summarize_history%60%0A%20%20%20%202.%20%60rewrite_query%60%20%E2%80%94%20%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%80%81%E6%A4%9C%E8%A8%BC%E3%81%99%E3%82%8B%0A%20%20%20%203.%20%E5%88%86%E5%B2%90%3A%20%E4%B8%8D%E6%98%8E%E7%9E%AD%20%E2%86%92%20%60request_clarification%60%EF%BC%88%E4%B8%AD%E6%96%AD%EF%BC%89%E2%86%92%20%60rewrite_query%60%20%E3%81%B8%E6%88%BB%E3%82%8B%20%7C%20%E6%98%8E%E7%A2%BA%20%E2%86%92%20%60Send%60%20%E3%81%AB%E3%82%88%E3%82%8A%E4%B8%A6%E5%88%97%20%60agent%60%20%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E7%94%9F%E6%88%90%0A%20%20%20%204.%20%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E5%AE%8C%E4%BA%86%20%E2%86%92%20%60aggregate_answers%60%0A%20%20%20%205.%20END%0A%0A%20%20%20%20%60interrupt_before%3D%5B%22request_clarification%22%5D%60%20%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%8C%E6%9B%96%E6%98%A7%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AF%E3%81%93%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AE%E6%89%8B%E5%89%8D%E3%81%A7%0A%20%20%20%20%E5%AE%9F%E8%A1%8C%E3%81%8C%E6%AD%A2%E3%81%BE%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E8%A3%9C%E8%B6%B3%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B%E3%81%A8%20%60rewrite_query%60%20%E3%81%8B%E3%82%89%E5%86%8D%E9%96%8B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%60checkpointer%60%20%E3%82%92%E6%B8%A1%E3%81%99%E3%81%93%E3%81%A8%E3%81%A7%E3%80%81%E5%90%8C%E3%81%98%20%60thread_id%60%20%E3%81%AE%E4%BC%9A%E8%A9%B1%E3%81%8C%E8%A4%87%E6%95%B0%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AB%E3%81%BE%E3%81%9F%E3%81%8C%E3%81%A3%E3%81%A6%E4%BF%9D%E6%8C%81%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_(%0A%20%20%20%20END%2C%0A%20%20%20%20START%2C%0A%20%20%20%20State%2C%0A%20%20%20%20StateGraph%2C%0A%20%20%20%20agent_subgraph%2C%0A%20%20%20%20aggregate_answers%2C%0A%20%20%20%20checkpointer%2C%0A%20%20%20%20request_clarification%2C%0A%20%20%20%20rewrite_query%2C%0A%20%20%20%20route_after_rewrite%2C%0A%20%20%20%20summarize_history%2C%0A)%3A%0A%20%20%20%20%23%20%E4%BC%9A%E8%A9%B1%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E7%B5%B1%E5%88%B6%E3%81%99%E3%82%8B%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%A7%8B%E7%AF%89%0A%20%20%20%20graph_builder%20%3D%20StateGraph(State)%0A%20%20%20%20graph_builder.add_node(summarize_history)%0A%20%20%20%20graph_builder.add_node(rewrite_query)%0A%20%20%20%20graph_builder.add_node(request_clarification)%0A%20%20%20%20graph_builder.add_node(%22agent%22%2C%20agent_subgraph)%0A%20%20%20%20graph_builder.add_node(aggregate_answers)%0A%0A%20%20%20%20graph_builder.add_edge(START%2C%20%22summarize_history%22)%0A%20%20%20%20graph_builder.add_edge(%22summarize_history%22%2C%20%22rewrite_query%22)%0A%20%20%20%20graph_builder.add_conditional_edges(%22rewrite_query%22%2C%20route_after_rewrite)%0A%20%20%20%20graph_builder.add_edge(%22request_clarification%22%2C%20%22rewrite_query%22)%0A%20%20%20%20graph_builder.add_edge(%5B%22agent%22%5D%2C%20%22aggregate_answers%22)%0A%20%20%20%20graph_builder.add_edge(%22aggregate_answers%22%2C%20END)%0A%0A%20%20%20%20%23%20%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%0A%20%20%20%20agent_graph%20%3D%20graph_builder.compile(%0A%20%20%20%20%20%20%20%20checkpointer%3Dcheckpointer%2C%20interrupt_before%3D%5B%22request_clarification%22%5D%0A%20%20%20%20)%0A%20%20%20%20return%20(agent_graph%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2012.3%20%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E5%8F%AF%E8%A6%96%E5%8C%96%0A%0A%20%20%20%20%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%B8%88%E3%81%BF%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%20Mermaid%20%E5%9B%B3%E3%81%A8%E3%81%97%E3%81%A6%E6%8F%8F%E7%94%BB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%60xray%3DTrue%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%0A%20%20%20%20%60agent%60%20%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AE%E5%86%85%E9%83%A8%EF%BC%88%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%EF%BC%89%E3%81%BE%E3%81%A7%E5%B1%95%E9%96%8B%E3%81%97%E3%81%A6%E7%A2%BA%E8%AA%8D%E3%81%A7%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_(agent_graph%2C%20mo)%3A%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%E2%9C%93%20Agent%20graph%20%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.mermaid(agent_graph.get_graph(xray%3DTrue).draw_mermaid())%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%2012.5%20%E3%82%AA%E3%83%96%E3%82%B6%E3%83%BC%E3%83%90%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%EF%BC%88%E4%BB%BB%E6%84%8F%EF%BC%89%0A%0A%20%20%20%20%5BLangfuse%5D(https%3A%2F%2Flangfuse.com)%20%E3%82%92%E4%BD%BF%E3%81%84%E3%80%81LLM%20%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%80%81%E3%83%84%E3%83%BC%E3%83%AB%E4%BD%BF%E7%94%A8%E3%80%81%E3%82%B0%E3%83%A9%E3%83%95%E5%AE%9F%E8%A1%8C%E3%82%92%E8%BF%BD%E8%B7%A1%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%E6%89%8B%E9%A0%86%E3%81%AF%E4%BB%BB%E6%84%8F%E3%81%A7%E3%81%99%E3%80%82%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%AA%E3%81%8F%E3%81%A6%E3%82%82%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%81%AF%E5%90%8C%E6%A7%98%E3%81%AB%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%0A%20%20%20%20%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E3%81%AF%E8%A8%98%E9%8C%B2%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E5%89%8D%E3%81%AB%E3%80%81%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E5%8C%96%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%0A%20%20%20%20%60project%2F.env.example%60%20%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%97%E3%81%A6%20%60project%2F.env%60%20%E3%81%AB%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%60%60%60bash%0A%20%20%20%20LANGFUSE_ENABLED%3Dtrue%0A%20%20%20%20LANGFUSE_PUBLIC_KEY%3Dpk-lf-...%0A%20%20%20%20LANGFUSE_SECRET_KEY%3Dsk-lf-...%0A%20%20%20%20LANGFUSE_BASE_URL%3Dhttps%3A%2F%2Fcloud.langfuse.com%0A%20%20%20%20%60%60%60%0A%0A%20%20%20%20%E6%A6%82%E5%BF%B5%E7%9A%84%E3%81%AA%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%B3%E3%82%B0%E3%81%AE%E3%82%AC%E3%82%A4%E3%83%89%E3%81%A8%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E6%A6%82%E8%A6%81%E3%81%AF%E3%80%81%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%0A%20%20%20%20%5Bobservability%20notebook%5D(observability.ipynb)%20%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%0A%20%20%20%20%E3%81%BE%E3%81%9A%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%80%81%E6%8E%A5%E7%B6%9A%E7%A2%BA%E8%AA%8D%E7%94%A8%E3%81%AE%E3%83%9C%E3%82%BF%E3%83%B3%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_(mo)%3A%0A%20%20%20%20observability_button%20%3D%20mo.ui.run_button(label%3D%22Langfuse%20%E6%8E%A5%E7%B6%9A%E3%82%92%E7%A2%BA%E8%AA%8D%22)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E6%B8%88%E3%81%BF%E3%81%AE%E5%A0%B4%E5%90%88%E3%81%AE%E3%81%BF%E3%80%81Langfuse%20%E3%81%B8%E3%81%AE%E6%8E%A5%E7%B6%9A%E7%A2%BA%E8%AA%8D%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20observability_button%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%20(observability_button%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2012.5.1%20%E6%8E%A5%E7%B6%9A%E7%A2%BA%E8%AA%8D%E3%81%AE%E5%AE%9F%E8%A1%8C%0A%0A%20%20%20%20%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%8C%E6%8A%BC%E3%81%95%E3%82%8C%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%A0%E3%81%91%20Langfuse%20%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%60auth_check()%60%20%E3%81%A7%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%60LANGFUSE_ENABLED%60%20%E3%81%8C%20%60true%60%20%E3%81%A7%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E6%8E%A5%E7%B6%9A%E3%81%9B%E3%81%9A%E3%80%81%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%B3%E3%82%B0%E3%81%8C%E7%84%A1%E5%8A%B9%E3%81%A7%E3%81%82%E3%82%8B%E6%97%A8%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_(mo%2C%20observability_button%2C%20os)%3A%0A%20%20%20%20mo.stop(%0A%20%20%20%20%20%20%20%20not%20observability_button.value%2C%0A%20%20%20%20%20%20%20%20mo.md(%22Langfuse%20%E6%8E%A5%E7%B6%9A%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%81%AF%E3%81%BE%E3%81%A0%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%22)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20from%20langfuse%20import%20get_client%0A%20%20%20%20from%20langfuse.langchain%20import%20CallbackHandler%0A%0A%20%20%20%20LANGFUSE_ENABLED%20%3D%20os.environ.get(%22LANGFUSE_ENABLED%22%2C%20%22false%22).lower()%20%3D%3D%20%22true%22%0A%20%20%20%20langfuse_handler%20%3D%20None%0A%20%20%20%20langfuse%20%3D%20None%0A%0A%20%20%20%20if%20LANGFUSE_ENABLED%3A%0A%20%20%20%20%20%20%20%20langfuse%20%3D%20get_client()%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20langfuse.auth_check()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%22Langfuse%20%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AF%E8%AA%8D%E8%A8%BC%E6%B8%88%E3%81%BF%E3%81%A7%E3%80%81%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20langfuse_handler%20%3D%20CallbackHandler()%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%22%E8%AA%8D%E8%A8%BC%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%81%A8%E3%83%9B%E3%82%B9%E3%83%88%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%22)%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Langfuse%20%E3%81%AE%E8%AA%8D%E8%A8%BC%E7%A2%BA%E8%AA%8D%E4%B8%AD%E3%81%AB%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%3A%20%7Be%7D%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Langfuse%20%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%B3%E3%82%B0%E3%81%AF%E7%84%A1%E5%8A%B9%E3%81%A7%E3%81%99%E3%80%82%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%20LANGFUSE_ENABLED%3Dtrue%20%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%2013.%20marimo%20%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%0A%0A%20%20%20%20marimo%20%E3%81%AE%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%8B%E3%82%89%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AB%E8%B3%AA%E5%95%8F%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E6%96%87%E6%9B%B8%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%A8%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E4%BD%9C%E6%88%90%E5%BE%8C%E3%81%AB%E3%80%81%0A%20%20%20%20%E8%B3%AA%E5%95%8F%E3%82%92%E9%80%81%E4%BF%A1%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E9%80%81%E4%BF%A1%E6%99%82%E3%81%A0%E3%81%91%20LLM%20%E3%81%A8%E6%A4%9C%E7%B4%A2%E3%83%84%E3%83%BC%E3%83%AB%E3%81%8C%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%0A%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%E4%BC%9A%E8%A9%B1%E3%82%92%E8%AD%98%E5%88%A5%E3%81%99%E3%82%8B%20%60thread_id%60%20%E3%81%A8%E5%86%8D%E5%B8%B0%E4%B8%8A%E9%99%90%E3%82%92%E5%90%AB%E3%82%80%E5%AE%9F%E8%A1%8C%E8%A8%AD%E5%AE%9A%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%8C%2012.2%20%E3%81%AE%20%60checkpointer%60%20%E3%81%A8%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%95%E3%82%8A%E3%80%81%E5%90%8C%E3%81%98%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AE%E4%BC%9A%E8%A9%B1%E5%B1%A5%E6%AD%B4%E3%81%8C%E4%BF%9D%E6%8C%81%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_(uuid)%3A%0A%20%20%20%20def%20create_thread_id()%3A%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22configurable%22%3A%20%7B%22thread_id%22%3A%20str(uuid.uuid4())%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22recursion_limit%22%3A%2050%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20config%20%3D%20create_thread_id()%0A%20%20%20%20return%20(config%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2013.1%20%E8%B3%AA%E5%95%8F%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%0A%0A%20%20%20%20%60form()%60%20%E3%81%A7%E3%83%A9%E3%83%83%E3%83%97%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%9F%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AF%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%9A%E3%80%81%0A%20%20%20%20**%E5%9B%9E%E7%AD%94%E3%82%92%E7%94%9F%E6%88%90**%20%E3%82%92%E6%8A%BC%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E3%81%A0%E3%81%91%E4%B8%8B%E6%B5%81%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%8C%E5%8B%95%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_(mo)%3A%0A%20%20%20%20question_form%20%3D%20mo.ui.text_area(%0A%20%20%20%20%20%20%20%20label%3D%22%E8%B3%AA%E5%95%8F%22%2C%0A%20%20%20%20%20%20%20%20placeholder%3D%22%E6%96%87%E6%9B%B8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%B3%AA%E5%95%8F%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%22%2C%0A%20%20%20%20%20%20%20%20full_width%3DTrue%2C%0A%20%20%20%20).form(%0A%20%20%20%20%20%20%20%20submit_button_label%3D%22%E5%9B%9E%E7%AD%94%E3%82%92%E7%94%9F%E6%88%90%22%2C%0A%20%20%20%20%20%20%20%20clear_on_submit%3DFalse%2C%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%E3%81%93%E3%81%AE%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E3%81%AF%E4%BC%9A%E8%A9%B1%E5%B1%A5%E6%AD%B4%E3%81%8C%E4%BF%9D%E6%8C%81%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E6%96%B0%E3%81%97%E3%81%84%E4%BC%9A%E8%A9%B1%E3%82%92%E5%A7%8B%E3%82%81%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%82%92%E5%86%8D%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22info%22%2C%0A%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%20question_form%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%20(question_form%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%2013.2%20%E5%9B%9E%E7%AD%94%E3%81%AE%E7%94%9F%E6%88%90%0A%0A%20%20%20%20%E9%80%81%E4%BF%A1%E3%81%95%E3%82%8C%E3%81%9F%E8%B3%AA%E5%95%8F%E3%82%92%E3%82%B0%E3%83%A9%E3%83%95%E3%81%B8%E6%B8%A1%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E7%9B%B4%E5%89%8D%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%81%8C%20%60request_clarification%60%20%E3%81%A7%E4%B8%AD%E6%96%AD%E3%81%97%E3%81%A6%E3%81%84%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%0A%20%20%20%20%E6%96%B0%E3%81%97%E3%81%84%E5%85%A5%E5%8A%9B%E3%82%92%20%60update_state%60%20%E3%81%A7%E5%B7%AE%E3%81%97%E8%BE%BC%E3%82%93%E3%81%A7%E4%B8%AD%E6%96%AD%E5%9C%B0%E7%82%B9%E3%81%8B%E3%82%89%E5%86%8D%E9%96%8B%E3%81%97%E3%80%81%E3%81%9D%E3%81%86%E3%81%A7%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E6%96%B0%E3%81%97%E3%81%84%E4%BC%9A%E8%A9%B1%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A8%E3%81%97%E3%81%A6%0A%20%20%20%20%60invoke%60%20%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E6%9C%80%E5%BE%8C%E3%81%AB%E3%80%81%E8%BF%94%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E5%88%97%E3%81%AE%E6%9C%AB%E5%B0%BE%E3%82%92%E5%9B%9E%E7%AD%94%E3%81%A8%E3%81%97%E3%81%A6%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_(HumanMessage%2C%20agent_graph%2C%20config%2C%20mo%2C%20question_form)%3A%0A%20%20%20%20mo.stop(%0A%20%20%20%20%20%20%20%20not%20question_form.value%20or%20not%20question_form.value.strip()%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%E8%B3%AA%E5%95%8F%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%A6%20**%E5%9B%9E%E7%AD%94%E3%82%92%E7%94%9F%E6%88%90**%20%E3%82%92%E6%8A%BC%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%22)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20message%20%3D%20question_form.value.strip()%0A%20%20%20%20current_state%20%3D%20agent_graph.get_state(config)%0A%20%20%20%20if%20current_state.next%3A%0A%20%20%20%20%20%20%20%20agent_graph.update_state(%0A%20%20%20%20%20%20%20%20%20%20%20%20config%2C%20%7B%22messages%22%3A%20%5BHumanMessage(content%3Dmessage)%5D%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20stream_input%20%3D%20None%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20stream_input%20%3D%20%7B%22messages%22%3A%20%5BHumanMessage(content%3Dmessage)%5D%7D%0A%0A%20%20%20%20result%20%3D%20agent_graph.invoke(stream_input%2C%20config%3Dconfig)%0A%20%20%20%20messages%20%3D%20result.get(%22messages%22%2C%20%5B%5D)%0A%20%20%20%20if%20messages%3A%0A%20%20%20%20%20%20%20%20response%20%3D%20str(messages%5B-1%5D.content)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20response%20%3D%20%22%E5%9B%9E%E7%AD%94%E3%82%92%E7%94%9F%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%22%0A%0A%20%20%20%20mo.md(f%22%23%23%20%E5%9B%9E%E7%AD%94%5Cn%5Cn%7Bresponse%7D%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
70906a6787aa3dfca27fb686e7d9f632