更新於 2025年9月23日
10 分鐘
:LlamaIndex是一個框架,可幫助您通過索引、檢索和協調工具將您的數據連接到大型語言模型——非常適合RAG、代理(agents)和結構化輸出。
# 1) 安裝# pip install llama-index llama-index-embeddings-openai llama-index-llms-openaiimport osfrom llama_index.core import VectorStoreIndex, SimpleDirectoryReaderfrom llama_index.embeddings.openai import OpenAIEmbeddingfrom llama_index.llms.openai import OpenAI# 2) 配置您的模型 + 嵌入os.environ["OPENAI_API_KEY"] = "YOUR_KEY" # 或使用任何受支持的LLM/嵌入提供程序llm = OpenAI(model="gpt-4o-mini")embed_model = OpenAIEmbedding(model="text-embedding-3-small")# 3) 加載文檔 (例如,./data/*.pdf, .md, .txt)docs = SimpleDirectoryReader("./data").load_data# 4) 構建索引index = VectorStoreIndex.from_documents(docs, embed_model=embed_model)# 5) 創建查詢引擎並提出問題query_engine = index.as_query_engine(llm=llm)response = query_engine.query("文檔中提到了哪些關鍵安全實踐?")print(response)SimpleDirectoryReader,PDF/HTML/Markdown閱讀器BeautifulSoupWebReader,網站地圖閱讀器from llama_index.core import SimpleDirectoryReaderfrom llama_index.readers.web import SimpleWebPageReaderfile_docs = SimpleDirectoryReader("./policies").load_dataweb_docs = SimpleWebPageReader(html_to_text=True).load_dataall_docs = file_docs + web_docsfrom llama_index.core.node_parser import SentenceSplitterfrom llama_index.core import Documentparser = SentenceSplitter(chunk_size=800, chunk_overlap=100)nodes = []for d in all_docs:nodes.extend(parser.get_nodes_from_documents([Document(text=d.text, metadata=d.metadata)]))from llama_index.core import VectorStoreIndex, SummaryIndexfrom llama_index.core.retrievers import BM25Retrieverfrom llama_index.core.query_engine import RetrieverQueryEngine# 來自預解析節點的向量索引v_index = VectorStoreIndex(nodes)# BM25關鍵字檢索器bm25_retriever = BM25Retriever.from_defaults(nodes=nodes, similarity_top_k=6)# 混合:合併候選者,然後重新排序from llama_index.core.retrievers import RouterRetrieverfrom llama_index.retrievers.merge import MergerRetrieverv_retriever = v_index.as_retriever(similarity_top_k=6)hybrid = MergerRetriever(retrievers=[v_retriever, bm25_retriever], top_k=8)query_engine = RetrieverQueryEngine.from_args(retriever=hybrid)source == 'handbook',created_at > 2024-01-01)from llama_index.postprocessor.flag_embedding_reranker import FlagEmbeddingRerankerfrom llama_index.core.query_engine import RetrieverQueryEnginereranker = FlagEmbeddingReranker(top_n=5, model="BAAI/bge-reranker-base")query_engine = v_index.as_query_engine(similarity_top_k=12,node_postprocessors=[reranker])from llama_index.core.response_synthesizers import get_response_synthesizerfrom llama_index.core import ServiceContextsynth = get_response_synthesizer(response_mode="tree_summarize")query_engine = v_index.as_query_engine(response_synthesizer=synth)ans = query_engine.query("總結入職步驟並引用來源。")print(ans)from llama_index.core.prompts import PromptTemplateqa_tmpl = PromptTemplate("""你是一個簡潔、以證據為先的助手。僅使用提供的上下文。如果不確定,請說你不知道。返回帶有鍵的JSON:answer, sources。問題:{query_str}上下文:{context_str}""")query_engine = v_index.as_query_engine(text_qa_template=qa_tmpl)from llama_index.core.agent import ReActAgentfrom llama_index.tools.sql import SQLQueryEngineToolfrom sqlalchemy import create_engineengine = create_engine("sqlite:///analytics.db")sql_tool = SQLQueryEngineTool.from_engine(engine)agent = ReActAgent.from_tools([sql_tool], llm=llm, verbose=True)agent.chat("2025年第二季度的每月客戶流失率是多少?如果需要,查詢數據庫。")from llama_index.core.evaluation import FaithfulnessEvaluator, RelevancyEvaluatorfaith = FaithfulnessEvaluator(llm=llm)rel = RelevancyEvaluator(llm=llm)pred = query_engine.query("列出我們政策中的SOC 2控制系列。")print("faithful?", faith.evaluate_response(pred))print("relevant?", rel.evaluate_response(pred))# 示例:Chroma# pip install chromadb llama-index-vector-stores-chromafrom llama_index.vector_stores.chroma import ChromaVectorStorefrom llama_index.core import StorageContextimport chromadbchroma_client = chromadb.PersistentClient(path="./chroma_store")collection = chroma_client.get_or_create_collection("company_knowledge")vector_store = ChromaVectorStore(chroma_collection=collection)storage_context = StorageContext.from_defaults(vector_store=vector_store)index = VectorStoreIndex.from_documents(all_docs, storage_context=storage_context)# 示例:查詢時基於元數據的過濾retriever = index.as_retriever(similarity_top_k=8)retriever.metadata_filters = {"department": ["legal", "security"], "published": [True]}/query端點;保持索引在內存中。# 最小的FastAPI包裝器# pip install fastapi uvicornfrom fastapi import FastAPIapp = FastAPIqe = index.as_query_engine(llm=llm)@app.post("/query")async def query(payload: dict):q = payload.get("q", "")resp = qe.query(q)return {"answer": str(resp), "sources": [s.node.metadata for s in resp.source_nodes]}