864 lines
169 KiB
Plaintext
864 lines
169 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from unstructured.partition.pdf import partition_pdf\n",
|
||
"\n",
|
||
"output_path = \"/home/sepehr/dev/rag/document/\"\n",
|
||
"file_path = \"/home/sepehr/dev/rag/document/04Extrait_Methodologie_Experimentale.pdf\"\n",
|
||
"\n",
|
||
"# Reference: https://docs.unstructured.io/open-source/core-functionality/chunking\n",
|
||
"chunks = partition_pdf(\n",
|
||
" filename=file_path,\n",
|
||
" infer_table_structure=True, # extract tables\n",
|
||
" strategy=\"hi_res\", # mandatory to infer tables\n",
|
||
"\n",
|
||
" extract_image_block_types=[\"Image\"], # Add 'Table' to list to extract image of tables\n",
|
||
" # image_output_dir_path=output_path, # if None, images and tables will saved in base64\n",
|
||
"\n",
|
||
" extract_image_block_to_payload=True, # if true, will extract base64 for API usage\n",
|
||
"\n",
|
||
" chunking_strategy=\"by_title\", # or 'basic'\n",
|
||
" max_characters=1000, # defaults to 500\n",
|
||
" combine_text_under_n_chars=20, # defaults to 0\n",
|
||
" new_after_n_chars=600,\n",
|
||
"\n",
|
||
" # extract_images_in_pdf=True, # deprecated\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{\"<class 'unstructured.documents.elements.CompositeElement'>\",\n",
|
||
" \"<class 'unstructured.documents.elements.Table'>\",\n",
|
||
" \"<class 'unstructured.documents.elements.TableChunk'>\"}"
|
||
]
|
||
},
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"set([str(type(el)) for el in chunks])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"[<unstructured.documents.elements.Title at 0x7f62fd558f20>,\n",
|
||
" <unstructured.documents.elements.Text at 0x7f62fd559a60>,\n",
|
||
" <unstructured.documents.elements.Text at 0x7f62fd559b50>,\n",
|
||
" <unstructured.documents.elements.Text at 0x7f62fd559c10>,\n",
|
||
" <unstructured.documents.elements.Text at 0x7f62fd559d30>,\n",
|
||
" <unstructured.documents.elements.Text at 0x7f62fd559e50>,\n",
|
||
" <unstructured.documents.elements.Text at 0x7f62fd559dc0>,\n",
|
||
" <unstructured.documents.elements.Text at 0x7f62fd559460>,\n",
|
||
" <unstructured.documents.elements.Text at 0x7f62fd559610>,\n",
|
||
" <unstructured.documents.elements.Text at 0x7f62fd559df0>,\n",
|
||
" <unstructured.documents.elements.Text at 0x7f62fd55a030>,\n",
|
||
" <unstructured.documents.elements.NarrativeText at 0x7f62fd1ada90>,\n",
|
||
" <unstructured.documents.elements.Table at 0x7f62fd1ad730>,\n",
|
||
" <unstructured.documents.elements.ListItem at 0x7f62fd1adb80>,\n",
|
||
" <unstructured.documents.elements.NarrativeText at 0x7f62fd1ae1b0>,\n",
|
||
" <unstructured.documents.elements.Image at 0x7f62fd1ae750>,\n",
|
||
" <unstructured.documents.elements.FigureCaption at 0x7f62fd1aec60>,\n",
|
||
" <unstructured.documents.elements.Header at 0x7f62fd1af170>,\n",
|
||
" <unstructured.documents.elements.Text at 0x7f62fd55a630>]"
|
||
]
|
||
},
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"elements = chunks[52].metadata.orig_elements \n",
|
||
"chunks[52].metadata.orig_elements"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'type': 'Image',\n",
|
||
" 'element_id': '147440b6-7a12-4187-b8e8-a7facc373062',\n",
|
||
" 'text': '® © 2 a3 “ cs) E a a c 6 a “a c _ n 3 4 § Concentration en ppm',\n",
|
||
" 'metadata': {'coordinates': {'points': ((440.66661111111114,\n",
|
||
" 919.3324722222222),\n",
|
||
" (440.66661111111114, 1493.9991388888889),\n",
|
||
" (1150.9999166666666, 1493.9991388888889),\n",
|
||
" (1150.9999166666666, 919.3324722222222)),\n",
|
||
" 'system': 'PixelSpace',\n",
|
||
" 'layout_width': 1653,\n",
|
||
" 'layout_height': 2339},\n",
|
||
" 'last_modified': '2025-03-01T09:19:11',\n",
|
||
" 'filetype': 'PPM',\n",
|
||
" 'languages': ['eng'],\n",
|
||
" 'page_number': 14,\n",
|
||
" 'image_base64': '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',\n",
|
||
" 'image_mime_type': 'image/jpeg'}}"
|
||
]
|
||
},
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"chunk_images = [el for el in elements if 'Image' in str(type(el))]\n",
|
||
"chunk_images[0].to_dict()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# separate tables from texts\n",
|
||
"tables = []\n",
|
||
"texts = []\n",
|
||
"\n",
|
||
"for chunk in chunks:\n",
|
||
" if \"Table\" in str(type(chunk)):\n",
|
||
" tables.append(chunk)\n",
|
||
"\n",
|
||
" if \"CompositeElement\" in str(type((chunk))):\n",
|
||
" texts.append(chunk)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Get the images from the CompositeElement objects\n",
|
||
"def get_images_base64(chunks):\n",
|
||
" images_b64 = []\n",
|
||
" for chunk in chunks:\n",
|
||
" if \"CompositeElement\" in str(type(chunk)):\n",
|
||
" chunk_els = chunk.metadata.orig_elements\n",
|
||
" for el in chunk_els:\n",
|
||
" if \"Image\" in str(type(el)):\n",
|
||
" images_b64.append(el.metadata.image_base64)\n",
|
||
" return images_b64\n",
|
||
"\n",
|
||
"images = get_images_base64(chunks)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/jpeg": "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KZ2huv1r6SspGmsbeVzlniVifcivmfxH4dk8a+NNO12CdLaPV3dkicEmPyuuSOucV9AeDNcTxB4Zt72OFolUmHaxycp8uf0oA36KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvPtC/wCS0+Jv+vC3/ma9Brz7Qv8AktPib/rwt/5mgA03/kueuf8AYKg/ma9Brz7Tf+S565/2CoP5mvQaACobi1t7uPy7m3imTOdsiBhn6GpqKAM/+wtI/wCgVY/+A6f4VZtrK1slZbW2hgVjkiJAoJ/Cp6KACmTRLPDJE+drqVOPQjFPooA8q1TQLHQvG/g3SrIOLUefgO2T8w55r0PQtCsvDumLp9gHECuzgO245Y5PNch4t/5Kh4P+sv8AKvQaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoriPiJ8RLDwRpbZdZNRkXEMIPIz0Yj0r5W1Hxn4g1LUJ7yTVLqN5nLlY5WVR9BnigD7grD8QeLtD8MKBquoQ28rxtJHG5wZMelfLPhb4l+KtNifR7W9Eo1CQRmS5y7IW+Xgnp1r1zw/8AA4ysZ/F+pzajcRSK1uUlbCqOSDn3oAd4F+JfiTxt48lS1tAvhxCQxMYLR8cAtXslVLHTLHTUK2VpDbhsbvKQLn64q3QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV57oQz8afE//AF4W/wDM16FXnuhf8lp8Tf8AXhb/AMzQAum/8lz1z/sFQfzNeg159pv/ACXPXP8AsFQfzNeg0AFFFFABRRRQAUUUUAefeLf+SoeD/rL/ACr0GvPvFv8AyVDwf9Zf5V6DQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA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gA03/kueuf8AYKg/ma9Brz7Tf+S565/2CoP5mvQaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArP1rRbHX9MlsL+FZIZFI5HK+49DVu4uIbS3kuLiRY4Yxud2OABXnXiP4h6Xf366FpmsWkIkTdPdtJhRGeoU/3qAPn9ZT4Z+IcmkwXs0Olw34SRGkO0oDzu9eK+wNOks5tPgk08xm0ZcxGIfLt9q8k+J/g7RZfhzFNp81nG6FZBezY3Tgf7Xcmue+B3xDsdNtZ9E1m9aMs2+GWZ/kRQPu0AfQ1fIPxD/5LRf8A/YQT+a19XS65pcGlpqct/Ali+Ns5b5DnpzXyR47v7W8+Ld9e286S2zXyMJVOVIyOc0AfYdv/AMe0X+4P5VJWXout6ZrFsP7OvobnylUP5TZ2nHetSgArz7Qv+S0+Jv8Arwt/5mvQa8+0L/ktPib/AK8Lf+ZoALf/AEL41ancXP7mG50+CKB34EjgnKg9zXoNc14w8Oy63FY3low+36ZMbi1RzhHfGMMfSn6H4tstShWK7kW0v1fyngmOxmcdSoPJHoaAOiooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAiuLeG7t5Le4jWSGQbXRhkEVif8IL4W/6ANj/36FdBRQBn3Oh6XeafHYXNhBLaR42QsuVXHTArP/4QXwt/0AbH/v0K6CigDPl0PS59LTTJbGB7FMbYCvyDHTis/wD4QXwt/wBAGx/79CugooAz9M0PS9GEg02xgtRJ9/ylxurQopCQASTgDqaAFJAGT0rz7w0PtPxY8R6hB+8s5LOGNJ15RmUnIB9RWvrnitCqafoTRX2o3JKRhW3RxnvvI+7V7wn4dj8MaGtgkjSFpGmct2dzkge2aANysDXPB2ka5M15LbJHqQTbFfKuZIiOhX6UUUAc7/wrnWf+h+1z8ko/4VzrP/Q/a5+SUUUAH/CudZ/6H7XPySj/AIVzrP8A0P2ufklFFAB/wrnWf+h+1z8ko/4VzrP/AEP2ufklFFAB/wAK51n/AKH7XPySj/hXOs/9D9rn5JRRQAf8K51n/oftc/JKP+Fc6z/0P2ufklFFAB/wrnWf+h+1z8ko/wCFc6z/AND9rn5JRRQAf8K51n/oftc/JKP+Fc6z/wBD9rn5JRRQAf8ACudZ/wCh+1z8ko/4VzrP/Q/a5+SUUUAH/CudZ/6H7XPySj/hXOs/9D9rn5JRRQAf8K51n/oftc/JKP8AhXOs/wDQ/a5+SUUUAH/CudZ/6H7XPySj/hXOs/8AQ/a5+SUUUAH/AArnWf8Aoftc/JKP+Fc6z/0P2ufklFFAB/wrnWf+h+1z8ko/4VzrP/Q/a5+SUUUAH/CudZ/6H7XPySj/AIVzrP8A0P2ufklFFAB/wrnWf+h+1z8ko/4VzrP/AEP2ufklFFAB/wAK51n/AKH7XPySj/hXOs/9D9rn5JRRQAf8K51n/oftc/JKP+Fc6z/0P2ufklFFAB/wrnWf+h+1z8ko/wCFc6z/AND9rn5JRRQAf8K51n/oftc/JKP+Fc6z/wBD9rn5JRRQAf8ACudZ/wCh+1z8ko/4VzrP/Q/a5+SUUUAH/CudZ/6H7XPySj/hXOs/9D9rn5JRRQAf8K51n/oftc/JKP8AhXOs/wDQ/a5+SUUUAH/CudZ/6H7XPySj/hXOs/8AQ/a5+SUUUAH/AArnWf8Aoftc/JKP+Fc6z/0P2ufklFFAB/wrnWf+h+1z8ko/4VzrP/Q/a5+SUUUAH/CudZ/6H7XPySj/AIVzrP8A0P2ufklFFAB/wrnWf+h+1z8ko/4VzrP/AEP2ufklFFAB/wAK51n/AKH7XPySj/hXOs/9D9rn5JRRQAf8K51n/oftc/JKP+Fc6z/0P2ufklFFAB/wrnWf+h+1z8ko/wCFc6z/AND9rn5JRRQAf8K51n/oftc/JKP+Fc6z/wBD9rn5JRRQAf8ACudZ/wCh+1z8ko/4VzrP/Q/a5+SUUUAH/CudZ/6H7XPySj/hXOs/9D9rn5JRRQAf8K51n/oftc/JKP8AhXOs/wDQ/a5+SUUUAH/CudZ/6H7XPySj/hXOs/8AQ/a5+SUUUAH/AArnWf8Aoftc/JKP+Fc6z/0P2ufklFFAB/wrnWf+h+1z8ko/4VzrP/Q/a5+SUUUAH/CudZ/6H7XPySlHw51fI3+PNbde6kJgj0oooA6nRPC+j+HvMbTLCG3llAEsiDBkPqa16KKAP//Z",
|
||
"text/plain": [
|
||
"<IPython.core.display.Image object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import base64\n",
|
||
"from IPython.display import Image, display\n",
|
||
"\n",
|
||
"def display_base64_image(base64_code):\n",
|
||
" # Decode the base64 string to binary\n",
|
||
" image_data = base64.b64decode(base64_code)\n",
|
||
" # Display the image\n",
|
||
" display(Image(data=image_data))\n",
|
||
"\n",
|
||
"display_base64_image(images[2])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from langchain_core.prompts import ChatPromptTemplate\n",
|
||
"from langchain_ollama.llms import OllamaLLM\n",
|
||
"from langchain_core.output_parsers import StrOutputParser\n",
|
||
"# Prompt\n",
|
||
"prompt_text = \"\"\"\n",
|
||
"You are an assistant tasked with summarizing tables and text.\n",
|
||
"Give a concise summary of the table or text.\n",
|
||
"\n",
|
||
"Respond only with the summary, no additionnal comment.\n",
|
||
"Do not start your message by saying \"Here is a summary\" or anything like that.\n",
|
||
"Just give the summary as it is.\n",
|
||
"\n",
|
||
"Table or text chunk: {element}\n",
|
||
"\n",
|
||
"\"\"\"\n",
|
||
"prompt = ChatPromptTemplate.from_template(prompt_text)\n",
|
||
"\n",
|
||
"model = OllamaLLM(base_url=\"172.20.48.1:11434\",\n",
|
||
" model=\"llama3.1\")\n",
|
||
"summarize_chain = {\"element\": lambda x: x} | prompt | model | StrOutputParser()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"text_summaries = summarize_chain.batch(texts, {\"max_concurrency\": 3})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"['This document outlines the methodology for factorial complete plans of experiments, written by Alain Lamure.',\n",
|
||
" 'The introduction to plans for experimenting with Pex, a strategy of classical experimentation.',\n",
|
||
" 'This is a description of the classical strategy for finding π, involving a single variable x1 and measuring response y for various values of x1 while keeping other variables constant. The experiment involves 7 factors with 5 experimental points per factor, resulting in 57,778,125 possible combinations.',\n",
|
||
" 'Two methods to reduce the number of experiments: decreasing the number of data points or reducing variables. Example: weighing 4 objects on a balance with multiple weighings per object.',\n",
|
||
" 'The table shows the results of experiments with different combinations of measurements (A to D) and responses (mA to mD). Each experiment has a specific outcome (e.g. +1, 0, -1), which is likely related to an error in measurement on a balance scale with uniform error σ.',\n",
|
||
" 'The introduction reviews the concept of probability distributions, specifically the normal distribution, and its characteristics. It also discusses the Theorem of Variances, which relates to the independence of random variables and their variances, along with an example illustrating how to calculate the variance of a sample mean when observations have equal variances.',\n",
|
||
" 'The table defines a function V(x) as 1/n * standard deviation of x.',\n",
|
||
" 'The table/text describes a formula for standard deviation (σ) and the error on a mean value, which is the error on one measurement divided by the square root of the number of measurements.',\n",
|
||
" 'The table describes an experimental strategy with 8 trials, each involving measurements of variables A, B, C, and D. The goal is to understand the effect of errors in measurement on the results, with a focus on estimating the value of constants mA, mB, mC, and mD through multiple iterations.',\n",
|
||
" \"La stratégie PEX consiste en une pesée simultanée de plusieurs objets, répartis de manière à minimiser les erreurs de mesure. Pour 4 objets, il y a 4 manières différentes d'effectuer la pesée, avec des résultats différents pour chaque configuration. Lorsque toutes les mesures sont prises, on peut calculer l'erreur moyenne et déterminer si elle est inférieure à σ/2.\",\n",
|
||
" 'The table appears to be a simple sequence of alternating positive and negative values.',\n",
|
||
" 'This table appears to represent a chemical reaction, listing reactants and products, with their respective formulas.',\n",
|
||
" 'The PEX strategy allows to reduce error to its lowest value.',\n",
|
||
" 'A table with two columns \"FAIBLE\" and \"POSSIBLE\", each containing a single value, accompanied by a brief title \"CONSTRUCTION DES PLANS D\\'EXPERIENCES GENERALITES\".',\n",
|
||
" 'La sélection des facteurs dans une expérience comporte deux étapes : les facteurs principaux et la maîtrise des conditions expérimentales pour minimiser le bruit. Les facteurs qualitatifs ou quantitatifs doivent être définis avec précision, en évitant des niveaux trop rapprochés (pour maintenir la précision) ou trop éloignés (pour prendre en compte les non-linearités).',\n",
|
||
" 'The table presents the reaction time to braking in relation to blood alcohol level and tranquilizer absorption, with two factors interacting: whether the autoradio is on or off, and the number of alcoholic drinks consumed.',\n",
|
||
" 'The table discusses natural variables Ui that vary across different scales, and coded variables Xi derived from natural variables through centering and reduction. An example is given of the function of a paint sprayer, where the response variable \"colour\" depends on two factors: nozzle opening width (factor 1) and pressure (factor 2).',\n",
|
||
" 'The table lists the experimental domain for a study with several factors (U1, U2, X1, X2) and their respective levels. The text describes different types of experimental plans: screening, modeling, and 2k factorial designs, along with a simple example of a first-degree model.',\n",
|
||
" 'The table outlines planning strategies for response surfaces and mixtures, specifically recommending at least three levels per factor for quadratic models, and adapted plans for factors with constraints.',\n",
|
||
" 'The table describes a complete factorial design experiment with two factors: Opening (A) and Pressure (B). The experiment has four points selected by the Plackett-Burman method, including the classic choices M1-M4 and the PEX choices Y1-Y4. Each point is run twice, and the responses are recorded for color (coulour). The domain of the plan not explored is the level combination of A at its minimum (-1) and B at its maximum (+1).',\n",
|
||
" 'The table describes an analytical method for system of 4 equations with 4 unknowns (a0, a1, a2 and a12), where a0 is the mean response at the center of the domain and a1 and a2 represent the effects of factors 1 and 2. The interaction between the two factors is measured by a12, which is calculated as ¼ (y1∼ - y2∼ - y3∼ + y4∼) = 0.',\n",
|
||
" 'A table listing coefficients of a model related to construction and factorial plans for experience designs.',\n",
|
||
" 'The table presents a set of experimental results for a catalyzed chemical reaction. The factors influencing the reaction are temperature (T) and pressure (P). Four experiments were conducted with different combinations of T and P: A (60°C, 1 bar), B (80°C, 1 bar), C (60°C, 2 bar), and D (80°C, 2 bar).',\n",
|
||
" 'The table presents results of two methods: analytical and matrix. The analytical method involves calculating coefficients ai to predict the response variable y∼ based on variables x1, x2 and their interaction x1x2. The model is valid if the predicted values are consistent across different experimental domains (A-D). The matrix method involves representing the relationship between variables as a linear equation: y = Xa, where y is the vector of responses, a is the vector of effects, X is the design matrix and y is the response variable.',\n",
|
||
" 'The table appears to be a list of two items with corresponding weights, item 1 having weight Ws.',\n",
|
||
" 'The table and text describe a dataset of experimental points with coordinates x1 and x2 in columns 2 and 3, respectively. The sum of the products of these coordinates (column 4) is zero, indicating that the columns are orthogonal. Matrices corresponding to this data are orthogonal matrices, where At = A-1.',\n",
|
||
" 'The table presents a relation in mathematics involving variables and constants to solve for unknowns (a0, a1, a2, a12) using matrix methods.',\n",
|
||
" 'The table discusses construction limitations of factorial complete experience plans, specifically experimental difficulties.',\n",
|
||
" 'The table shows experimental data with varying conditions for four different trials (n° essai 1 to 4). Each trial has two points: the mean and temperature \"A\\' to D\\'\" at specific pressures. The data is used to fit a linear relationship between y and x, which is simplified due to linear dependency between columns X2 = 0.8.X1.',\n",
|
||
" 'The table appears to be a mathematical calculation of various numbers, with several arithmetic operations (+, -, ×, /) performed on them, resulting in a final value of 50.72.',\n",
|
||
" 'The table presents a simple arithmetic operation: 0.25 plus 0.0625 equals 0.3125, followed by an empty line and then the number 1, adding up to a total of 9.0 after adding 8.0.',\n",
|
||
" 'The table shows a calculation involving multiplication and addition. Starting with 0.8 times \"a\", then doubling to get 2. Then multiplying by \"a\" again, resulting in an expression of a plus \"a\" times (8/10).',\n",
|
||
" 'This appears to be an arithmetic calculation involving decimal numbers. The result of the operation is 0.2917.',\n",
|
||
" 'The table appears to be a series of mathematical calculations, likely for a mortgage or loan payment schedule. The table lists several rows with dollar amounts and interest rates being added together to calculate a total payment amount.',\n",
|
||
" 'The table appears to be a numerical calculation with several operations (addition, subtraction) and yields a result of 76.85. The equation y∼ = 76.25 + 15.25 x1 + x1^2 represents a linear approximation, replacing curves with a straight line.',\n",
|
||
" \"Four reactions are described: A'' at 60°C and 1.5 bar, B'' at 80°C and 1.5 bar, C'' at 75°C and 1 bar, and D'' at 75°C and 2 bars.\",\n",
|
||
" \"The table describes a statistical experiment with multiple variables (y1, y2, y3, y4) and interactions. However, due to a 0 in the X matrix, it's impossible to calculate the four unknowns. This technique is only suitable for complex problems with many factors when no interactions are assumed beforehand.\",\n",
|
||
" \"An experiment (etude) was conducted to determine the influence of three factors on the stability of an emulsion: acid fat concentration, HCl dilution, and bitumen type. The results show that each factor has a significant effect on the emulsion's stability, with interactions between some factors also being significant.\",\n",
|
||
" 'The table and text describe a linear regression model with four predictor variables (x1, x2, x3) and their interactions. The coefficients for each variable are provided, along with the R-squared value of the model. The equation for the model is: y = 27.25 - x1 - 6x2 - 4x3 - 0.25x1x2 - 0.25x1x3 - 0.25x2x3.',\n",
|
||
" 'The analysis of the plan highlights two important factors: a negative effect from HCl dilution and a better result with bitume type B. The study found no significant interaction between these factors.',\n",
|
||
" \"When experimental points are at the domain's extremes, the effect E is calculated as the average of ±y values. Variance in this case equals the dispersion of measures around the mean, and approximates the random error when systematic error is negligible.\",\n",
|
||
" 'When the error in a measurement (E) is significantly larger than the experimental error (∆E), the effect is influential. When E is much smaller than ∆Ε, the effect has little or no influence. The experimental error can be estimated by performing multiple measurements at the same point and calculating the central value. Normal distribution intervals are ±σ, ±2σ, ±3σ. Experimental data follows a Student t-curve with N degrees of freedom, similar to a normal curve for large sample sizes (N > 30), but more flattened for smaller samples.',\n",
|
||
" \"This appears to be a mathematical equation where 'type donnée par' and 's' are on opposite sides of the equals sign, indicating an unknown variable is being equated with 'type donnée par'.\",\n",
|
||
" 'The table provides critical values for normal and t-distribution probabilities. It lists critical z-values corresponding to various confidence levels (70%, 90%, 95%, 99%) and number of measurements (1-20). The formula provided in the example suggests using a t-distribution with inverse function, specific to a given number of measures and confidence level.',\n",
|
||
" 'The table summarizes experimental plans for factorials and regression models. A mathematical approach is presented to choose between several types of linear regression models, including constant model, one-factor model with interaction, two-factor model with interaction, and a step-by-step verification process (PEX) is proposed to test the selected model.',\n",
|
||
" 'The goal of an experimenter is to minimize the adjustment error (∆ → σ) by repeating experiments near the point of interest, using a polynomial expansion (PEX) in the vicinity of Ui 0. This involves fitting multiple response surfaces to data, represented by equations yˆ i = a0 + a1 x i1 + a2 x i2 + ... + en, where yˆ is the predicted response, â are coefficients, X is the matrix of experimental conditions, and e is the error matrix.',\n",
|
||
" \"The table and text describe a linear regression model, specifically a multilinear regression equation to minimize the sum of squared errors using the method of least squares, yielding coefficients 'â' as Xt(XtX)^-1 Xty where 'y' is the dependent variable, 'x' are independent variables, 'X' is the design matrix, and 't' denotes transpose.\",\n",
|
||
" 'Plans for modeling experience validation through graphical analysis.',\n",
|
||
" \"La table présente des mesures de réponse pour différentes concentrations d'un produit dans une solution, avec deux répétitions pour chaque concentration. Un modèle linéaire est ajusté à ces données en utilisant la régression multilinéaire, donnant la relation y = 52,32 + 76,05 x + e.\",\n",
|
||
" \"La régression linéaire est inadéquate car les résidus sont distribués en arceau, indiquant que la relation entre réponse et concentration suit une courbe plutôt qu'une droite. Une fonction du 2ème degré serait plus appropriée.\",\n",
|
||
" 'The table describes a plan for validating models using graphical analysis and mathematical formulas to calculate coefficients in a second-degree model without interaction.',\n",
|
||
" 'The matrix has been transposed.',\n",
|
||
" 'A table with two datasets containing numbers, followed by information on matrices and mathematical calculations to derive coefficients for a model of the form y∼ = -1.33 + 139.28x – 11.88x^2, concluding that this second-degree model without interaction is valid.',\n",
|
||
" 'The table describes a statistical analysis plan to validate models by measuring the dispersion of experimental responses and determining if variation is induced by significant factors. It outlines how to calculate variance of repeatability for each factor in an experiment with multiple repetitions.',\n",
|
||
" \"The table shows that the total number of terms in Σ2R is estimated from N results. The degrees of freedom ddlR = N - g and the variance of repeatability Vrep = Σ2R/ddlR are calculated for significance testing. In an example, a factor A effect at level i is significant if the observed value (t) exceeds the critical Student's t-value with N-g degrees of freedom and alpha (α) confidence level.\",\n",
|
||
" 'This text explains the use of statistical analysis to validate models, specifically the test of Fisher-Snédécor, which is used to determine if a factor has a significant influence on an outcome. It describes how to calculate and interpret the ratio F (VA/VE) where VA represents the variance of repeatability and VE represents the experimental dispersion.',\n",
|
||
" \"To consider the influence of factor Q as non-significant and to validate the model, F must be less than the critical value F1-α (n1, n2). A critical value at 95% is obtained for α = 0.05 using Excel's INVERSE.LOI function. If F is greater than this value, the a priori chosen model is not valid.\",\n",
|
||
" \"Le coefficient R2 est utilisé pour évaluer le degré d'ajustement d'un modèle en comparant les réponses prédites aux réponses mesurées. Il varie entre 0 (modèle inexistant) et 1 (toutes les réponses expliquées). Un R2 élevé ne signifie pas nécessairement une bonne qualité du modèle, qui dépend également du nombre de résultats et du modèle choisi.\",\n",
|
||
" 'The table represents experimental and predicted response values for various degrees, with adjustments made to account for residuals and variance. The data is from 11 experiments, with 2 coefficients calculated using measured responses. Calculations are also presented for the residual variance (Vp), adjustment variance (Vz), and experimental variance (Vx).',\n",
|
||
" 'The coefficients of determination (R2) for two regression models are given: the first model has a low R2 value (0.9497), while the second model has an extremely high R2 value (0.9987).',\n",
|
||
" 'The table outlines the methodology for experience plans, specifically mentioning surfaces of response by Alain Lamure.',\n",
|
||
" \"Plans composites permettent d'étudier des modèles par étapes, avec une première partie pour valider le modèle du premier degré et des essais supplémentaires si nécessaire pour établir un modèle du deuxième degré. Il existe plusieurs types de plans composés, notamment les plans à faces centrées (centroids) intérieurs ou extérieurs.\",\n",
|
||
" \"Le nombre total d'essais dans un plan composite est la somme des essais du plan factoriel, des essais en étoile et des essais au centre. Le choix de l'emplacement des points en étoile dépend de considérations expérimentales et théoriques. Pour un plan composite à 2 facteurs, le nombre total d'essais est généralement de 12 (4 pour le plan factoriel, 4 pour la partie en étoile et 4 pour les essais au centre).\",\n",
|
||
" 'The table appears to be incomplete, with only two numbers (2 and 3) listed under \"Foctew\" and an unrelated word (\"Facteur\") written above a number (18).',\n",
|
||
" 'The text describes a mathematical model for predicting the response of a system to two or three factors, using polynomial equations of degree 2 with interaction terms. A plan composite à 2 facteurs (composite design at 2 factors) is described, involving 12 experiments and 6 coefficients.',\n",
|
||
" 'This table appears to be a sequence of operations on a number, with alternating additions and subtractions that result in the final value being 1.',\n",
|
||
" 'The table presents a sequence of binary digits (1s and 0s) with specific operators (+, -). The sequence alternates between consecutive values of 1 and 0.',\n",
|
||
" 'This appears to be a binary numeral system table, listing binary numbers and their corresponding decimal equivalents. The table shows the addition of 1 to each number from 0 to 4 in binary.',\n",
|
||
" 'A table or list with 3 rows, containing numbers and symbols, but no discernible pattern or meaning.',\n",
|
||
" 'Binary operation result table, illustrating properties of arithmetic with parameter α.',\n",
|
||
" 'The table shows a mathematical equation with α and 0 (zero) as placeholders, suggesting an algebraic expression with variable values of +2, -12, 0, and +24.',\n",
|
||
" 'A binary sequence of 1s (represented as \"+\") and 0s, totaling 26 digits.',\n",
|
||
" 'A series of numbers with an operation (+) between two specific values (24 and 2).',\n",
|
||
" 'A binary number sequence with alternating 1s and 0s, possibly representing a digital signal or code.',\n",
|
||
" 'The table shows arithmetic operations of 4 and 24, where 2 is added to each in two separate calculations.',\n",
|
||
" 'The table shows the values of a distance parameter α, which determines the possibility of achieving certain optimality criteria based on its value. For α = 4n (where n is an integer), the elements of the information matrix satisfy a specific relation, leading to iso-variance by rotation.',\n",
|
||
" 'The table lists values of α (from 1.078 to 1.943) for achieving quasi-orthogonality in plans 22 to 26nf, with four or more points in a star shape, at different levels of nα (4, 6, 8, 10, 12).',\n",
|
||
" 'The table lists variances of model coefficients for two different optimization criteria: Isovariance and rotation (with almost optimal results), with values ranging from 0.353 to 0.500 times σr, indicating the standard error of predictions is approximately between 35% and 50% of σr.',\n",
|
||
" \"The table describes two methods for calculating the value of yˆp: a criterion of isovariance by rotation and a criterion of almost orthogonality. Both equations calculate d(yˆp) with different coefficients, but only the first method's curves result in equal prediction error as circles for specific plans (2 factors, 4 central points).\",\n",
|
||
" 'The document discusses the application of composite plans in modeling experiences on response surfaces.',\n",
|
||
" \"La surface des pièces métalliques est déterminée par l'épaisseur du métal arraché, qui dépend de deux facteurs : la vitesse d'avancement de l'outil et la vitesse tangentielle de coupe. L'état optimal est une rugosité Ra inférieure à 150.\",\n",
|
||
" 'A table with 5 rows and 2 columns containing numbers (1.21, 1, 0) in a pattern of zeros and ones, possibly indicating speed or velocity readings.',\n",
|
||
" 'A series of numbers with varying decimal points, ranging from 0.73 to 2.40, incrementing by approximately 0.17 each time.',\n",
|
||
" 'The table shows the results of an experiment on surface roughness, with different cutting speeds and advance values. The data includes measurements for each combination, as well as a statistical model that describes the relationship between the variables. The objective is to achieve a surface roughness of less than 0.15 by selecting appropriate cutting speed and advance values.\\n\\nNote: The text appears to be incomplete or unrelated to the table, so it has been ignored in this summary.',\n",
|
||
" 'The text describes the Box-Behnken design, a type of experimental design that allows for sequential experimentation. It explains how to construct a Box-Behnken plan with 3 factors using a cube structure, resulting in points that are equidistant from the center of the domain. The plan involves testing combinations of 2 out of 3 factors at various levels.',\n",
|
||
" 'Box-Behnken plans comportent entre 24+3 (4 facteurs) et 40+6 (5 facteurs) de points expérimentaux. Les plans peuvent être construits en commençant par un plan de 3, 2 ou 4 facteurs.',\n",
|
||
" 'The table presents a design of experiments with 5 factors (Facteur 1 to Facteur 5) and 6 levels for each factor. The experiment is divided into 8 groups, each containing 4-6 observations. The signs ±1 indicate the value assigned to each factor in each group, while 0 indicates no change from a reference or control condition.',\n",
|
||
" 'This table appears to be related to the application of Box-Behnken design plans for modeling and simulation experiences on response surfaces.',\n",
|
||
" \"L'étude vise à diminuer le goût acide des yoghurts en modifiant trois facteurs : taux de dilution, pH et concentration du lait. Un modèle mathématique du 2ème degré a été développé pour prédire les résultats.\",\n",
|
||
" 'The table appears to be a series of pluses (+) followed by 14 instances of the number 1.',\n",
|
||
" 'A binary sequence of 1s and 0s, with a total count of 29 ones and no patterns or notable features.',\n",
|
||
" 'The table appears to be a series of random 0s and +/− 1s, with no discernible pattern or correlation.',\n",
|
||
" 'The table appears to be a binary sequence of 1s and 0s with alternating additions of \"+\". The sequence consists of 22 1s, 8 0s, and several \"+\".',\n",
|
||
" 'A binary sequence of 1s and 0s, alternating between two values. A logical OR operation is implied by the ⇒ symbol, suggesting a relationship between the sequences.',\n",
|
||
" 'The table contains 12 rows with a mix of single and multi-digit numbers, including several instances of the number 8.',\n",
|
||
" 'Le plan de Box-Behnken pour 3 facteurs ne respecte pas certaines propriétés mathématiques, mais en ajoutant des points au centre, le critère de presque orthogonalité est respecté.',\n",
|
||
" 'The table presents the results of a multilinear regression analysis to model the behavior of a system. The equation for the model is: yˆ = 50.1 -0.07x1 -0.11x2 + 0.06x3 + 4.22x1x2- 0.32x1x3 + 2.2x2x3 + 0.07x1^2 –3.6x2^2 –9.1x3^2. The variance of each coefficient is also provided, along with estimates for the standard error (σr) which ranges from approximately 0.35 to 0.58 times σr.',\n",
|
||
" 'The table or text describes a 3D study with 2D cuts of concentration surfaces in a cube. A dilution value of 1 yields an acid enrichment of 51. The isoresponses curves show a maximum response in the (pH x concentration) planes, and a specific model equation for one of these plans is provided.',\n",
|
||
" \"L'obtention maximum de 50 ans d'âge est atteint pour les personnes ayant un enfant ou faisant l'objet d'une mesure de protection.\",\n",
|
||
" 'The table and text describe the relationship between the activity coefficient of an ion (VY) and its concentration, with specific values given for concentrations of 0, 2, and ∂ at pH 5.8, resulting in x2 = -0.63.',\n",
|
||
" 'The table shows the concentration of a substance \"Dilutian\" at pH 2, approximately 2 units. The calculation x3 = -0.06 indicates a significant decrease in concentration under these conditions.',\n",
|
||
" 'The Doehlert plan for two factors (2) generates points in a regular hexagon within the experimental space. The matrix of experiments for two factors with 5 levels for factor 1 and 3 levels for factor 2 is given, allowing the calculation of 7 unknowns and enabling the use of a second-degree model with interactions.',\n",
|
||
" 'Matrix X is a 7x6 matrix representing 7 experiences with 6 coefficients. XtX and (XtX)-1 are 6x6 matrices used for information and dissipation, respectively. The table shows the elements of XtX and their inverses, with most values being zero except for some on or near the main diagonal.',\n",
|
||
" 'The plan for 2 factors respects the isovariance criterion but not orthogonality. Variance of coefficients: σ(â0) = σ(â1) = σ(â2) = 0.58σr, σ(â12) = 1.16σr and σ(â11) = σ(â22) = 1.23σr. Prediction variance function: equal prediction error for points equidistant from the domain center.',\n",
|
||
" 'The table presents a D-optimal design with 15 experiments for 3 factors. The points are spaced regularly in a hexagonal pattern and form an uniform network in the experimental space. Each experiment is described by the values of the three factors (1, 2, ..., 8) along each axis.',\n",
|
||
" 'The Doehlert plan is described for a study with up to 3 factors. For the first factor, values are 23, 32, and 13. The second factor has values approximately equal to 321 and 0.289. The third factor equals 0 in the first 8 experiments.',\n",
|
||
" 'This document appears to be about applying Doehlert plans for modeling experiences on response surfaces.',\n",
|
||
" \"La réaction d'hydrolyse du nitrile ester dépend des concentrations en acide sulfurique (1,5 à 3%), de la quantité d'eau (3 à 6%) et de la température (87,5 à 112,5°C).\",\n",
|
||
" \"This table appears to be the coefficients and constants from a linear regression model for multiple matrices with dimensions (10,10) across various scenarios. The model's coefficients include interactions between variables x1, x2, and x3, as well as a constant term. The last column contains summary statistics or residual values, including some negative numbers, possibly indicating outliers or errors in the model.\",\n",
|
||
" 'The table shows a series of subtractions with decimals, resulting in various values including 33.1 and 67.1. The operations involve subtracting values like 47.0, 0.47, and 23.0 from each other.',\n",
|
||
" \"La table et le texte décrivent une méthode d'analyse canonique utilisant la relation générale y = y0 + kx .ak pour optimiser la réponse. La matrice des coefficients est calculée à partir de valeurs numériques.\",\n",
|
||
" \"The coordinates of the stationary point are derived from a formula involving variable 'A' and result in a value close to 0.179. A distance calculation shows that this point is within the study domain.\",\n",
|
||
" 'The table describes a canonical analysis of response surfaces with the following results:\\n- Stationary point S yields an optimal yield of 81.7%.\\n- Diagonalization of the central matrix and translation to the stationary point S leads to a relation y = 81.7 + ww1 - 94.1w2 - 39.15w3.\\n- Eigenvalues: λ1 = 2.06 (minimum), λ2 = -1.94 (maximum), and λ3 = -15.39 (high maximum).\\n- The response surface varies little along RT1 and RT2, but rapidly changes along RT3.',\n",
|
||
" 'The table appears to be showing a set of calculations involving three variables m1, m2 and m3. A vector equation is also given with coefficients for variables w1, w2 and w3.\\n\\nFrom the text, it seems that there are two optimal points: one at high temperature (110°C) where yˆ has a specific value (81.35), and another point that requires staying near a stationarity point for w2 and w3 while moving away from it for w1 to achieve the highest yield. The variables m1, m2 and m3 are related to axes RT1 and RT3 which seem to be aligned with temperature and acidity percentages respectively.',\n",
|
||
" \"Les plans hybrides visent à approcher deux critères d'optimalité sans les atteindre : presque orthogonalité et isovariance par rotation. Les plans de Roquemore existent uniquement pour 3, 4 ou 6 facteurs et sont notés en fonction du nombre d'expériences (11, 16 ou 28) et d'une lettre (A, B ou C).\",\n",
|
||
" \"Plan de Roquemore 311A : essais répartis dans un carré et un carré décalé, avec des facteurs spécifiques attribués à chaque point. Des essais ont été réalisés aux niveaux -2, 0 et +2 du facteur 3 sur l'axe passant par les centres des deux carrés.\",\n",
|
||
" 'The plan references location 311A at Roquemore, with no additional details provided.',\n",
|
||
" 'The Plan de Roquemore 311A is nearly saturated with 10 coefficients in the model. It respects criteria for isovariance by rotation and almost orthogonality, but fails to meet this criterion for the third factor.',\n",
|
||
" 'The table and text describe a statistical analysis of coefficients and variance predictions from a regression model. The coefficients have standard deviations ranging from 0.25 to 0.31 times the residual standard deviation (σr). The variance prediction function d2(yp) is given as an equation involving x1, x2, and x3, with terms that are symmetric in x1 and x2 but depend on x3.',\n",
|
||
" 'The methodology section outlines the framework for designing and conducting experimental plans.',\n",
|
||
" 'A list of plans for drilling operations, likely authored by Alain Lamure.',\n",
|
||
" \"Le nombre minimal d'expériences nécessaires pour déterminer les coefficients d'un modèle polynomial est égal au degré de liberté du modèle (ddl), qui correspond au nombre de coefficients indépendants.\",\n",
|
||
" 'A linear model with five coefficients (a0 to a4) and four input variables (x1 to x4).',\n",
|
||
" 'The table lists four columns labeled A through D, with each column containing an identical sequence of letters.',\n",
|
||
" 'The table shows two sets of combinations for a \"DDL\" total value. Set one has values 14, with 2 items at level 4 and others at various levels (A-D). Set two also has a total value of 15, but with different item quantities and levels.',\n",
|
||
" 'The condition for two vectors to be orthogonal states that their dot product is equal to zero. Mathematically, this can be expressed as u · v = 0, where u and v are the vectors.',\n",
|
||
" 'The condition for two vectors to be orthogonal states that their dot product must be zero. Mathematically, this can be represented as u · v = 0.',\n",
|
||
" 'The table lists the products of two numbers, where each number is paired with every other number in the set {2, 3, 5, 7}. The pairs are: (2*2), (2*3), (2*5), (2*7), (3*2), (3*3), (3*5), (3*7), (5*2), (5*3), (5*5), (5*7), (7*2), (7*3), (7*5), and (7*7).',\n",
|
||
" 'The table lists pairs of numbers that are equal when multiplied by each other, with asterisk denoting an exception to the rule.',\n",
|
||
" 'The table shows calculations for the Product of Prime Factors and their Combinations (PPCM), listing two sets of prime numbers multiplied together to get a result.',\n",
|
||
" 'The phrase suggests planning in stages, starting from a basic minimum level and progressing to a more comprehensive complete plan.',\n",
|
||
" 'The plan involves 32 attempts.',\n",
|
||
" 'A judicious choice of the number of levels can sometimes reduce the number of experiments. A plan with too many factors (saturated plan) and not enough experiments is not sufficient to test model fit, as it leaves no degrees of freedom. A saturated plan has fewer trials than unknown coefficients, used when there are multiple factors to examine but few are influential.',\n",
|
||
" 'A plan of 24 experiments is proposed to determine 16 unknowns: a constant, main effects and interactions up to order 4. However, due to the often negligible nature of high-order interactions, it can be fractionated into 11 experiments by only retaining those with +1 for each factor combination X1.X2.X3.X4 = +1.',\n",
|
||
" 'The table displays results of various calculations with alternating additions (+) and subtractions (-) of 1, resulting in a consistent pattern after the first two rows.',\n",
|
||
" 'The table represents an orthogonal fractional plan with 24-1 design, consisting of 8 experiments that determine 8 coefficients through the analysis of confusions between main effects and interactions. Each effect of order 1 is confused with an interaction of order 3, while each interaction of order 2 is confused with another interaction of order 2.',\n",
|
||
" 'The table lists 6 plans to estimate coefficients of contrasts, specifically 8 coefficients that can be grouped into 6 pairs.',\n",
|
||
" 'The table breaks down a plan (Plan 23) into two halves and assigns combinations of columns to each half using the letters A13, A14, A23, and A24 in various configurations.',\n",
|
||
" 'The table describes a pattern of relationships between numbers (1, 2, and 3) with positive and negative values. Each number is related to the others through different operations (+ or -), resulting in various combinations of values.',\n",
|
||
" 'The table establishes equivalences between generators of aliases (I) and contrast values, using a notation with addition (+) or subtraction (-) to indicate positive or negative combinations of contrasts. The passage from a group of alias generators (GGA) to contrast values involves writing GGA with signs and then multiplying by the corresponding vector. This results in new contrast values obtained by removing equality signs.',\n",
|
||
" \"The table or text chunk appears to be a mathematical operation involving the manipulation of terms with multiple digits, resulting in a simplified expression for a'1 = a1 - a24 + a345 + a1235. The passage then describes how to apply this operation to a larger equation using vector multiplication.\",\n",
|
||
" 'Plans for fractional experiments called \"2k-p\" using Box-Hunter generators to design and analyze sampling experiences.',\n",
|
||
" 'The table lists \"Plan N. essais Générateurs\", which appears to be a title or header related to experimental plans for generators.',\n",
|
||
" 'The table presents a series of equations with variables and their corresponding resolutions, classified into categories (III, IV, V, VI, VII) based on the number of resolved variables.',\n",
|
||
" 'The table appears to be listing mathematical equations involving inequalities and approximations, with values for \"et\" and \"±\" compared to various sequences of numbers (2.3.4.5, etc.).',\n",
|
||
" 'The table lists numbers with their corresponding plus-minus values, including 9 and 10 which have specific variations.',\n",
|
||
" 'The Box-Hunter table provides a catalog of possibilities for a given number of factors. The resolution of the table is characterized by a plan, which classifies the severity of confusions between main effects and interactions based on their order (II, III, IV or more).',\n",
|
||
" 'The text describes the benefits of using the Box-Hunter approach for experimental design. It highlights that this method allows to estimate the price to pay in order to reduce the number of experiments needed. The resolution of a plan is recommended to be at least IV to calculate the effects of interactions and factors, with a higher resolution (IV) required for factor main effects estimation.',\n",
|
||
" 'Le principal avantage des plans fractionnaires est la réduction significative du nombre d\\'essais, mais il est nécessaire de bien comprendre les \"alias\" pour interpréter ces plans. Les plans fractionnaires sont définis par la projection de points sur les faces d\\'un cube.',\n",
|
||
" 'The table appears to be related to experimental design plans, specifically 2k-p fractional plans based on the theory of contrasts.',\n",
|
||
" \"Le tableau présente les résultats de l'analyse d'un plan expérimental (plan 23-1) pour la stabilité d'une émulsion de bitume. Les facteurs étudiés sont trois, et les résultats montrent que le plan fractionnaire est comparable à celui complet en effectuant des essais en moitié moins de temps.\",\n",
|
||
" 'The table describes a contrast between the main effect of factor 1 and its interaction with factor 3, which are aliased in fractional designs. Main effects can be contaminated by interactions if they are negligible compared to the main effect values.',\n",
|
||
" \"The table outlines an experiment plan (25-2) with 5 influencing factors: temperature, material origin, agitation speed, storage duration and additive nature. It uses a fractional design with 8 experiments and combines interactions with main effects to create contrasts (a'1 and a'2).\",\n",
|
||
" \"The table appears to be an orthogonal array design with 8 rows and 5 columns representing different treatments or factors. The first column represents the factor numbers (1-8), the second column represents the interaction between two factors, the third column represents the interaction between three factors, and so on. The last column represents a contrast code for each treatment combination. Calculations of contrasts (a' values) are also provided with various results.\",\n",
|
||
" \"Les facteurs 2 et 4 ne sont pas influents, tandis que 1, 3 et 5 semblent l'être. Une seconde série d'essais est nécessaire pour lever les ambiguïtés. Les effets de 1, 3 et 5 ont été calculés en les séparant des interactions.\",\n",
|
||
" 'The table shows the results of an experiment with 16 trials, each represented by a combination of numbers (1-5) assigned to factors a1-a35. The colors and values listed correspond to different outcomes for each trial.',\n",
|
||
" \"Contrast calculations: values for coefficients a'' and intercept a0 are provided.\",\n",
|
||
" \"The table shows the calculation of new variables a'' and a''12, based on combinations of original variables a1 to a5. The conclusion drawn from the results is that only two factors have significant influence: reaction temperature (T) and additive nature. Interaction between these two factors is strong, leading to the choice of an additive B with high T and rejection of other factors for economic reasons.\",\n",
|
||
" 'The table presents a method of Taguchi, which is based on a graphical representation of the model to be identified. The factors are grouped into four categories and represented by circles, with some interactions being neglected. The process of creating plans for this method is complex and time-consuming.',\n",
|
||
" 'The text describes the use of Taguchi tables for experimental design. It explains that a specific group classification and level of difficulty in modifying factors corresponds to the frequency of modal changes, from rare (Groupe 2) to very frequent (Rond Plein). The notation used is described with examples.',\n",
|
||
" 'The table associates factors with a model y~ = M + A + B + C + D + interactions AB, BC, AC and AD. Factors are represented by columns: A in column 1, B in column 2, C in column 4, and D in column 7.',\n",
|
||
" \"Les modèles de 2k-p comportent 3 colonnes couplées : L(3), L(5) et L(6). Le tableau des interactions est déduit du triangle d'alias, où les interactions sont représentées par l'intersection de colonnes spécifiques.\",\n",
|
||
" 'The table represents a sequence of numbers and letters, with each row labeled (1) to (6), and the first column showing a series of numbers, while the second column contains combinations of letters.',\n",
|
||
" 'A list of factors corresponding to each column, also known as aliases.',\n",
|
||
" 'A table of experiment numbers corresponding to different matrix values, with some values repeated.',\n",
|
||
" \"The table shows that certain indices (I) are formed by combining values from the set {1.2, 1.4, 2.4, 1.2.4}. A remark notes that in Taguchi's orthogonal matrices for IV resolution plans, factors are systematically assigned to odd-numbered columns.\",\n",
|
||
" 'The table presents two groups of Taguchi tables: \\n- Group 1 with 2 tables (L12 and L36) suitable for finding the extremum effect of factors, with \"diluted\" interactions. \\n- Group 2 with 3 tables (L18, L32 and L50), each allowing to estimate one interaction only.',\n",
|
||
" 'The table lists possible interactions based on the number of levels for each factor, along with corresponding tables and linear graphs, such as a study with 7 factors at 2 levels and 5 interactions. The model includes main effects and interaction terms, with conditions for orthogonality determined by PPMC=16 and degrees of freedom ddl=13.',\n",
|
||
" 'The table consists of a series of numbers with an alternating pattern between two and one, followed by the numbers 42 and 34.5.',\n",
|
||
" 'The table summarizes plans for Taguchi experimentation, specifically a 2k-p plan for analyzing the effectiveness of various factors on a process.',\n",
|
||
" 'A experimental design using the Taguchi method is presented. The results show that factor A has a significant effect on the outcome, with an average response of 31.13 for level 1 and 28.99 for level 2. Factors B and C also have significant effects, while factors D to G have minimal impact. The interaction between factors AB and AC is particularly noteworthy.',\n",
|
||
" 'The table presents two sets of measurements for values B = 1 and B = 2 in columns C and BC, with the latter being higher in both cases.',\n",
|
||
" 'The table and text describe the calculation of interaction effects between two variables (A and B) in a statistical model. The interaction effects are calculated as the difference between the mean response for each combination of A and B levels, minus the main effect of A and the intercept. The results show that certain interactions have significant positive or negative effects on the outcome variable Y.',\n",
|
||
" 'The Simplex method is a progressive experimentation approach that iteratively develops plans based on accumulated results. It starts with an initial structure of k+1 experiences, then evolves by removing the worst-performing point and replacing it with a new one at the opposite end of its axis, while maintaining a regular simplex shape in 2D space.',\n",
|
||
" \"La méthode du Simplex ne nécessite pas de modèle mathématique spécifique, elle est une optimisation ponctuelle séquentielle monotone utilisée pour un seul facteur expliqué. La base est le triangle équilatéral avec des sommets (p,q) dans l'espace à k dimensions.\",\n",
|
||
" 'The table describes the construction of a simplex with its vertices, axes passing through the centroid and first bisection of the triangle. A matrix is provided to summarize the experience generated by this simplex.',\n",
|
||
" 'A sequence of numbers starting from x1, with an unclear pattern or progression.',\n",
|
||
" 'This is a sequence of binary numbers, where each row represents a value from xk-1 to k+1, with a pattern of 0s and qs.',\n",
|
||
" 'A matrix with a line of zeros and values p on the main diagonal and q elsewhere, where p and q can be calculated using the square of the distance between two points, with p=1/(k+1) and q=1/k.',\n",
|
||
" 'A mathematical table or text with values of 2 and unknown variable calculations (p, q) represented by the letter \"k\" in an undefined context.',\n",
|
||
" 'The table shows the values of p and q for different k from 2 to 8, with p values ranging from 0.884 to 0.966 and q values ranging from 0.177 to 0.259.',\n",
|
||
" 'The plans for a progressive construction experience are centered around the central unit of the simplex, with the hub located at its center.',\n",
|
||
" 'The table represents the general experience matrix of a second simplex with k+1 points, where each point has coordinates x1 to xk and an additional coordinate (22k+k)/k.',\n",
|
||
" 'The table describes a matrix of experience for a third simplex with 6 factors. Each row represents a data point, and the values are factor loadings (e.g., x1 to x6). A formula is provided for calculating diagonal elements (pn) and non-diagonal elements (qn) for more than 7 factors using recursion.',\n",
|
||
" 'The table describes a progressive simplex construction method for optimization, involving the replacement of the worst point in each step with its symmetric counterpart relative to the centroid of the remaining points, ensuring regularity and progress towards better solutions.',\n",
|
||
" \"Le simplexe se déplace en appliquant successivement la règle de déplacement, toujours dans l'opposé du point le plus mauvais, pour trouver une région avec valeurs de y meilleures, sous l'hypothèse d'une surface de réponse plane. Les déplacements suivent approximativement des lignes de grande pente en zigzag dans une direction grossièrement constante.\",\n",
|
||
" 'The table/chunk describes the construction of a progressive experience plan in 2 and 3 dimensions, focusing on symmetry and center of gravity calculations for points and lines.',\n",
|
||
" 'The table appears to be a mathematical equation in a programming language, specifically referencing variables from a system called \"BCD\".',\n",
|
||
" 'A general overview of certain aspects or topics.',\n",
|
||
" 'A table with six rows and two columns, showing a sequence of numbers (Xn to 1) and their corresponding operations (+, ≤, ≠).',\n",
|
||
" 'The study evaluates the yield of a process in relation to three variables: temperature (X1), NaOH concentration (X2) and CHCl3 concentration (X3). Four experimental points were considered using simplex methodology. The results show that changing the concentrations affects the yield, with optimal values for X1 at 25°C, X2 at 6.6 mol/l, and X3 at 1.22 mol/l. A matrix is provided showing the experimental conditions and corresponding yields (U1, U2, U3).',\n",
|
||
" 'A table listing numerical values (52.3, 73.8, 83.1, 63.5) followed by a statement about replacing a point with its symmetric coordinates. The new coordinates are given as x1,5 = 15.8, x2,5 = 6.54 and x3,5 = 1.00.',\n",
|
||
" 'A plan for experience sampling construction involves applying a movement rule until an optimum is reached or obstacles arise that require switching to alternative rules. If rule 1 (replacing the worst point with another) creates oscillation, rule 2 is applied, which involves replacing the second-worst point if consecutive applications of rule 1 lead back to a previously abandoned point.',\n",
|
||
" \"In a previous example, since image of A is A after 2 reflections, we must discard point B and substitute it with point C' in the original triangle ABC. Alternatively, if yD < yB < yC and yD >yA, simplexe DBC can be used to eliminate point B instead.\",\n",
|
||
" \"Ce document décrit les plans d'expériences de criblage et leurs conditions d'arrêt. Il met en avant trois règles : \\n- Règle N°3 (règle du vieillissement) qui consiste à refaire une expérience si le même sommet est conservé dans les simplexes successifs.\\n- Une règle selon laquelle un nouveau simplexe doit être envisagé après M itérations, avec M calculé en fonction du nombre de facteurs.\",\n",
|
||
" 'The table lists numbers 2 to 12 with an unknown variable \"k\" at the beginning and a marked \"M\" in between. The text describes reaching optimal results, considering satisfactory optimum or improving it through additional experimentation.',\n",
|
||
" 'To optimize the optimum, reduce the simplex size by half or quarter to conduct a more precise search from the stationary point. The simplex method is useful for quickly finding the zone of interest, but may not consider the actual surface of response.',\n",
|
||
" \"Lorsque l'erreur de mesure gêne le progrès du simplexe, deux nouvelles règles peuvent être ajoutées. La première évite les erreurs de biais en remplaçant les anciennes observations lorsque 2(k + 1) expériences ont été faites. La seconde remplace un sommet qui dépasse une contrainte par un autre sommet choisi selon la règle 2.\",\n",
|
||
" 'A table or text about a chemical reaction optimization study, specifically a one-step synthesis of phenylsulfonyl-3 quinuclidine using benzene sulfonoyl chloride and triethylamine as reagents, with 5 influencing variables (x1-x5) affecting the yield of the product.',\n",
|
||
" 'A table of measurements for a regular simplexe, with temperature (°C) and time (h) data recorded at different positions (X1-X5) over six runs, including the average Rdt value.',\n",
|
||
" 'The table or text appears to outline a plan for progressive construction analysis of the Simplex, focusing on testing and validation experiences.',\n",
|
||
" 'The table shows the returns of a Simplex investment over 9 iterations (N° expériences), with increasing number of experiments leading to higher average returns up to iteration 7, then stabilizing around 67.9%. Iteration 8 has a slight increase in return, but by iteration 9, it returns to the same level as previous iterations.']"
|
||
]
|
||
},
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"text_summaries"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Summarize tables\n",
|
||
"tables_html = [table.metadata.text_as_html for table in tables]\n",
|
||
"table_summaries = summarize_chain.batch(tables_html, {\"max_concurrency\": 3})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"['<table><tr><td>N° essai|</td><td>01 A</td><td>02) | B</td><td>03</td><td>C 04)</td><td>05 |</td><td>06 |</td><td>07</td><td>D | 08</td><td>09}</td><td>10</td><td>F | 11)</td><td>G|E 12/13}</td><td>14)</td><td>15</td><td>y</td></tr><tr><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>35,6</td></tr><tr><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>30,4</td></tr><tr><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>33,5</td></tr><tr><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>39,5</td></tr><tr><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>12,6</td></tr><tr><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>34,5</td></tr><tr><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>26,9</td></tr><tr><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>36,4</td></tr><tr><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>33,5</td></tr><tr><td>10</td><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>23,4</td></tr><tr><td>11</td><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>35,6</td></tr><tr><td>12</td><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>21,5</td></tr><tr><td>13</td><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>26,6</td></tr><tr><td>14</td><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>20,4</td></tr><tr><td>15</td><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>28,4</td></tr><tr><td>16</td><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td>34,5</td></tr></table>',\n",
|
||
" '<table><tr><td>Variables</td><td>| Niveau de base</td><td>Pas</td></tr><tr><td>Xy 1 0,2 X 1 0,2</td></tr><tr><td>X3 15 °C 8 °C X4 1,5 h 0,5 h</td></tr><tr><td>X5</td><td>20 °C</td><td>8 °C</td></tr></table>',\n",
|
||
" '<table><tr><td/><td>utilisation</td><td>formule</td><td>: X,,;</td><td>=2X,,-Xy,</td><td/><td>ou W =</td><td>N° du</td><td>plus</td><td>mauvais</td><td>point</td><td>et</td></tr><tr><td>R</td><td>=N° du</td><td>nouveau</td><td>point</td><td>symétrique</td><td>avec</td><td>X,,</td><td>= >} l=1</td><td>X,, ouk</td><td/><td>=SetlzW.</td><td/></tr><tr><td>N°</td><td>Xi</td><td>X></td><td>X3</td><td>X4</td><td>X;</td><td>X1</td><td>X2</td><td>X3 (°C)|</td><td>X4 ch)</td><td>X5 | CC)</td><td>Rdt</td></tr><tr><td>7</td><td>|-0,584 |</td><td>0,406 |</td><td>0,406 |</td><td>0,406 |</td><td>0,406 |</td><td>0,883 |</td><td>1,081</td><td>| 18,2 |</td><td>1,7</td><td>| 23,2</td><td>58,8</td></tr><tr><td>8</td><td>| 0,094 |</td><td>0,773 |</td><td>0,773 |</td><td>0,773</td><td>| 0,773 |</td><td>1,019 |</td><td>1,155</td><td>| 21,2)</td><td>1,9</td><td>| 26,2</td><td>67,9</td></tr><tr><td>9</td><td>|-0,155 |</td><td>0,795 |</td><td>0,795 |</td><td>0,795 |</td><td>-0,194 |</td><td>0,969 |</td><td>1,159</td><td>| 21,4)</td><td>1,9</td><td>| 18,4</td><td>64,2</td></tr><tr><td>10</td><td>| 0,805 |</td><td>0,750 |</td><td>0,750 |</td><td>0,750</td><td>| 0,072 |</td><td>1,161</td><td>| 1,15</td><td>| 21,0]</td><td>1,9 |</td><td>20,6</td><td>68,0</td></tr><tr><td>11</td><td>| 0,256 |</td><td>1,169 |</td><td>1,179 |</td><td>1,169</td><td>| 0,219 |</td><td>1,051 |</td><td>1,234</td><td>| 16,4 |</td><td>2,1 |</td><td>21,7</td><td>73,4</td></tr><tr><td>12</td><td>| 0,277 |</td><td>0,565 |</td><td>0,876 |</td><td>1,555</td><td>| 0,225 |</td><td>1,055 |</td><td>1,113</td><td>| 22,0 |</td><td>2,3</td><td>| 21,8</td><td>71,5</td></tr><tr><td>13</td><td>| 0,306 |</td><td>1,416 |</td><td>1,144 |</td><td>1,105</td><td>| 0,233 |</td><td>1,061 |</td><td>1,283</td><td>| 24,2 |</td><td>2,1</td><td>| 21,9</td><td>74,3</td></tr><tr><td>14</td><td>| 0,851 |</td><td>1,074 |</td><td>0,694 |</td><td>1,346</td><td>| 0,803 |</td><td>1,170 |</td><td>1,215</td><td>| 20,6 |</td><td>2,2</td><td>| 26,4</td><td>66,8</td></tr></table>']"
|
||
]
|
||
},
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"tables_html"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# import getpass\n",
|
||
"# import os\n",
|
||
"\n",
|
||
"# if not os.getenv(\"DEEPSEEK_API_KEY\"):\n",
|
||
"# os.environ[\"DEEPSEEK_API_KEY\"] = getpass.getpass(\"Enter your DeepSeek API key: \")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from langchain_deepseek import ChatDeepSeek"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"ename": "KeyboardInterrupt",
|
||
"evalue": "",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
||
"\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)",
|
||
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[23]\u001b[39m\u001b[32m, line 25\u001b[39m\n\u001b[32m 21\u001b[39m chain = OllamaLLM(base_url=\u001b[33m\"\u001b[39m\u001b[33m172.20.48.1:11434\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 22\u001b[39m model=\u001b[33m\"\u001b[39m\u001b[33mllama3.2-vision\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 23\u001b[39m \u001b[38;5;66;03m#chain = prompt | ChatOpenAI(model=\"gpt-4o-mini\") | StrOutputParser()\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m25\u001b[39m image_summaries = \u001b[43mchain\u001b[49m\u001b[43m.\u001b[49m\u001b[43mbatch\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimages\u001b[49m\u001b[43m)\u001b[49m\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/langchain_core/language_models/llms.py:438\u001b[39m, in \u001b[36mBaseLLM.batch\u001b[39m\u001b[34m(self, inputs, config, return_exceptions, **kwargs)\u001b[39m\n\u001b[32m 436\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m max_concurrency \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 437\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m438\u001b[39m llm_result = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mgenerate_prompt\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 439\u001b[39m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_convert_input\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 440\u001b[39m \u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[43m=\u001b[49m\u001b[43m[\u001b[49m\u001b[43mc\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mcallbacks\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mc\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 441\u001b[39m \u001b[43m \u001b[49m\u001b[43mtags\u001b[49m\u001b[43m=\u001b[49m\u001b[43m[\u001b[49m\u001b[43mc\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mtags\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mc\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 442\u001b[39m \u001b[43m \u001b[49m\u001b[43mmetadata\u001b[49m\u001b[43m=\u001b[49m\u001b[43m[\u001b[49m\u001b[43mc\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmetadata\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mc\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 443\u001b[39m \u001b[43m \u001b[49m\u001b[43mrun_name\u001b[49m\u001b[43m=\u001b[49m\u001b[43m[\u001b[49m\u001b[43mc\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mrun_name\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mc\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 444\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 445\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 446\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m [g[\u001b[32m0\u001b[39m].text \u001b[38;5;28;01mfor\u001b[39;00m g \u001b[38;5;129;01min\u001b[39;00m llm_result.generations]\n\u001b[32m 447\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/langchain_core/language_models/llms.py:760\u001b[39m, in \u001b[36mBaseLLM.generate_prompt\u001b[39m\u001b[34m(self, prompts, stop, callbacks, **kwargs)\u001b[39m\n\u001b[32m 752\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mgenerate_prompt\u001b[39m(\n\u001b[32m 753\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 754\u001b[39m prompts: \u001b[38;5;28mlist\u001b[39m[PromptValue],\n\u001b[32m (...)\u001b[39m\u001b[32m 757\u001b[39m **kwargs: Any,\n\u001b[32m 758\u001b[39m ) -> LLMResult:\n\u001b[32m 759\u001b[39m prompt_strings = [p.to_string() \u001b[38;5;28;01mfor\u001b[39;00m p \u001b[38;5;129;01min\u001b[39;00m prompts]\n\u001b[32m--> \u001b[39m\u001b[32m760\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mgenerate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprompt_strings\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/langchain_core/language_models/llms.py:963\u001b[39m, in \u001b[36mBaseLLM.generate\u001b[39m\u001b[34m(self, prompts, stop, callbacks, tags, metadata, run_name, run_id, **kwargs)\u001b[39m\n\u001b[32m 948\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (\u001b[38;5;28mself\u001b[39m.cache \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m get_llm_cache() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m.cache \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m:\n\u001b[32m 949\u001b[39m run_managers = [\n\u001b[32m 950\u001b[39m callback_manager.on_llm_start(\n\u001b[32m 951\u001b[39m \u001b[38;5;28mself\u001b[39m._serialized,\n\u001b[32m (...)\u001b[39m\u001b[32m 961\u001b[39m )\n\u001b[32m 962\u001b[39m ]\n\u001b[32m--> \u001b[39m\u001b[32m963\u001b[39m output = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_generate_helper\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 964\u001b[39m \u001b[43m \u001b[49m\u001b[43mprompts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrun_managers\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mbool\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mnew_arg_supported\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\n\u001b[32m 965\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 966\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m output\n\u001b[32m 967\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(missing_prompts) > \u001b[32m0\u001b[39m:\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/langchain_core/language_models/llms.py:784\u001b[39m, in \u001b[36mBaseLLM._generate_helper\u001b[39m\u001b[34m(self, prompts, stop, run_managers, new_arg_supported, **kwargs)\u001b[39m\n\u001b[32m 774\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_generate_helper\u001b[39m(\n\u001b[32m 775\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 776\u001b[39m prompts: \u001b[38;5;28mlist\u001b[39m[\u001b[38;5;28mstr\u001b[39m],\n\u001b[32m (...)\u001b[39m\u001b[32m 780\u001b[39m **kwargs: Any,\n\u001b[32m 781\u001b[39m ) -> LLMResult:\n\u001b[32m 782\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 783\u001b[39m output = (\n\u001b[32m--> \u001b[39m\u001b[32m784\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_generate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 785\u001b[39m \u001b[43m \u001b[49m\u001b[43mprompts\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 786\u001b[39m \u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 787\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# TODO: support multiple run managers\u001b[39;49;00m\n\u001b[32m 788\u001b[39m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrun_managers\u001b[49m\u001b[43m[\u001b[49m\u001b[32;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrun_managers\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 789\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 790\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 791\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m new_arg_supported\n\u001b[32m 792\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mself\u001b[39m._generate(prompts, stop=stop)\n\u001b[32m 793\u001b[39m )\n\u001b[32m 794\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 795\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m run_manager \u001b[38;5;129;01min\u001b[39;00m run_managers:\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/langchain_ollama/llms.py:288\u001b[39m, in \u001b[36mOllamaLLM._generate\u001b[39m\u001b[34m(self, prompts, stop, run_manager, **kwargs)\u001b[39m\n\u001b[32m 286\u001b[39m generations = []\n\u001b[32m 287\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m prompt \u001b[38;5;129;01min\u001b[39;00m prompts:\n\u001b[32m--> \u001b[39m\u001b[32m288\u001b[39m final_chunk = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_stream_with_aggregation\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 289\u001b[39m \u001b[43m \u001b[49m\u001b[43mprompt\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 290\u001b[39m \u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 291\u001b[39m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 292\u001b[39m \u001b[43m \u001b[49m\u001b[43mverbose\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mverbose\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 293\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 294\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 295\u001b[39m generations.append([final_chunk])\n\u001b[32m 296\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m LLMResult(generations=generations)\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/langchain_ollama/llms.py:256\u001b[39m, in \u001b[36mOllamaLLM._stream_with_aggregation\u001b[39m\u001b[34m(self, prompt, stop, run_manager, verbose, **kwargs)\u001b[39m\n\u001b[32m 247\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_stream_with_aggregation\u001b[39m(\n\u001b[32m 248\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 249\u001b[39m prompt: \u001b[38;5;28mstr\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 253\u001b[39m **kwargs: Any,\n\u001b[32m 254\u001b[39m ) -> GenerationChunk:\n\u001b[32m 255\u001b[39m final_chunk = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m256\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mstream_resp\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_create_generate_stream\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprompt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m 257\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43misinstance\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mstream_resp\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mstr\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m 258\u001b[39m \u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mGenerationChunk\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 259\u001b[39m \u001b[43m \u001b[49m\u001b[43mtext\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstream_resp\u001b[49m\u001b[43m[\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mresponse\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mresponse\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mstream_resp\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 260\u001b[39m \u001b[43m \u001b[49m\u001b[43mgeneration_info\u001b[49m\u001b[43m=\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 261\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mdict\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mstream_resp\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mstream_resp\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mdone\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[32m 262\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 263\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/langchain_ollama/llms.py:211\u001b[39m, in \u001b[36mOllamaLLM._create_generate_stream\u001b[39m\u001b[34m(self, prompt, stop, **kwargs)\u001b[39m\n\u001b[32m 205\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_create_generate_stream\u001b[39m(\n\u001b[32m 206\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 207\u001b[39m prompt: \u001b[38;5;28mstr\u001b[39m,\n\u001b[32m 208\u001b[39m stop: Optional[List[\u001b[38;5;28mstr\u001b[39m]] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 209\u001b[39m **kwargs: Any,\n\u001b[32m 210\u001b[39m ) -> Iterator[Union[Mapping[\u001b[38;5;28mstr\u001b[39m, Any], \u001b[38;5;28mstr\u001b[39m]]:\n\u001b[32m--> \u001b[39m\u001b[32m211\u001b[39m \u001b[38;5;28;01myield from\u001b[39;00m \u001b[38;5;28mself\u001b[39m._client.generate(\n\u001b[32m 212\u001b[39m **\u001b[38;5;28mself\u001b[39m._generate_params(prompt, stop=stop, **kwargs)\n\u001b[32m 213\u001b[39m )\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/ollama/_client.py:163\u001b[39m, in \u001b[36mClient._request.<locals>.inner\u001b[39m\u001b[34m()\u001b[39m\n\u001b[32m 162\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34minner\u001b[39m():\n\u001b[32m--> \u001b[39m\u001b[32m163\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_client\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstream\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mas\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mr\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m 164\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mtry\u001b[39;49;00m\u001b[43m:\u001b[49m\n\u001b[32m 165\u001b[39m \u001b[43m \u001b[49m\u001b[43mr\u001b[49m\u001b[43m.\u001b[49m\u001b[43mraise_for_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/contextlib.py:137\u001b[39m, in \u001b[36m_GeneratorContextManager.__enter__\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 135\u001b[39m \u001b[38;5;28;01mdel\u001b[39;00m \u001b[38;5;28mself\u001b[39m.args, \u001b[38;5;28mself\u001b[39m.kwds, \u001b[38;5;28mself\u001b[39m.func\n\u001b[32m 136\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m137\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mgen\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 138\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m:\n\u001b[32m 139\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mgenerator didn\u001b[39m\u001b[33m'\u001b[39m\u001b[33mt yield\u001b[39m\u001b[33m\"\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpx/_client.py:868\u001b[39m, in \u001b[36mClient.stream\u001b[39m\u001b[34m(self, method, url, content, data, files, json, params, headers, cookies, auth, follow_redirects, timeout, extensions)\u001b[39m\n\u001b[32m 845\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 846\u001b[39m \u001b[33;03mAlternative to `httpx.request()` that streams the response body\u001b[39;00m\n\u001b[32m 847\u001b[39m \u001b[33;03minstead of loading it into memory at once.\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 853\u001b[39m \u001b[33;03m[0]: /quickstart#streaming-responses\u001b[39;00m\n\u001b[32m 854\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 855\u001b[39m request = \u001b[38;5;28mself\u001b[39m.build_request(\n\u001b[32m 856\u001b[39m method=method,\n\u001b[32m 857\u001b[39m url=url,\n\u001b[32m (...)\u001b[39m\u001b[32m 866\u001b[39m extensions=extensions,\n\u001b[32m 867\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m868\u001b[39m response = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 869\u001b[39m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 870\u001b[39m \u001b[43m \u001b[49m\u001b[43mauth\u001b[49m\u001b[43m=\u001b[49m\u001b[43mauth\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 871\u001b[39m \u001b[43m \u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 872\u001b[39m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 873\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 874\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 875\u001b[39m \u001b[38;5;28;01myield\u001b[39;00m response\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpx/_client.py:914\u001b[39m, in \u001b[36mClient.send\u001b[39m\u001b[34m(self, request, stream, auth, follow_redirects)\u001b[39m\n\u001b[32m 910\u001b[39m \u001b[38;5;28mself\u001b[39m._set_timeout(request)\n\u001b[32m 912\u001b[39m auth = \u001b[38;5;28mself\u001b[39m._build_request_auth(request, auth)\n\u001b[32m--> \u001b[39m\u001b[32m914\u001b[39m response = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_send_handling_auth\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 915\u001b[39m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 916\u001b[39m \u001b[43m \u001b[49m\u001b[43mauth\u001b[49m\u001b[43m=\u001b[49m\u001b[43mauth\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 917\u001b[39m \u001b[43m \u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 918\u001b[39m \u001b[43m \u001b[49m\u001b[43mhistory\u001b[49m\u001b[43m=\u001b[49m\u001b[43m[\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 919\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 920\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 921\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m stream:\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpx/_client.py:942\u001b[39m, in \u001b[36mClient._send_handling_auth\u001b[39m\u001b[34m(self, request, auth, follow_redirects, history)\u001b[39m\n\u001b[32m 939\u001b[39m request = \u001b[38;5;28mnext\u001b[39m(auth_flow)\n\u001b[32m 941\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m942\u001b[39m response = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_send_handling_redirects\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 943\u001b[39m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 944\u001b[39m \u001b[43m \u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 945\u001b[39m \u001b[43m \u001b[49m\u001b[43mhistory\u001b[49m\u001b[43m=\u001b[49m\u001b[43mhistory\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 946\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 947\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 948\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpx/_client.py:979\u001b[39m, in \u001b[36mClient._send_handling_redirects\u001b[39m\u001b[34m(self, request, follow_redirects, history)\u001b[39m\n\u001b[32m 976\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m hook \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m._event_hooks[\u001b[33m\"\u001b[39m\u001b[33mrequest\u001b[39m\u001b[33m\"\u001b[39m]:\n\u001b[32m 977\u001b[39m hook(request)\n\u001b[32m--> \u001b[39m\u001b[32m979\u001b[39m response = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_send_single_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 980\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 981\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m hook \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m._event_hooks[\u001b[33m\"\u001b[39m\u001b[33mresponse\u001b[39m\u001b[33m\"\u001b[39m]:\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpx/_client.py:1014\u001b[39m, in \u001b[36mClient._send_single_request\u001b[39m\u001b[34m(self, request)\u001b[39m\n\u001b[32m 1009\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[32m 1010\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mAttempted to send an async request with a sync Client instance.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 1011\u001b[39m )\n\u001b[32m 1013\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m request_context(request=request):\n\u001b[32m-> \u001b[39m\u001b[32m1014\u001b[39m response = \u001b[43mtransport\u001b[49m\u001b[43m.\u001b[49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1016\u001b[39m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(response.stream, SyncByteStream)\n\u001b[32m 1018\u001b[39m response.request = request\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpx/_transports/default.py:250\u001b[39m, in \u001b[36mHTTPTransport.handle_request\u001b[39m\u001b[34m(self, request)\u001b[39m\n\u001b[32m 237\u001b[39m req = httpcore.Request(\n\u001b[32m 238\u001b[39m method=request.method,\n\u001b[32m 239\u001b[39m url=httpcore.URL(\n\u001b[32m (...)\u001b[39m\u001b[32m 247\u001b[39m extensions=request.extensions,\n\u001b[32m 248\u001b[39m )\n\u001b[32m 249\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m map_httpcore_exceptions():\n\u001b[32m--> \u001b[39m\u001b[32m250\u001b[39m resp = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_pool\u001b[49m\u001b[43m.\u001b[49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mreq\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 252\u001b[39m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(resp.stream, typing.Iterable)\n\u001b[32m 254\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m Response(\n\u001b[32m 255\u001b[39m status_code=resp.status,\n\u001b[32m 256\u001b[39m headers=resp.headers,\n\u001b[32m 257\u001b[39m stream=ResponseStream(resp.stream),\n\u001b[32m 258\u001b[39m extensions=resp.extensions,\n\u001b[32m 259\u001b[39m )\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py:256\u001b[39m, in \u001b[36mConnectionPool.handle_request\u001b[39m\u001b[34m(self, request)\u001b[39m\n\u001b[32m 253\u001b[39m closing = \u001b[38;5;28mself\u001b[39m._assign_requests_to_connections()\n\u001b[32m 255\u001b[39m \u001b[38;5;28mself\u001b[39m._close_connections(closing)\n\u001b[32m--> \u001b[39m\u001b[32m256\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m exc \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 258\u001b[39m \u001b[38;5;66;03m# Return the response. Note that in this case we still have to manage\u001b[39;00m\n\u001b[32m 259\u001b[39m \u001b[38;5;66;03m# the point at which the response is closed.\u001b[39;00m\n\u001b[32m 260\u001b[39m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(response.stream, typing.Iterable)\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py:236\u001b[39m, in \u001b[36mConnectionPool.handle_request\u001b[39m\u001b[34m(self, request)\u001b[39m\n\u001b[32m 232\u001b[39m connection = pool_request.wait_for_connection(timeout=timeout)\n\u001b[32m 234\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 235\u001b[39m \u001b[38;5;66;03m# Send the request on the assigned connection.\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m236\u001b[39m response = \u001b[43mconnection\u001b[49m\u001b[43m.\u001b[49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 237\u001b[39m \u001b[43m \u001b[49m\u001b[43mpool_request\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrequest\u001b[49m\n\u001b[32m 238\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 239\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m ConnectionNotAvailable:\n\u001b[32m 240\u001b[39m \u001b[38;5;66;03m# In some cases a connection may initially be available to\u001b[39;00m\n\u001b[32m 241\u001b[39m \u001b[38;5;66;03m# handle a request, but then become unavailable.\u001b[39;00m\n\u001b[32m 242\u001b[39m \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[32m 243\u001b[39m \u001b[38;5;66;03m# In this case we clear the connection and try again.\u001b[39;00m\n\u001b[32m 244\u001b[39m pool_request.clear_connection()\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpcore/_sync/connection.py:103\u001b[39m, in \u001b[36mHTTPConnection.handle_request\u001b[39m\u001b[34m(self, request)\u001b[39m\n\u001b[32m 100\u001b[39m \u001b[38;5;28mself\u001b[39m._connect_failed = \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[32m 101\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m exc\n\u001b[32m--> \u001b[39m\u001b[32m103\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_connection\u001b[49m\u001b[43m.\u001b[49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:136\u001b[39m, in \u001b[36mHTTP11Connection.handle_request\u001b[39m\u001b[34m(self, request)\u001b[39m\n\u001b[32m 134\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m Trace(\u001b[33m\"\u001b[39m\u001b[33mresponse_closed\u001b[39m\u001b[33m\"\u001b[39m, logger, request) \u001b[38;5;28;01mas\u001b[39;00m trace:\n\u001b[32m 135\u001b[39m \u001b[38;5;28mself\u001b[39m._response_closed()\n\u001b[32m--> \u001b[39m\u001b[32m136\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m exc\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:106\u001b[39m, in \u001b[36mHTTP11Connection.handle_request\u001b[39m\u001b[34m(self, request)\u001b[39m\n\u001b[32m 95\u001b[39m \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[32m 97\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m Trace(\n\u001b[32m 98\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mreceive_response_headers\u001b[39m\u001b[33m\"\u001b[39m, logger, request, kwargs\n\u001b[32m 99\u001b[39m ) \u001b[38;5;28;01mas\u001b[39;00m trace:\n\u001b[32m 100\u001b[39m (\n\u001b[32m 101\u001b[39m http_version,\n\u001b[32m 102\u001b[39m status,\n\u001b[32m 103\u001b[39m reason_phrase,\n\u001b[32m 104\u001b[39m headers,\n\u001b[32m 105\u001b[39m trailing_data,\n\u001b[32m--> \u001b[39m\u001b[32m106\u001b[39m ) = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_receive_response_headers\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 107\u001b[39m trace.return_value = (\n\u001b[32m 108\u001b[39m http_version,\n\u001b[32m 109\u001b[39m status,\n\u001b[32m 110\u001b[39m reason_phrase,\n\u001b[32m 111\u001b[39m headers,\n\u001b[32m 112\u001b[39m )\n\u001b[32m 114\u001b[39m network_stream = \u001b[38;5;28mself\u001b[39m._network_stream\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:177\u001b[39m, in \u001b[36mHTTP11Connection._receive_response_headers\u001b[39m\u001b[34m(self, request)\u001b[39m\n\u001b[32m 174\u001b[39m timeout = timeouts.get(\u001b[33m\"\u001b[39m\u001b[33mread\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 176\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m177\u001b[39m event = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_receive_event\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 178\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(event, h11.Response):\n\u001b[32m 179\u001b[39m \u001b[38;5;28;01mbreak\u001b[39;00m\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:217\u001b[39m, in \u001b[36mHTTP11Connection._receive_event\u001b[39m\u001b[34m(self, timeout)\u001b[39m\n\u001b[32m 214\u001b[39m event = \u001b[38;5;28mself\u001b[39m._h11_state.next_event()\n\u001b[32m 216\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m event \u001b[38;5;129;01mis\u001b[39;00m h11.NEED_DATA:\n\u001b[32m--> \u001b[39m\u001b[32m217\u001b[39m data = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_network_stream\u001b[49m\u001b[43m.\u001b[49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 218\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mREAD_NUM_BYTES\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout\u001b[49m\n\u001b[32m 219\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 221\u001b[39m \u001b[38;5;66;03m# If we feed this case through h11 we'll raise an exception like:\u001b[39;00m\n\u001b[32m 222\u001b[39m \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[32m 223\u001b[39m \u001b[38;5;66;03m# httpcore.RemoteProtocolError: can't handle event type\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 227\u001b[39m \u001b[38;5;66;03m# perspective. Instead we handle this case distinctly and treat\u001b[39;00m\n\u001b[32m 228\u001b[39m \u001b[38;5;66;03m# it as a ConnectError.\u001b[39;00m\n\u001b[32m 229\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m data == \u001b[33mb\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m._h11_state.their_state == h11.SEND_RESPONSE:\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/httpcore/_backends/sync.py:128\u001b[39m, in \u001b[36mSyncStream.read\u001b[39m\u001b[34m(self, max_bytes, timeout)\u001b[39m\n\u001b[32m 126\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m map_exceptions(exc_map):\n\u001b[32m 127\u001b[39m \u001b[38;5;28mself\u001b[39m._sock.settimeout(timeout)\n\u001b[32m--> \u001b[39m\u001b[32m128\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sock\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrecv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmax_bytes\u001b[49m\u001b[43m)\u001b[49m\n",
|
||
"\u001b[31mKeyboardInterrupt\u001b[39m: "
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import os\n",
|
||
"os.environ[\"OPENAI_API_KEY\"] = \"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\"\n",
|
||
"from langchain_openai import ChatOpenAI\n",
|
||
"prompt_template = \"\"\"Describe the image in detail. For context,\n",
|
||
" the image is part of a outlines the methodology for factorial complete plans of experimentss.\"\"\"\n",
|
||
"messages = [\n",
|
||
" (\n",
|
||
" \"user\",\n",
|
||
" [\n",
|
||
" {\"type\": \"text\", \"text\": prompt_template},\n",
|
||
" {\n",
|
||
" \"type\": \"image_url\",\n",
|
||
" \"image_url\": {\"url\": \"data:image/jpeg;base64,{image}\"},\n",
|
||
" },\n",
|
||
" ],\n",
|
||
" )\n",
|
||
"]\n",
|
||
"\n",
|
||
"prompt = ChatPromptTemplate.from_messages(messages)\n",
|
||
"\n",
|
||
"chain = OllamaLLM(base_url=\"172.20.48.1:11434\",\n",
|
||
" model=\"llama3.2-vision\")\n",
|
||
"#chain = prompt | ChatOpenAI(model=\"gpt-4o-mini\") | StrOutputParser()\n",
|
||
"\n",
|
||
"image_summaries = chain.batch(images)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"ename": "TypeError",
|
||
"evalue": "Qdrant.__init__() got an unexpected keyword argument 'url'",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
||
"\u001b[31mTypeError\u001b[39m Traceback (most recent call last)",
|
||
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[28]\u001b[39m\u001b[32m, line 12\u001b[39m\n\u001b[32m 8\u001b[39m embeddings = OllamaEmbeddings(base_url=\u001b[33m\"\u001b[39m\u001b[33m172.20.48.1:11434\u001b[39m\u001b[33m\"\u001b[39m,model=\u001b[33m\"\u001b[39m\u001b[33mmxbai-embed-large\u001b[39m\u001b[33m\"\u001b[39m) \u001b[38;5;66;03m# Spécifiez le modèle Ollama à utiliser\u001b[39;00m\n\u001b[32m 10\u001b[39m \u001b[38;5;66;03m# Initialize Qdrant vector store\u001b[39;00m\n\u001b[32m 11\u001b[39m \u001b[38;5;66;03m# Option 1: Local instance (using local storage)\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m12\u001b[39m vectorstore = \u001b[43mQdrant\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 13\u001b[39m \u001b[43m \u001b[49m\u001b[43mcollection_name\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmulti_modal_rag\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 14\u001b[39m \u001b[43m \u001b[49m\u001b[43membedding_function\u001b[49m\u001b[43m=\u001b[49m\u001b[43membeddings\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 15\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mhttp://172.20.48.1:6333\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Utilisez 'location' pour spécifier l'URL de Qdrant\u001b[39;49;00m\n\u001b[32m 16\u001b[39m \u001b[43m)\u001b[49m\n",
|
||
"\u001b[36mFile \u001b[39m\u001b[32m~/dev/rag/.venv/lib/python3.12/site-packages/langchain_core/_api/deprecation.py:214\u001b[39m, in \u001b[36mdeprecated.<locals>.deprecate.<locals>.finalize.<locals>.warn_if_direct_instance\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m 212\u001b[39m warned = \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[32m 213\u001b[39m emit_warning()\n\u001b[32m--> \u001b[39m\u001b[32m214\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mwrapped\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
|
||
"\u001b[31mTypeError\u001b[39m: Qdrant.__init__() got an unexpected keyword argument 'url'"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from langchain_qdrant import QdrantVectorStore\n",
|
||
"from langchain.storage import InMemoryStore\n",
|
||
"from langchain.schema.document import Document\n",
|
||
"from langchain_ollama import OllamaEmbeddings\n",
|
||
"from langchain.retrievers.multi_vector import MultiVectorRetriever\n",
|
||
"\n",
|
||
"# Create embedding function\n",
|
||
"embeddings = OllamaEmbeddings(base_url=\"172.20.48.1:11434\",model=\"mxbai-embed-large\") # Spécifiez le modèle Ollama à utiliser\n",
|
||
"\n",
|
||
"# Initialize Qdrant vector store\n",
|
||
"# Option 1: Local instance (using local storage)\n",
|
||
"vectorstore = QdrantVectorStore(\n",
|
||
" collection_name=\"multi_modal_rag\",\n",
|
||
" embedding_function=embeddings,\n",
|
||
" url=\"http://172.20.48.1:6333\" # Utilisez 'location' pour spécifier l'URL de Qdrant\n",
|
||
")\n",
|
||
"vectorstore = QdrantVectorStore.from_documents(\n",
|
||
" docs,\n",
|
||
" embeddings,\n",
|
||
" url=\"http://172.20.48.1:6333\",\n",
|
||
" collection_name=\"my_documents\",\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import uuid\n",
|
||
"from langchain.vectorstores import Chroma\n",
|
||
"from langchain.storage import InMemoryStore\n",
|
||
"from langchain.schema.document import Document\n",
|
||
"from langchain.embeddings import OpenAIEmbeddings\n",
|
||
"from langchain.retrievers.multi_vector import MultiVectorRetriever\n",
|
||
"\n",
|
||
"# The vectorstore to use to index the child chunks\n",
|
||
"vectorstore = Chroma(collection_name=\"multi_modal_rag\", embedding_function=OpenAIEmbeddings())\n",
|
||
"\n",
|
||
"# The storage layer for the parent documents\n",
|
||
"store = InMemoryStore()\n",
|
||
"id_key = \"doc_id\"\n",
|
||
"\n",
|
||
"# The retriever (empty to start)\n",
|
||
"retriever = MultiVectorRetriever(\n",
|
||
" vectorstore=vectorstore,\n",
|
||
" docstore=store,\n",
|
||
" id_key=id_key,\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import uuid\n",
|
||
"from langchain.vectorstores import Chroma\n",
|
||
"from langchain.storage import InMemoryStore\n",
|
||
"from langchain.schema.document import Document\n",
|
||
"from langchain.embeddings import OpenAIEmbeddings\n",
|
||
"from langchain.retrievers.multi_vector import MultiVectorRetriever\n",
|
||
"\n",
|
||
"# The vectorstore to use to index the child chunks\n",
|
||
"vectorstore = Chroma(collection_name=\"multi_modal_rag\", embedding_function=OpenAIEmbeddings())\n",
|
||
"\n",
|
||
"# The storage layer for the parent documents\n",
|
||
"store = InMemoryStore()\n",
|
||
"id_key = \"doc_id\"\n",
|
||
"\n",
|
||
"# The retriever (empty to start)\n",
|
||
"retriever = MultiVectorRetriever(\n",
|
||
" vectorstore=vectorstore,\n",
|
||
" docstore=store,\n",
|
||
" id_key=id_key,\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import uuid\n",
|
||
"from langchain.vectorstores import Chroma\n",
|
||
"from langchain.storage import InMemoryStore\n",
|
||
"from langchain.schema.document import Document\n",
|
||
"from langchain.embeddings import OpenAIEmbeddings\n",
|
||
"from langchain.retrievers.multi_vector import MultiVectorRetriever\n",
|
||
"\n",
|
||
"# The vectorstore to use to index the child chunks\n",
|
||
"vectorstore = Chroma(collection_name=\"multi_modal_rag\", embedding_function=OpenAIEmbeddings())\n",
|
||
"\n",
|
||
"# The storage layer for the parent documents\n",
|
||
"store = InMemoryStore()\n",
|
||
"id_key = \"doc_id\"\n",
|
||
"\n",
|
||
"# The retriever (empty to start)\n",
|
||
"retriever = MultiVectorRetriever(\n",
|
||
" vectorstore=vectorstore,\n",
|
||
" docstore=store,\n",
|
||
" id_key=id_key,\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"content=\"Hello! I'm based on OpenAI's GPT-3 model. How can I assist you today?\" additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 21, 'prompt_tokens': 14, 'total_tokens': 35, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_06737a9306', 'finish_reason': 'stop', 'logprobs': None} id='run-087ad4ec-bf03-4d7e-a89d-70f578ba7a66-0' usage_metadata={'input_tokens': 14, 'output_tokens': 21, 'total_tokens': 35, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import subprocess\n",
|
||
"windows_host = \"172.20.48.1\"\n",
|
||
"\n",
|
||
"# Connect to Ollama using the Windows host IP\n",
|
||
"model = OllamaLLM(\n",
|
||
" base_url=f\"http://{windows_host}:11434\",\n",
|
||
" model=\"llama3.1\"\n",
|
||
")\n",
|
||
"modelOp= ChatOpenAI(model=\"gpt-4o-mini\") \n",
|
||
"# Test the connection\n",
|
||
"response = modelOp.invoke(\"Hello, which model are you?\")\n",
|
||
"print(response)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"AIMessage(content=\"Hi! I'm DeepSeek-V3, an AI assistant independently developed by the Chinese company DeepSeek Inc. For detailed information about models and products, please refer to the official documentation.\", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 39, 'prompt_tokens': 10, 'total_tokens': 49, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 10}, 'model_name': 'deepseek-chat', 'system_fingerprint': 'fp_3a5770e1b4_prod0225', 'finish_reason': 'stop', 'logprobs': None}, id='run-22af53f2-32e7-440e-8ba2-18a6622e8e6f-0', usage_metadata={'input_tokens': 10, 'output_tokens': 39, 'total_tokens': 49, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}})"
|
||
]
|
||
},
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"llm = ChatDeepSeek(\n",
|
||
" model=\"deepseek-chat\",\n",
|
||
")\n",
|
||
"llm.invoke(\"Hello, which model are you?\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": ".venv",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.12.3"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|