001:简单 RAG 入门
lamaIndex 示例(千问)
文件名:01_LlamaIndex.py
import os from llama_index.llms.dashscope import DashScope, DashScopeGenerationModels from llama_index.embeddings.dashscope import DashScopeEmbedding from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings from dotenv import load_dotenv os.environ['USER_AGENT'] = 'my-rag-app/1.0' load_dotenv() DATA_DIR = "./data" # 1. 配置 LLM Settings.llm = DashScope( model_name=DashScopeGenerationModels.QWEN_MAX, api_key=os.getenv("DASHSCOPE_API_KEY") ) # 2. 设置嵌入模型 Settings.embed_model = DashScopeEmbedding( model_name='text-embedding-v2', api_key=os.getenv("DASHSCOPE_API_KEY"), timeout=60, # 增加超时时间 max_retries=5 # 增加重试次数 ) # 3. 加载与索引 if not os.path.exists(DATA_DIR): print(f"错误:未找到路径 {DATA_DIR}") else: # 建议直接使用绝对路径,避免相对路径带来的困扰 print("正在加载文档...") documents = SimpleDirectoryReader(DATA_DIR).load_data() print("正在创建索引(此步涉及 Embedding 接口调用)...") index = VectorStoreIndex.from_documents(documents) # 4. 查询 query_engine = index.as_query_engine() print("正在提问...") response = query_engine.query("2026春运时间是什么时候?") print(f"AI 回答结果:\n{response}")运行方式:
python 01_LlamaIndex.py运行结果:
正在加载文档... 正在创建索引(此步涉及 Embedding 接口调用)... 正在提问... AI 回答结果: 2026年春运的时间是从2月2日至3月13日。LangChain 示例(DeepSeek)
文件名:02_LangChain_DeepSeek.py
import os from dotenv import load_dotenv os.environ['USER_AGENT'] = 'my-rag-app/1.0' load_dotenv() # 1. 加载数据 from langchain_community.document_loaders import TextLoader # 随便复制一些即时新闻放到 txt 文件中,例如:https://baike.baidu.com/item/2026%E5%B9%B4%E6%98%A5%E8%BF%90/66941026?fromModule=home_hotspot loader = TextLoader( file_path="data/a.txt", encoding="utf-8" # 如果是中文文件,确保使用 utf-8 编码 ) docs = loader.load() # 2. 文档分块 from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) all_splits = text_splitter.split_documents(docs) # 3. 设置嵌入模型 # 使用本地 HuggingFace 模型(推荐,免费且稳定),可能需要科学网络 from langchain_huggingface import HuggingFaceEmbeddings embeddings = HuggingFaceEmbeddings( model_name="BAAI/bge-small-zh-v1.5", # 中文模型 model_kwargs={'device': 'cpu'}, encode_kwargs={'normalize_embeddings': True} ) # 4. 存到向量数据库中,为了方便测试,这里使用内存数据库 from langchain_core.vectorstores import InMemoryVectorStore vector_store = InMemoryVectorStore(embeddings) vector_store.add_documents(all_splits) # 5. 构建用户查询,针对前面的即时新闻提问 question = "2026春运时间是什么时候?" # 6. 在向量数据库中搜索最相似的文档 retrived_docs = vector_store.similarity_search(question, k=3) docs_content = "\n\n".join(doc.page_content for doc in retrived_docs) # 7. 构建提示模板 from langchain_core.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_template( """ 基于以下上下文回答问题。如果没有结果,就说没有找到对应信息。 上下文: {context} 问题: {question} 回答: """ ) # 8. 把结果和问题都发给大模型,生成答案 from langchain_deepseek import ChatDeepSeek llm = ChatDeepSeek( model="deepseek-chat", # DeepSeek API 支持的模型名称 temperature=0.7, # 随机性 max_tokens=2048, # 最大输出长度 api_key=os.getenv("DEEPSEEK_API_KEY") # 从环境变量加载API key ) answer = llm.invoke(prompt.format(question=question, context=docs_content)) print(answer.content) # 只打印回答内容