返回文章列表

【ai】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