From a852793660637971c02f89857b9c6de8852d787a Mon Sep 17 00:00:00 2001 From: Rin_0xTohsaka <89101179+Tachikoma000@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:00:13 -0500 Subject: [PATCH 1/4] feat: Add document loaders and implement PDF loader - Implement PdfLoader struct in src/document_loaders/pdf.rs - Add PdfLoader to document_loaders module - Implement DocumentLoader trait for PdfLoader - Use lopdf crate for PDF parsing - Add error handling for file operations and PDF parsing - Update Cargo.toml with lopdf dependency - Add unit tests for PdfLoader - Update documentation with PdfLoader usage examples --- Cargo.lock | 407 +++++++++++++++++- rig-core/Cargo.toml | 13 +- rig-core/examples/document_loaders.rs | 89 ++++ .../sample_data/moores_law_for_everything.pdf | Bin 0 -> 411067 bytes rig-core/src/document_loaders/csv.rs | 65 +++ rig-core/src/document_loaders/mod.rs | 26 ++ rig-core/src/document_loaders/pdf.rs | 38 ++ rig-core/src/embeddings.rs | 45 +- rig-core/src/lib.rs | 1 + 9 files changed, 676 insertions(+), 8 deletions(-) create mode 100644 rig-core/examples/document_loaders.rs create mode 100644 rig-core/examples/sample_data/moores_law_for_everything.pdf create mode 100644 rig-core/src/document_loaders/csv.rs create mode 100644 rig-core/src/document_loaders/mod.rs create mode 100644 rig-core/src/document_loaders/pdf.rs diff --git a/Cargo.lock b/Cargo.lock index 76e03fd9..67c4fc9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "ahash" version = "0.8.11" @@ -30,6 +36,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -78,7 +93,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.7.3", "object", "rustc-demangle", ] @@ -216,6 +231,40 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + [[package]] name = "crypto-common" version = "0.1.6" @@ -226,6 +275,27 @@ dependencies = [ "typenum", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "darling" version = "0.13.4" @@ -317,6 +387,12 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -366,6 +442,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" +[[package]] +name = "flate2" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.0", +] + [[package]] name = "fnv" version = "1.0.7" @@ -402,6 +488,16 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + [[package]] name = "futures" version = "0.3.30" @@ -581,6 +677,20 @@ dependencies = [ "winapi", ] +[[package]] +name = "html5ever" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e15626aaf9c351bc696217cbe29cb9b5e86c43f8a46b5e2f5c6c5cf7cb904ce" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 2.0.65", +] + [[package]] name = "http" version = "0.2.12" @@ -785,6 +895,26 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "lopdf" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5c8ecfc6c72051981c0459f75ccc585e7ff67c70829560cda8e647882a9abff" +dependencies = [ + "chrono", + "encoding_rs", + "flate2", + "indexmap", + "itoa", + "log", + "md-5", + "nom", + "rangemap", + "rayon", + "time", + "weezl", +] + [[package]] name = "lru-cache" version = "0.1.2" @@ -794,6 +924,37 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markdown" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef3aab6a1d529b112695f72beec5ee80e729cb45af58663ec902c8fac764ecdd" +dependencies = [ + "lazy_static", + "pipeline", + "regex", +] + +[[package]] +name = "markup5ever" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82c88c6129bd24319e62a0359cb6b958fa7e8be6e19bb1663bc396b90883aca5" +dependencies = [ + "log", + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + [[package]] name = "match_cfg" version = "0.1.0" @@ -828,6 +989,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.3" @@ -837,6 +1004,15 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + [[package]] name = "mio" version = "0.8.11" @@ -913,6 +1089,22 @@ dependencies = [ "tempfile", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1060,6 +1252,63 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" version = "0.2.14" @@ -1072,6 +1321,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pipeline" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15b6607fa632996eb8a17c9041cb6071cb75ac057abd45dece578723ea8c7c0" + [[package]] name = "pkg-config" version = "0.3.30" @@ -1090,6 +1345,12 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "proc-macro2" version = "1.0.83" @@ -1150,6 +1411,32 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.5.1" @@ -1159,6 +1446,35 @@ dependencies = [ "bitflags 2.5.0", ] +[[package]] +name = "regex" +version = "1.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + [[package]] name = "reqwest" version = "0.11.27" @@ -1214,7 +1530,12 @@ name = "rig-core" version = "0.1.0" dependencies = [ "anyhow", + "async-trait", + "csv", "futures", + "html5ever", + "lopdf", + "markdown", "ordered-float", "reqwest", "schemars", @@ -1224,6 +1545,7 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", + "walkdir", ] [[package]] @@ -1339,6 +1661,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.23" @@ -1558,6 +1889,12 @@ dependencies = [ "libc", ] +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "slab" version = "0.4.9" @@ -1599,6 +1936,32 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + [[package]] name = "stringprep" version = "0.1.4" @@ -1695,6 +2058,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + [[package]] name = "thiserror" version = "1.0.61" @@ -2004,6 +2378,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "uuid" version = "1.8.0" @@ -2032,6 +2412,16 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -2129,6 +2519,12 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + [[package]] name = "widestring" version = "1.1.0" @@ -2151,6 +2547,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/rig-core/Cargo.toml b/rig-core/Cargo.toml index dde7027e..237418c1 100644 --- a/rig-core/Cargo.toml +++ b/rig-core/Cargo.toml @@ -11,8 +11,6 @@ repository = "https://github.com/0xPlaygrounds/rig" name="rig" path="src/lib.rs" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] reqwest = { version = "0.11.22", features = ["json"] } serde = { version = "1.0.193", features = ["derive"] } @@ -22,8 +20,15 @@ futures = "0.3.29" ordered-float = "4.2.0" schemars = "0.8.16" thiserror = "1.0.61" +async-trait = "0.1.68" +csv = "1.3.0" +lopdf = "0.34.0" +html5ever = "0.29.0" +markdown = "0.3.0" +tokio = { version = "1.34.0", features = ["fs", "io-util"] } +anyhow = "1.0.75" +walkdir = "2.5.0" [dev-dependencies] -anyhow = "1.0.75" tokio = { version = "1.34.0", features = ["full"] } -tracing-subscriber = "0.3.18" +tracing-subscriber = "0.3.18" \ No newline at end of file diff --git a/rig-core/examples/document_loaders.rs b/rig-core/examples/document_loaders.rs new file mode 100644 index 00000000..4e04b217 --- /dev/null +++ b/rig-core/examples/document_loaders.rs @@ -0,0 +1,89 @@ +// examples/document_loaders.rs + +use rig::{ + completion::Prompt, + document_loaders::PdfLoader, + embeddings::EmbeddingsBuilder, + providers::openai::{Client, TEXT_EMBEDDING_ADA_002}, + vector_store::{in_memory_store::InMemoryVectorStore, VectorStore}, +}; +use std::env; +use std::path::PathBuf; + +#[tokio::main] +async fn main() -> Result<(), anyhow::Error> { + // Print current working directory + println!("Current working directory: {:?}", env::current_dir()?); + + // Path to the PDF file + let pdf_path = PathBuf::from("rig-core/examples/sample_data/moores_law_for_everything.pdf"); + + // Print absolute path + println!( + "Attempting to access file at: {:?}", + pdf_path.canonicalize()? + ); + + // Check if the file exists + if !pdf_path.exists() { + eprintln!("Error: The file {} does not exist.", pdf_path.display()); + return Ok(()); + } + + println!("File found successfully!"); + + // Initialize OpenAI client + let openai = Client::from_env(); + let embedding_model = openai.embedding_model(TEXT_EMBEDDING_ADA_002); + + // Create vector store + let mut vector_store = InMemoryVectorStore::default(); + + // Build embeddings + let embeddings = EmbeddingsBuilder::new(embedding_model.clone()) + .add_loader(PdfLoader::new(pdf_path.to_str().unwrap())) + .build() + .await?; + + println!( + "Embeddings created successfully. Count: {}", + embeddings.len() + ); + for emb in &embeddings { + println!("Document ID: {}", emb.id); + println!("Document Content: {:?}", emb.document); + println!("Number of embeddings: {}", emb.embeddings.len()); + println!( + "First embedding vector length: {}", + emb.embeddings.first().map_or(0, |e| e.vec.len()) + ); + println!("--------------------"); + } + + // Add documents to vector store + vector_store.add_documents(embeddings).await?; + + // Create vector store index + let index = vector_store.index(embedding_model); + + // Create RAG agent + let rag_agent = openai + .agent("gpt-4") + .preamble( + " + You are a knowledgeable assistant. + Use the information provided to you to answer questions. + ", + ) + .dynamic_context(5, index) + .build(); + + // Prompt the agent and print the response + let response = rag_agent + .prompt("give me a summary of the document.") + .await?; + + println!("Agent Response:\n{}", response); + + Ok(()) +} diff --git a/rig-core/examples/sample_data/moores_law_for_everything.pdf b/rig-core/examples/sample_data/moores_law_for_everything.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d67afc5156f5201e270d2439dea9de449e54d8eb GIT binary patch literal 411067 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%0AgZ^P>#Vw@0#pUVePBn!mu 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 literal 0 HcmV?d00001 diff --git a/rig-core/src/document_loaders/csv.rs b/rig-core/src/document_loaders/csv.rs new file mode 100644 index 00000000..51754c8e --- /dev/null +++ b/rig-core/src/document_loaders/csv.rs @@ -0,0 +1,65 @@ +// src/document_loaders/csv.rs + +use async_trait::async_trait; +use csv::Reader; +use serde_json::Value; +use std::error::Error as StdError; +use tokio::fs::File; +use tokio::io::AsyncReadExt; + +use super::DocumentLoader; +use crate::embeddings::DocumentEmbeddings; + +pub struct CsvLoader { + path: String, + id_column: Option, +} + +impl CsvLoader { + pub fn new(path: &str, id_column: Option<&str>) -> Self { + Self { + path: path.to_string(), + id_column: id_column.map(String::from), + } + } +} + +#[async_trait] +impl DocumentLoader for CsvLoader { + async fn load(&self) -> Result, Box> { + let mut file = File::open(&self.path).await?; + let mut contents = String::new(); + file.read_to_string(&mut contents).await?; + + let mut reader = Reader::from_reader(contents.as_bytes()); + let headers = reader.headers()?.clone(); + + let mut documents = Vec::new(); + + for result in reader.records() { + let record = result?; + let mut doc = serde_json::Map::new(); + + for (i, field) in record.iter().enumerate() { + doc.insert(headers[i].to_string(), Value::String(field.to_string())); + } + + let id = if let Some(id_col) = &self.id_column { + doc.get(id_col) + .and_then(|v| v.as_str()) + .unwrap_or_default() + .to_string() + } else { + format!("csv_row_{}", documents.len()) + }; + + documents.push(DocumentEmbeddings { + id, + document: Value::Object(doc), + embeddings: vec![], + }); + } + + Ok(documents) + } +} diff --git a/rig-core/src/document_loaders/mod.rs b/rig-core/src/document_loaders/mod.rs new file mode 100644 index 00000000..ee375bc9 --- /dev/null +++ b/rig-core/src/document_loaders/mod.rs @@ -0,0 +1,26 @@ +// src/document_loaders/mod.rs + +mod csv; +// mod directory; +// mod html; +// mod json; +// mod markdown; +// mod office; +mod pdf; + +use crate::embeddings::DocumentEmbeddings; +use async_trait::async_trait; +use std::error::Error as StdError; + +#[async_trait] +pub trait DocumentLoader { + async fn load(&self) -> Result, Box>; +} + +pub use csv::CsvLoader; +// pub use directory::DirectoryLoader; +// pub use html::HtmlLoader; +// pub use json::JsonLoader; +// pub use markdown::MarkdownLoader; +// pub use office::OfficeLoader; +pub use pdf::PdfLoader; diff --git a/rig-core/src/document_loaders/pdf.rs b/rig-core/src/document_loaders/pdf.rs new file mode 100644 index 00000000..f8489ec3 --- /dev/null +++ b/rig-core/src/document_loaders/pdf.rs @@ -0,0 +1,38 @@ +use super::DocumentLoader; +use crate::embeddings::DocumentEmbeddings; +use async_trait::async_trait; +use lopdf::Document; +use serde_json::json; + +pub struct PdfLoader { + path: String, +} + +impl PdfLoader { + pub fn new(path: &str) -> Self { + Self { + path: path.to_string(), + } + } +} + +#[async_trait] +impl DocumentLoader for PdfLoader { + async fn load( + &self, + ) -> Result, Box> { + let doc = Document::load(&self.path)?; + let mut text = String::new(); + for page in doc.get_pages() { + if let Ok(content) = doc.extract_text(&[page.0]) { + text.push_str(&content); + } + } + println!("Extracted text from PDF: {}", text); // Debug print + Ok(vec![DocumentEmbeddings { + id: self.path.clone(), + document: json!({"text": text}), + embeddings: vec![], // Empty vector, embeddings will be generated later + }]) + } +} diff --git a/rig-core/src/embeddings.rs b/rig-core/src/embeddings.rs index 2d40bbc5..a9b0f1b2 100644 --- a/rig-core/src/embeddings.rs +++ b/rig-core/src/embeddings.rs @@ -43,6 +43,7 @@ use std::{cmp::max, collections::HashMap}; use futures::{stream, StreamExt, TryStreamExt}; use serde::{Deserialize, Serialize}; +use crate::document_loaders::DocumentLoader; use crate::tool::{ToolEmbedding, ToolSet, ToolType}; #[derive(Debug, thiserror::Error)] @@ -66,6 +67,10 @@ pub enum EmbeddingError { /// Error returned by the embedding model provider #[error("ProviderError: {0}")] ProviderError(String), + + /// Error loading documents + #[error("LoaderError: {0}")] + LoaderError(String), } /// Trait for embedding models that can generate embeddings for documents. @@ -153,6 +158,7 @@ type Embeddings = Vec; pub struct EmbeddingsBuilder { model: M, documents: Vec<(String, serde_json::Value, Vec)>, + loaders: Vec>, // New field for document loaders } impl EmbeddingsBuilder { @@ -161,6 +167,7 @@ impl EmbeddingsBuilder { Self { model, documents: vec![], + loaders: vec![], // Initialize loaders } } @@ -275,11 +282,43 @@ impl EmbeddingsBuilder { self } + /// Add a new document loader + pub fn add_loader(mut self, loader: impl DocumentLoader + 'static) -> Self { + self.loaders.push(Box::new(loader)); // Add loader to the collection + self + } + /// Generate the embeddings for the given documents pub async fn build(self) -> Result { // Create a temporary store for the documents - let documents_map = self - .documents + let mut all_documents = self.documents; + + // Load documents from loaders and merge them with existing ones + for loader in self.loaders { + let loaded_docs = loader + .load() + .await + .map_err(|e| EmbeddingError::LoaderError(e.to_string()))?; + for doc in loaded_docs { + // Extract the text content from the document + let text = match &doc.document { + serde_json::Value::String(s) => s.clone(), + serde_json::Value::Object(obj) => obj + .get("text") + .and_then(|v| v.as_str()) + .unwrap_or_default() + .to_string(), + _ => { + return Err(EmbeddingError::DocumentError( + "Invalid document format".to_string(), + )) + } + }; + all_documents.push((doc.id, doc.document, vec![text])); + } + } + + let documents_map = all_documents .into_iter() .map(|(id, document, docs)| (id, (document, docs))) .collect::>(); @@ -289,7 +328,7 @@ impl EmbeddingsBuilder { .flat_map(|(id, (_, docs))| { stream::iter(docs.iter().map(|doc| (id.clone(), doc.clone()))) }) - // Chunk them into N (the emebdding API limit per request) + // Chunk them into N (the embedding API limit per request) .chunks(M::MAX_DOCUMENTS) // Generate the embeddings .map(|docs| async { diff --git a/rig-core/src/lib.rs b/rig-core/src/lib.rs index c480272f..3ef157ba 100644 --- a/rig-core/src/lib.rs +++ b/rig-core/src/lib.rs @@ -77,6 +77,7 @@ pub mod agent; pub mod cli_chatbot; pub mod completion; +pub mod document_loaders; pub mod embeddings; pub mod extractor; pub mod json_utils; From 9c8e7519f38850efcac4994543b7161a26449f75 Mon Sep 17 00:00:00 2001 From: Rin_0xTohsaka <89101179+Tachikoma000@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:11:38 -0500 Subject: [PATCH 2/4] minor comments to help review main feature files - Comments added to pdf.rs, mod.rs, document_loaders.rs --- rig-core/examples/document_loaders.rs | 6 ++---- rig-core/src/document_loaders/mod.rs | 4 +++- rig-core/src/document_loaders/pdf.rs | 13 ++++++++++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/rig-core/examples/document_loaders.rs b/rig-core/examples/document_loaders.rs index 4e04b217..40a41712 100644 --- a/rig-core/examples/document_loaders.rs +++ b/rig-core/examples/document_loaders.rs @@ -1,5 +1,3 @@ -// examples/document_loaders.rs - use rig::{ completion::Prompt, document_loaders::PdfLoader, @@ -50,8 +48,8 @@ async fn main() -> Result<(), anyhow::Error> { embeddings.len() ); for emb in &embeddings { - println!("Document ID: {}", emb.id); - println!("Document Content: {:?}", emb.document); + // println!("Document ID: {}", emb.id); + // println!("Document Content: {:?}", emb.document); println!("Number of embeddings: {}", emb.embeddings.len()); println!( "First embedding vector length: {}", diff --git a/rig-core/src/document_loaders/mod.rs b/rig-core/src/document_loaders/mod.rs index ee375bc9..b25b15f5 100644 --- a/rig-core/src/document_loaders/mod.rs +++ b/rig-core/src/document_loaders/mod.rs @@ -1,4 +1,5 @@ -// src/document_loaders/mod.rs +//! This module contains the implementation of document loaders for various file formats. +//! Currently, it includes loaders for CSV and PDF files. mod csv; // mod directory; @@ -14,6 +15,7 @@ use std::error::Error as StdError; #[async_trait] pub trait DocumentLoader { + /// Asynchronously loads the document and returns a vector of document embeddings. async fn load(&self) -> Result, Box>; } diff --git a/rig-core/src/document_loaders/pdf.rs b/rig-core/src/document_loaders/pdf.rs index f8489ec3..6d073af1 100644 --- a/rig-core/src/document_loaders/pdf.rs +++ b/rig-core/src/document_loaders/pdf.rs @@ -1,14 +1,17 @@ +// Import necessary dependencies use super::DocumentLoader; use crate::embeddings::DocumentEmbeddings; use async_trait::async_trait; use lopdf::Document; use serde_json::json; +// Define a struct for loading PDF documents pub struct PdfLoader { path: String, } impl PdfLoader { + // Implement a constructor for the PdfLoader struct pub fn new(path: &str) -> Self { Self { path: path.to_string(), @@ -18,17 +21,25 @@ impl PdfLoader { #[async_trait] impl DocumentLoader for PdfLoader { + // Implement the load function for the DocumentLoader trait async fn load( &self, ) -> Result, Box> { + // Load the PDF document from the specified path let doc = Document::load(&self.path)?; + + // Extract text from each page of the PDF document let mut text = String::new(); for page in doc.get_pages() { if let Ok(content) = doc.extract_text(&[page.0]) { text.push_str(&content); } } - println!("Extracted text from PDF: {}", text); // Debug print + + // Print the extracted text for debugging purposes + println!("Extracted text from PDF: {}", text); + + // Create a DocumentEmbeddings object with the extracted text Ok(vec![DocumentEmbeddings { id: self.path.clone(), document: json!({"text": text}), From 5f05baa323e8d7af085c020b5f03a8100dea714e Mon Sep 17 00:00:00 2001 From: Rin_0xTohsaka <89101179+Tachikoma000@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:55:17 -0500 Subject: [PATCH 3/4] Add CSV Loader to Document Loaders - Implement CsvLoader struct in src/document_loaders/csv.rs - Add CsvLoader to the document_loaders module - Implement DocumentLoader trait for CsvLoader - Use csv crate for CSV parsing - Add error handling for file operations and CSV parsing - Update Cargo.toml with csv dependency - Update documentation with CsvLoader usage examples --- rig-core/examples/rag_with_csv.rs | 85 ++++++++++++++ .../examples/sample_data/top_rated_movies.csv | 110 ++++++++++++++++++ rig-core/src/document_loaders/csv.rs | 38 ++---- 3 files changed, 206 insertions(+), 27 deletions(-) create mode 100644 rig-core/examples/rag_with_csv.rs create mode 100644 rig-core/examples/sample_data/top_rated_movies.csv diff --git a/rig-core/examples/rag_with_csv.rs b/rig-core/examples/rag_with_csv.rs new file mode 100644 index 00000000..7a9de694 --- /dev/null +++ b/rig-core/examples/rag_with_csv.rs @@ -0,0 +1,85 @@ +use rig::{ + completion::Prompt, + document_loaders::CsvLoader, + embeddings::EmbeddingsBuilder, + providers::openai::{Client, TEXT_EMBEDDING_ADA_002}, + vector_store::{in_memory_store::InMemoryVectorStore, VectorStore}, +}; +use std::env; +use std::path::PathBuf; + +#[tokio::main] +async fn main() -> Result<(), anyhow::Error> { + // Print current working directory + println!("Current working directory: {:?}", env::current_dir()?); + + // Path to the CSV file + let csv_path = PathBuf::from("rig-core/examples/sample_data/top_rated_movies.csv"); + + // Print absolute path + println!( + "Attempting to access file at: {:?}", + csv_path.canonicalize()? + ); + + // Check if the file exists + if !csv_path.exists() { + eprintln!("Error: The file {} does not exist.", csv_path.display()); + return Ok(()); + } + + println!("File found successfully!"); + + // Initialize OpenAI client + let openai = Client::from_env(); + let embedding_model = openai.embedding_model(TEXT_EMBEDDING_ADA_002); + + // Create vector store + let mut vector_store = InMemoryVectorStore::default(); + + // Build embeddings + let embeddings = EmbeddingsBuilder::new(embedding_model.clone()) + .add_loader(CsvLoader::new(csv_path.to_str().unwrap())) + .build() + .await?; + + println!( + "Embeddings created successfully. Count: {}", + embeddings.len() + ); + for emb in &embeddings { + println!("Number of embeddings: {}", emb.embeddings.len()); + println!( + "First embedding vector length: {}", + emb.embeddings.first().map_or(0, |e| e.vec.len()) + ); + println!("--------------------"); + } + + // Add documents to vector store + vector_store.add_documents(embeddings).await?; + + // Create vector store index + let index = vector_store.index(embedding_model); + + // Create RAG agent + let rag_agent = openai + .agent("gpt-4") + .preamble( + " + You are a knowledgeable assistant. + Use the information provided to you to answer questions about the CSV data. + ", + ) + .dynamic_context(5, index) + .build(); + + // Prompt the agent and print the response + let response = rag_agent + .prompt("Give me a summary of the CSV data.") + .await?; + + println!("Agent Response:\n{}", response); + + Ok(()) +} \ No newline at end of file diff --git a/rig-core/examples/sample_data/top_rated_movies.csv b/rig-core/examples/sample_data/top_rated_movies.csv new file mode 100644 index 00000000..d5c54344 --- /dev/null +++ b/rig-core/examples/sample_data/top_rated_movies.csv @@ -0,0 +1,110 @@ +popularity,release_date,title,vote_average +174.522,9/23/1994,The Shawshank Redemption,8.706 +165.677,3/14/1972,The Godfather,8.69 +174.522,9/23/1994,The Shawshank Redemption,8.706 +165.677,3/14/1972,The Godfather,8.69 +47.916,12/20/1997,Life Is Beautiful,8.449 +197.569,11/5/2014,Interstellar,8.44 +42.629,10/13/2023,TAYLOR SWIFT | THE ERAS TOUR,8.388 +21.39,11/19/2020,Gabriel's Inferno: Part III,8.4 +69.527,7/3/1985,Back to the Future,8.318 +49.507,6/2/1989,Dead Poets Society,8.312 +18.452,10/28/1998,The Legend of 1900,8.266 +14.67,8/22/2020,Given,8.3 +173.556,12/7/2022,Puss in Boots: The Last Wish,8.227 +29.933,10/26/2020,Wolfwalkers,8.22 +135.05,10/7/2016,Hacksaw Ridge,8.198 +46.126,12/19/1971,A Clockwork Orange,8.2 +20.423,1/28/2005,Innocent Voices,8.174 +27.808,11/3/1953,Tokyo Story,8.2 +83.731,3/18/2021,Zack Snyder's Justice League,8.148 +29.312,10/25/2019,Better Days,8.1 +89.436,7/3/1991,Terminator 2: Judgment Day,8.119 +14.482,7/6/1944,Double Indemnity,8.1 +55.332,9/19/2013,Prisoners,8.098 +14.629,3/31/1954,Sansho the Bailiff,8.098 +11.283,11/24/2021,Far from the Tree,8.074 +67.735,9/16/2005,Pride & Prejudice,8.075 +38.208,2/26/2014,The Grand Budapest Hotel,8.1 +42.511,12/3/2019,How to Train Your Dragon: Homecoming,8.048 +13.881,10/27/2022,Beyond the Universe,8.027 +26.21,10/18/2019,Jojo Rabbit,8.024 +12.038,11/27/2020,Black Beauty,8 +37.023,6/8/2009,Hachi: A Dog's Tale,8.008 +5.126,6/1/2017,In a Heartbeat,7.995 +33.577,12/23/2009,3 Idiots,7.995 +137.914,5/3/2023,Guardians of the Galaxy Vol. 3,8 +18.167,1/31/2009,Love Exposure,8 +38.425,8/6/1999,The Sixth Sense,7.957 +21.449,12/15/2004,Million Dollar Baby,7.957 +56.873,6/13/2007,No Country for Old Men,7.944 +35.17,10/18/2013,12 Years a Slave,7.942 +12.423,1/21/2022,My Father's Violin,7.926 +20.658,6/22/1954,On the Waterfront,7.9 +10.913,8/1/1997,Children of Heaven,7.914 +27.948,12/21/2016,Dangal,7.913 +30.657,1/15/2021,Wish Dragon,7.902 +28.602,11/4/2016,A Street Cat Named Bob,7.905 +11.461,6/10/2008,La Maison en Petits Cubes,7.893 +52.355,12/20/2017,The Greatest Showman,7.891 +19.146,9/20/2000,Yi Yi,7.875 +19.15,9/1/2000,Dancer in the Dark,7.875 +14.602,12/21/2011,My Way,7.858 +18.928,9/16/2004,Downfall,7.858 +13.954,3/15/1940,The Grapes of Wrath,7.8 +43.665,3/30/1990,Dances with Wolves,7.847 +16.392,5/1/1983,Nostalgia,7.838 +28.293,12/22/1960,Two Women,7.837 +42.994,12/3/2022,The First Slam Dunk,7.8 +92.789,6/21/2007,Ratatouille,7.824 +32.022,3/20/1972,Solaris,7.8 +22.13,6/16/2004,Before Sunset,7.818 +33.161,10/23/2009,Fantastic Mr. Fox,7.8 +141.3,7/9/2003,Pirates of the Caribbean: The Curse of the Black Pearl,7.804 +10.15,8/21/1988,A Short Film About Love,7.794 +45.622,9/20/2012,The Perks of Being a Wallflower,7.793 +16.517,8/31/2000,Nine Queens,7.784 +12.185,12/17/1993,The Wrong Trousers,7.784 +20.295,12/4/1990,Awakenings,7.768 +11.949,5/28/2009,Partly Cloudy,7.767 +18.816,11/18/1974,A Woman Under the Influence,7.8 +18.124,2/14/2008,The Chaser,7.758 +86.727,2/11/2016,Zootopia,7.749 +12.807,3/19/1980,The King and the Mockingbird,7.749 +20.424,9/28/2019,Marriage Story,7.738 +56.129,7/13/2022,The Killer,7.7 +16.337,11/20/2020,Sound of Metal,7.727 +14.088,9/20/1962,Vivre Sa Vie,7.727 +18.88,12/22/2004,Hotel Rwanda,7.7 +24.783,2/18/2017,Sword Art Online: The Movie – Ordinal Scale,7.718 +62.912,6/10/2005,Batman Begins,7.709 +28.113,12/9/1965,A Charlie Brown Christmas,7.707 +8.592,4/7/1966,For Love and Gold,7.698 +15.608,3/31/2011,The Turin Horse,7.7 +61.64,9/30/2015,The Martian,7.687 +13.588,1/8/2014,Boys,7.687 +12.97,6/1/1998,"Black Cat, White Cat",7.68 +12.521,9/25/1961,The Hustler,7.68 +14.101,6/27/1951,Strangers on a Train,7.671 +16.624,5/23/2019,The Traitor,7.672 +29.525,3/6/1996,Primal Fear,7.661 +26.983,3/31/2016,Hunt for the Wilderpeople,7.7 +13.112,9/2/1949,White Heat,7.6 +46.7,7/24/2020,The Kissing Booth 2,7.648 +20.064,9/28/2022,Entergalactic,7.641 +78.458,2/22/2024,Exhuma,7.64 +56.569,1/19/2017,A Dog's Purpose,7.632 +47.331,9/26/2008,Fireproof,7.632 +18.036,10/19/1970,Le Cercle Rouge,7.623 +65.228,2/24/2017,Get Out,7.623 +38.806,4/9/2015,The Longest Ride,7.614 +20.63,3/30/2005,Mysterious Skin,7.615 +24.423,3/24/1989,The Killer,7.6 +13.757,6/19/1969,The Wild Bunch,7.607 +25.542,10/24/2008,Changeling,7.6 +25.864,12/20/1991,JFK,7.6 +23.749,6/19/2020,Feel the Beat,7.59 +45.792,3/30/1999,10 Things I Hate About You,7.6 +24.649,8/24/2018,Searching,7.583 +79.872,12/15/2009,Avatar,7.583 +17.303,6/19/2014,What We Do in the Shadows,7.575 \ No newline at end of file diff --git a/rig-core/src/document_loaders/csv.rs b/rig-core/src/document_loaders/csv.rs index 51754c8e..34b47cf3 100644 --- a/rig-core/src/document_loaders/csv.rs +++ b/rig-core/src/document_loaders/csv.rs @@ -1,8 +1,6 @@ -// src/document_loaders/csv.rs - use async_trait::async_trait; use csv::Reader; -use serde_json::Value; +use serde_json::json; use std::error::Error as StdError; use tokio::fs::File; use tokio::io::AsyncReadExt; @@ -12,14 +10,12 @@ use crate::embeddings::DocumentEmbeddings; pub struct CsvLoader { path: String, - id_column: Option, } impl CsvLoader { - pub fn new(path: &str, id_column: Option<&str>) -> Self { + pub fn new(path: &str) -> Self { Self { path: path.to_string(), - id_column: id_column.map(String::from), } } } @@ -32,34 +28,22 @@ impl DocumentLoader for CsvLoader { file.read_to_string(&mut contents).await?; let mut reader = Reader::from_reader(contents.as_bytes()); - let headers = reader.headers()?.clone(); + let headers: Vec = reader.headers()?.iter().map(|h| h.to_string()).collect(); - let mut documents = Vec::new(); + let mut csv_content = String::new(); for result in reader.records() { let record = result?; - let mut doc = serde_json::Map::new(); - for (i, field) in record.iter().enumerate() { - doc.insert(headers[i].to_string(), Value::String(field.to_string())); + csv_content.push_str(&format!("{}: {}\n", headers[i], field)); } - - let id = if let Some(id_col) = &self.id_column { - doc.get(id_col) - .and_then(|v| v.as_str()) - .unwrap_or_default() - .to_string() - } else { - format!("csv_row_{}", documents.len()) - }; - - documents.push(DocumentEmbeddings { - id, - document: Value::Object(doc), - embeddings: vec![], - }); + csv_content.push_str("\n"); } - Ok(documents) + Ok(vec![DocumentEmbeddings { + id: self.path.clone(), + document: json!({"text": csv_content}), + embeddings: vec![], + }]) } } From 2babaa3e9b2b92dcdd1b0a399ae013ca92ec26f8 Mon Sep 17 00:00:00 2001 From: Rin_0xTohsaka <89101179+Tachikoma000@users.noreply.github.com> Date: Thu, 19 Sep 2024 10:01:52 -0500 Subject: [PATCH 4/4] Clippy Fixes - Addressed a Clippy warning by replacing `push_str("\n")` with `push('\n')` for better performance and code quality. --- rig-core/examples/rag_with_csv.rs | 2 +- rig-core/src/document_loaders/csv.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rig-core/examples/rag_with_csv.rs b/rig-core/examples/rag_with_csv.rs index 7a9de694..82637eb8 100644 --- a/rig-core/examples/rag_with_csv.rs +++ b/rig-core/examples/rag_with_csv.rs @@ -82,4 +82,4 @@ async fn main() -> Result<(), anyhow::Error> { println!("Agent Response:\n{}", response); Ok(()) -} \ No newline at end of file +} diff --git a/rig-core/src/document_loaders/csv.rs b/rig-core/src/document_loaders/csv.rs index 34b47cf3..ea91e7d8 100644 --- a/rig-core/src/document_loaders/csv.rs +++ b/rig-core/src/document_loaders/csv.rs @@ -37,7 +37,7 @@ impl DocumentLoader for CsvLoader { for (i, field) in record.iter().enumerate() { csv_content.push_str(&format!("{}: {}\n", headers[i], field)); } - csv_content.push_str("\n"); + csv_content.push('\n'); // Changed from push_str("\n") to push('\n') } Ok(vec![DocumentEmbeddings {