LangGraph构建AI智能体:基于RAG的文档检索与相似度计算实践

一、RAG技术概述与核心价值

在构建AI智能体的过程中,信息检索的准确性与效率直接影响生成结果的质量。传统生成模型依赖训练数据中的知识,难以应对实时变化或长尾领域的信息需求。RAG(Retrieval-Augmented Generation)技术通过引入外部知识检索机制,将生成过程分为“检索-增强-生成”三阶段,显著提升了智能体对动态信息的适应能力。

RAG的核心价值体现在两方面:

  1. 动态知识更新:无需重新训练模型,即可通过检索最新文档获取实时信息;
  2. 减少幻觉风险:通过精确检索相关文档,降低生成内容与事实不符的概率。

以医疗咨询场景为例,RAG智能体可实时检索最新医学文献,为用户提供基于证据的回答,而非依赖模型训练时的静态知识。

二、文本嵌入:从自然语言到向量的转换

1. 词嵌入的原理与实现

词嵌入(Word Embedding)是将文本映射为高维向量的技术,其核心思想是通过神经网络学习词语的语义表示。例如,句子“人工智能正在改变世界”会被转换为一个1024维的浮点数数组,每个维度代表一个语义特征。

  1. from langchain.embeddings import HuggingFaceEmbeddings # 通用嵌入模型示例
  2. embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
  3. text = "人工智能正在改变世界"
  4. vector = embeddings.embed_query(text) # 输出形状为(1024,)的数组
  5. print(f"嵌入向量维度: {len(vector)}")

2. 批量文本处理优化

在实际应用中,需同时处理大量文档。可通过以下方式优化嵌入效率:

  • 批量嵌入:使用生成器或并行处理减少I/O开销;
  • 分块策略:对长文档按段落或章节分割,避免信息丢失;
  • 缓存机制:对重复文本复用已有嵌入结果。
  1. def batch_embed_documents(documents, embeddings_model):
  2. """批量嵌入文档并返回向量列表"""
  3. vectors = []
  4. for doc in documents:
  5. vec = embeddings_model.embed_documents([doc.page_content])[0]
  6. vectors.append((doc.metadata["source"], vec))
  7. return vectors

三、向量数据库:高效存储与检索

1. 向量数据库选型与对比

向量数据库需支持高维向量的快速存储与相似度查询。常见方案包括:

  • 内存型数据库:如InMemoryVectorStore,适用于开发测试;
  • 持久化数据库:如某开源向量数据库,支持分布式扩展;
  • 云服务集成:对象存储+向量索引的组合方案。
方案 优势 适用场景
内存型 零延迟,无需网络调用 本地开发、小规模数据
持久化数据库 支持海量数据,高可用 生产环境、千万级向量
云服务 免运维,弹性扩展 快速上线、资源敏感型

2. 文档索引构建流程

InMemoryVectorStore为例,构建索引的完整流程如下:

  1. 嵌入文档:将所有文档转换为向量;
  2. 存储元数据:保留文档来源、章节等上下文信息;
  3. 创建索引:将向量与元数据关联存储。
  1. from langchain.vectorstores import InMemoryVectorStore
  2. from langchain.schema import Document
  3. documents = [
  4. Document(page_content="深度学习是机器学习的分支", metadata={"source": "book1"}),
  5. Document(page_content="Transformer架构改变了NLP", metadata={"source": "paper2"})
  6. ]
  7. # 嵌入并存储文档
  8. embeddings = HuggingFaceEmbeddings()
  9. vectors = [embeddings.embed_query(doc.page_content) for doc in documents]
  10. vector_store = InMemoryVectorStore.from_documents(
  11. documents, embeddings
  12. )

四、相似度计算:从向量到相关文档

1. 余弦相似度算法详解

余弦相似度通过计算两个向量夹角的余弦值衡量语义相似度,值域为[-1,1],值越接近1表示越相似。

  1. import numpy as np
  2. def cosine_similarity(vec1, vec2):
  3. """计算两个向量的余弦相似度"""
  4. dot_product = np.dot(vec1, vec2)
  5. norm1 = np.linalg.norm(vec1)
  6. norm2 = np.linalg.norm(vec2)
  7. return dot_product / (norm1 * norm2)
  8. # 示例:计算查询与文档的相似度
  9. query_vec = embeddings.embed_query("什么是深度学习?")
  10. doc_vec = embeddings.embed_query("深度学习是机器学习的分支")
  11. similarity = cosine_similarity(query_vec, doc_vec)
  12. print(f"相似度: {similarity:.4f}")

2. 检索流程优化实践

实际检索中需结合以下策略提升效率:

  • 多级检索:先通过关键词过滤,再计算向量相似度;
  • 阈值过滤:设置相似度下限,避免返回无关结果;
  • 重排序策略:对Top-K结果进行二次评分(如结合BM25)。
  1. def hybrid_retrieval(query, vector_store, embeddings, threshold=0.7):
  2. """混合检索:关键词+向量相似度"""
  3. # 假设已有关键词检索函数keyword_search
  4. candidate_docs = keyword_search(query)
  5. query_vec = embeddings.embed_query(query)
  6. results = []
  7. for doc in candidate_docs:
  8. doc_vec = embeddings.embed_query(doc.page_content)
  9. sim = cosine_similarity(query_vec, doc_vec)
  10. if sim >= threshold:
  11. results.append((doc, sim))
  12. # 按相似度排序
  13. results.sort(key=lambda x: x[1], reverse=True)
  14. return [doc for doc, sim in results]

五、完整RAG示例:从查询到响应

以下是一个端到端的RAG智能体实现示例,涵盖嵌入、存储、检索与生成全流程:

  1. from langchain.chains import RetrievalQA
  2. from langchain.llms import MockLLM # 模拟LLM响应
  3. class RAGAgent:
  4. def __init__(self, embeddings, vector_store):
  5. self.embeddings = embeddings
  6. self.vector_store = vector_store
  7. self.llm = MockLLM() # 替换为实际LLM
  8. def index_documents(self, documents):
  9. """索引新文档"""
  10. self.vector_store.add_documents(documents)
  11. def query(self, question, top_k=3):
  12. """执行RAG查询"""
  13. retriever = self.vector_store.as_retriever(search_kwargs={"k": top_k})
  14. qa_chain = RetrievalQA.from_chain_type(
  15. llm=self.llm,
  16. chain_type="stuff",
  17. retriever=retriever
  18. )
  19. return qa_chain.run(question)
  20. # 使用示例
  21. documents = [Document(page_content="..."), ...] # 实际文档列表
  22. agent = RAGAgent(embeddings, vector_store)
  23. agent.index_documents(documents)
  24. response = agent.query("人工智能的发展趋势是什么?")
  25. print(response)

六、性能优化与最佳实践

  1. 嵌入模型选择:根据场景平衡精度与速度,小模型(如all-MiniLM-L6-v2)适合实时应用,大模型(如bge-large-en)适合高精度场景;
  2. 向量压缩:使用PCA或量化技术减少存储空间;
  3. 索引更新策略:增量更新替代全量重建,降低维护成本;
  4. 监控与调优:跟踪检索延迟、准确率等指标,持续优化。

通过以上方法,开发者可构建出高效、准确的RAG智能体,为AI应用提供强大的知识检索能力。