| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- """RAG 命令行入口。"""
- from pathlib import Path
- from langchain_core.prompts import ChatPromptTemplate
- from agent.config import load_config
- from agent.llm import create_llm
- from agent.rag.document import load_pdf_document
- from agent.rag.embedding import get_embedding_model
- from agent.rag.multi_retriever import MultiRetrieverSystem
- from agent.rag.splitter import recursive_split
- from query_optimization import get_prompt_template
- DOCUMENT_PATH = Path("car_info.pdf")
- def create_rag_system() -> tuple[MultiRetrieverSystem, object, ChatPromptTemplate]:
- """加载文档并创建检索器和问答链所需组件。"""
- pages = load_pdf_document(str(DOCUMENT_PATH))
- documents = recursive_split(pages)
- config = load_config()
- llm = create_llm(config)
- retriever_system = MultiRetrieverSystem(
- documents=documents,
- embedding_model=get_embedding_model(),
- llm=llm,
- )
-
- return retriever_system, llm
- def run_cli() -> None:
- """启动交互式 RAG 命令行。"""
- retriever_system, llm = create_rag_system()
- prompt =get_prompt_template("rewrite")
- mode = "ensemble"
- valid_modes = {"bm25", "vector", "ensemble"}
- print("检索模式:ensemble(可输入 /mode bm25、/mode vector 或 /mode ensemble 切换)")
- while True:
- question = input("请输入问题:").strip()
- if not question:
- continue
- if question.lower() in {"exit", "quit", "q"}:
- break
- if question.startswith("/mode "):
- new_mode = question.removeprefix("/mode ").strip().lower()
- if new_mode in valid_modes:
- mode = new_mode
- print(f"已切换为 {mode} 检索。")
- else:
- print("不支持的检索模式,可选:bm25、vector、ensemble")
- continue
- relevant_docs = retriever_system.search(question, mode)
- context = "\n\n".join(document.page_content for document in relevant_docs)
- answer = (prompt | llm).invoke({"context": context, "question": question})
- print(f"AI 回答:{answer.content}")
- if __name__ == "__main__":
- run_cli()
|