返回文章列表

02 LangChain 与 RAG 基本概念

LangChain

这是一个开发大模型相关功能的框架。

核心理念:为各种 LLMs 实现通用的接口,把 LLMs 相关组件“链接”在一起。

主要提供六大功能

  1. prompts 提示词工程

  2. models 调用各类模型

  3. history 管理对话历史记录

  4. indexes 管理分析各类文档

  5. chains 构建功能的执行链条

  6. agent 构建智能体

通用大模型的缺陷

  1. 知识缺少实时性,训练结束后的新知识无法获取

  2. 缺乏专业领域知识,因为缺少相应的训练样本

  3. 幻觉问题,有时回答看似合理却错误的信息

  4. 数据安全性

RAG (Retrieval Augmented Generation)检索增强生成技术可以提供以上问题的解决方案。

简单理解:RAG = 检索技术 + LLM

RAG 工作流程

用户提问 -> 检索相关数据 -> 提示词优化 + 检索到的数据 + 用户提问打包问模型 -> LLM 根据参考资料回答

具体来说包括以下三步:

  1. 离线索引,比如通过爬虫持续获取最新信息。把提取到的信息划分段落区块,向量化后存储到向量数据库中。

  2. 实时检索,用户提问后不直接提交给模型,而是通过检索相关数据加提示词优化打包成最终提示词。

  3. 生成,将提示词输入给大模型,获取输出内容。

什么是向量?

向量(Vector),指把文本的语义讯息转化成一串固定长度的数字列表,让计算机能“读懂”文字含义并进行相似度计算。

向量嵌入的过程,通常选用文本嵌入模型来做。文本嵌入模型通过深度学习等技术,可以从文本提取语义特征,映射成固定长度的数字序列。

拿到数字数列之后,通过余弦相似度算法计算,可以获得两句话之间的语义相似度(越靠近1越相似),由此提高语义匹配的效率。

文本嵌入模型的语义维度是很重要的指标,如 text-embedding-v1 模型,它可以生成 1536 维的向量。大致理解成,某段文本在 1536 个“主题”(抽象语义特征)上的得分(强度)。

维度越多,语义匹配越精准。维度越多,计算性能压力越大。

什么是余弦相似度

向量的数字序列共同决定了向量在高维空间中的方向和长度。而余弦相似度算法就是排除长度的影响,得到方向的夹角。夹角越小越相似,即方向相同。

余弦相似度的公式:余弦相似度 = 两个向量的点积 / 两个向量的模长的乘积

cos_sim = (vec_a · vec_b) / (||vec_a|| × ||vec_b||)

def get_dot(vec_a, vec_b)
  """计算两个向量的点积"""
  if len(vec_a)!= len(vec_b)
    raise ValueError("2个向量必须维度相同")
  dot_sum = 0
  for a,b in zip(vec_a, vec_b)
    dot_sum += a * b
  return dot_sum

def get_norm(vec)
  """计算向量模长"""
  sum_square = 0
  for v in vec:
    sum_square += v * v
  return numpy.sqrt(sum_square)

def cos_similarity(vec_a, vec_b)
  """余弦相似度"""
  return get_dot(vec_a, vec_b)/get_norm(vec_a) * get_norm(vec_b)

用二维空间举例,方向越靠近语义越接近。

image