use langchainrust::embeddings::{Embeddings, MockEmbeddings};
use langchainrust::retrieval::SimilarityRetriever;
use langchainrust::tools::DuckDuckGoSearchTool;
use langchainrust::vector_stores::{InMemoryVectorStore, VectorStore};
use langchainrust::{CorrectiveRAGAgent, Document, OpenAIChat, OpenAIConfig};
use std::sync::Arc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let api_key = std::env::var("OPENAI_API_KEY").expect("请设置 OPENAI_API_KEY 环境变量");
let base_url = std::env::var("OPENAI_BASE_URL")
.unwrap_or_else(|_| "https://api.openai.com/v1".to_string());
let llm = OpenAIChat::new(OpenAIConfig {
api_key,
base_url,
model: "gpt-4o-mini".to_string(),
..Default::default()
});
let store = Arc::new(InMemoryVectorStore::new());
let embeddings = Arc::new(MockEmbeddings::new(3));
let docs = vec![
Document::new("Rust 是一门系统编程语言,由 Mozilla 开发,注重安全和性能。"),
Document::new("Rust 的核心特性包括所有权系统、借用检查和零成本抽象。"),
Document::new("Rust 的包管理器叫 Cargo,支持依赖管理和构建自动化。"),
];
let doc_texts: Vec<&str> = docs.iter().map(|d| d.content.as_str()).collect();
let doc_embeddings = embeddings.embed_documents(&doc_texts).await?;
store.add_documents(docs, doc_embeddings).await?;
let retriever = SimilarityRetriever::new(store, embeddings);
let agent = CorrectiveRAGAgent::new(llm, retriever)
.with_grade_threshold(0.5) .with_web_fallback(Box::new(DuckDuckGoSearchTool::new())) .with_hallucination_check(true);
let result = agent.invoke("Rust 语言有哪些核心特性?").await?;
println!("回答: {}", result.answer);
println!("是否基于文档: {}", result.grounded);
println!("来源文档数: {}", result.sources.len());
for (i, score) in result.grade_scores.iter().enumerate() {
println!(" 文档[{}] 评分: {:.2}", i, score);
}
Ok(())
}