【ai】LangChain与RAG
LangChain
这是一个开发大模型相关功能的框架。
核心理念:为各种LLMs实现通用的接口,把LLMs相关组件“链接”在一起。
主要提供六大功能
prompts提示词工程
models调用各类模型
history管理对话历史记录
indexes管理分析各类文档
chains构建功能的执行链条
agent构建智能体
通用大模型的缺陷
知识缺少实时性,训练结束后的新知识不知道
缺乏专业领域知识,因为缺少训练样本
幻觉问题,有时回答看似合理却错误的信息
数据安全性
RAG(Retrieval Augmented Generation)检索增强生成技术可以提供以上问题的解决方案。
简单理解:RAG = 检索技术 + LLM
RAG工作流程
用户提问 -> 检索相关数据 -> 提示词优化+检索到的数据+用户提问打包问模型 -> LLM根据参考资料回答
具体来说分两块内容:
离线索引,比如通过爬虫持续获取最新信息。把提取到的信息划分段落区块,向量化后存储到向量数据库中。
实时检索,用户提问后不直接提交给模型,而是通过检索相关数据加提示词优化打包成最终提示词。
生成,将提示词输入给大模型,获取输出内容。
什么是向量?
向量(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)
用二维空间举例,方向越靠近语义越接近。
