python
import os
import dotenv
from llama_index.core import Settings, SimpleDirectoryReader, VectorStoreIndex, StorageContext,get_response_synthesizer
from llama_index.core.response_synthesizers import ResponseMode
from llama_index.core.postprocessor import LLMRerank, SimilarityPostprocessor
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import QueryFusionRetriever
from llama_index.embeddings.dashscope import DashScopeEmbedding,DashScopeTextEmbeddingModels
from llama_index.llms.dashscope import DashScope,DashScopeGenerationModels
from llama_index.core.chat_engine import CondenseQuestionChatEngine
from llama_index.vector_stores.qdrant import QdrantVectorStore
from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance
dotenv.load_dotenv()
os.environ["DASHSCOPE_API_KEY"] = os.getenv("DASHSCOPE_API_KEY")
PATH = "./qdrant_db"
EMBEDDING_DIM = 1536
COLLECTION_NAME = "full_demo"
client = QdrantClient(path=PATH)
# 指定全局的LLM
Settings.llm = DashScope(DashScopeGenerationModels.QWEN_MAX,api_key=os.getenv("DASHSCOPE_API_KEY"))
Settings.embed_model = DashScopeEmbedding(DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V1,api_key=os.getenv("DASHSCOPE_API_KEY"))
documents = SimpleDirectoryReader('./data').load_data()
if client.collection_exists(collection_name=COLLECTION_NAME):
client.delete_collection(collection_name=COLLECTION_NAME)
collection = client.create_collection(collection_name=COLLECTION_NAME, vectors_config=VectorParams(size=EMBEDDING_DIM, distance=Distance.COSINE))
vector_store = QdrantVectorStore(
client=client,
collection_name=COLLECTION_NAME
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex(documents, storage_context=storage_context)
# 定义检索后的排序模型
reranker = LLMRerank(top_n=2)
sp = SimilarityPostprocessor(similarity_cutoff=0.6)
# 定义 RAG Fusion 检索器
fusion_retriever = QueryFusionRetriever(
retrievers=[index.as_retriever()],
similarity_top_k=5,
num_queries=3,
use_async=False
)
query_engine = RetrieverQueryEngine.from_args(
fusion_retriever,
node_postprocessors=[reranker],
response_synthesizer=get_response_synthesizer(
response_mode = ResponseMode.REFINE
)
)
# 10. 对话引擎
chat_engine = CondenseQuestionChatEngine.from_defaults(
query_engine=query_engine
)
while True:
question = input("User: ")
if question.strip() == "":
break
response = chat_engine.chat(question)
print(f"AI: {response}")