🦜️🔗LangChain Rust
⚡ 用Rust通过组合构建LLM应用程序!⚡
🤔 这是什么?
这是 LangChain 的Rust语言实现。
现有功能
-
LLMs
-
嵌入
-
矢量存储
-
链
-
代理
-
工具
- Serpapi/谷歌
- DuckDuckGo Search
- Wolfram/数学
- 命令行
- Text2Speech
-
语义路由
-
文档加载器
-
PDF
use futures_util::StreamExt; async fn main() { let path = "./src/document_loaders/test_data/sample.pdf"; let loader = LoPdfLoader::from_path(path).expect("创建PdfLoader失败"); let docs = loader .load() .await .unwrap() .map(|d| d.unwrap()) .collect::<Vec<_>>() .await; }
-
Pandoc
use futures_util::StreamExt; async fn main() { let path = "./src/document_loaders/test_data/sample.docx"; let loader = PandocLoader::from_path(InputFormat::Docx.to_string(), path) .await .expect("创建PandocLoader失败"); let docs = loader .load() .await .unwrap() .map(|d| d.unwrap()) .collect::<Vec<_>>() .await; }
-
HTML
use futures_util::StreamExt; use url::Url; async fn main() { let path = "./src/document_loaders/test_data/example.html"; let html_loader = HtmlLoader::from_path(path, Url::parse("https://example.com/").unwrap()) .expect("创建HTML加载器失败"); let documents = html_loader .load() .await .unwrap() .map(|x| x.unwrap()) .collect::<Vec<_>>() .await; }
-
CSV
use futures_util::StreamExt; async fn main() { let path = "./src/document_loaders/test_data/test.csv"; let columns = vec![ "name".to_string(), "age".to_string(), "city".to_string(), "country".to_string(), ]; let csv_loader = CsvLoader::from_path(path, columns).expect("创建CSV加载器失败"); let documents = csv_loader .load() .await .unwrap() .map(|x| x.unwrap()) .collect::<Vec<_>>() .await; }
-
Git提交
use futures_util::StreamExt; async fn main() { let path = "/path/to/git/repo"; let git_commit_loader = GitCommitLoader::from_path(path).expect("创建Git提交加载器失败"); let documents = csv_loader .load() .await .unwrap() .map(|x| x.unwrap()) .collect::<Vec<_>>() .await; }
-
源代码
let loader_with_dir = SourceCodeLoader::from_path("./src/document_loaders/test_data".to_string()) .with_dir_loader_options(DirLoaderOptions { glob: None, suffixes: Some(vec!["rs".to_string()]), exclude: None, }); let stream = loader_with_dir.load().await.unwrap(); let documents = stream.map(|x| x.unwrap()).collect::<Vec<_>>().await;
-
安装
该库在操作上严重依赖于serde_json
。
步骤1:添加serde_json
首先,确保将serde_json
添加到您的Rust项目中。
cargo add serde_json
步骤2:添加langchain-rust
然后,您可以将langchain-rust
添加到您的Rust项目中。
简单安装
cargo add langchain-rust
使用Sqlite
cargo add langchain-rust --features sqlite
从https://github.com/asg017/sqlite-vss下载额外的sqlite_vss库
使用Postgres
cargo add langchain-rust --features postgres
使用SurrealDB
cargo add langchain-rust --features surrealdb
使用Qdrant
cargo add langchain-rust --features qdrant
请记住根据您的具体使用情况替换功能标志sqlite
、postgres
或surrealdb
。
这将把serde_json
和langchain-rust
作为依赖项添加到您的Cargo.toml
文件中。现在,当您构建项目时,两个依赖项将被获取并编译,并可在您的项目中使用。
记住,serde_json
是一个必要的依赖项,而sqlite
、postgres
和surrealdb
是根据项目需要可选择添加的功能。
快速启动会话链
use langchain_rust::{
chain::{Chain, LLMChainBuilder},
fmt_message, fmt_placeholder, fmt_template,
language_models::llm::LLM,
llm::openai::{OpenAI, OpenAIModel},
message_formatter,
prompt::HumanMessagePromptTemplate,
prompt_args,
schemas::messages::Message,
template_fstring,
};
#[tokio::main]
async fn main() {
//我们可以初始化模型:
// 如果您不想设置环境变量,可以在初始化OpenAI LLM类时通过`openai_api_key`命名参数直接传递密钥:
// let open_ai = OpenAI::default()
// .with_config(
// OpenAIConfig::default()
// .with_api_key("<你的密钥>"),
// ).with_model(OpenAIModel::Gpt35.to_string());
let open_ai = OpenAI::default().with_model(OpenAIModel::Gpt35.to_string());
//一旦您安装并初始化了您选择的LLM,我们就可以尝试使用它了!让我们问它什么是rust——这是训练数据中没有的东西,所以它不会有很好的回答。
let resp = open_ai.invoke("What is rust").await.unwrap();
println!("{}", resp);
// 我们还可以通过提示模板来引导它的响应。提示模板用于将原始用户输入转换为LLM的更好输入。
let prompt = message_formatter![
fmt_message!(Message::new_system_message(
"你是世界级的技术文档编写者。"
)),
fmt_template!(HumanMessagePromptTemplate::new(template_fstring!(
"{input}", "input"
)))
];
//我们现在可以将这些组合成一个简单的LLM链:
let chain = LLMChainBuilder::new()
.prompt(prompt)
.llm(open_ai.clone())
.build()
.unwrap();
//我们现在可以调用它并问同样的问题。它仍然不知道答案,但它应该以更适合技术作家的语气回答!
match chain
.invoke(prompt_args! {
"input" => "Quien es el escritor de 20000 millas de viaje submarino",
})
.await
{
Ok(result) => {
println!("结果: {:?}", result);
}
Err(e) => panic!("调用LLMChain时出错: {:?}", e),
}
//如果您希望提示包含消息列表,可以使用`fmt_placeholder`宏
let prompt = message_formatter![
fmt_message!(Message::new_system_message(
"你是世界级的技术文档编写者。"
)),
fmt_placeholder!("history"),
fmt_template!(HumanMessagePromptTemplate::new(template_fstring!(
"{input}", "input"
))),
];
let chain = LLMChainBuilder::new()
.prompt(prompt)
.llm(open_ai)
.build()
.unwrap();
match chain
.invoke(prompt_args! {
"input" => "Who is the writer of 20,000 Leagues Under the Sea, and what is my name?",
"history" => vec![
Message::new_human_message("我的名字是: luis"),
Message::new_ai_message("Hi luis"),
],
})
.await
{
Ok(result) => {
println!("结果: {:?}", result);
}
Err(e) => panic!("调用LLMChain时出错: {:?}", e),
}
}