小杰-大模型(four)——RAG与Agent设计——Langchain-chain链
1.1 什么是chain(链)
在Langchain中,“链”(Chains)指的是一个概念上的组件或模块,它能够处理输入并产生输出。这个概念类似于编程中的函数或者工作流中的步骤,其中每个链都可以执行特定的任务,如文本生成、问答、翻译等。链条的设计目的是为了提供一种方式来组织和连接不同的自然语言处理(NLP)任务,使得这些任务可以以有序的方式相互作用,从而构建出更加复杂的AI应用。
例如,我们可以构造一条简单链接受用户的输入经过格式化(PromptTemplate)后传递给大模型。
1.2 简单链(内置的链)
1.2.1 LLMchain
LLMchain 是一个简单的链,LLMChain 由 PromptTemplate 和 语言模型(LLM或聊天模型)组成。
LLMchain 简单的链 代码示例
#大模型弄出来
from langchain_openai import ChatOpenAI
#构建聊天模型openai形式
chat_model=ChatOpenAI(
openai_api_key="sk-bhpqpryfyiszcqwugbmjgvvccultcovcgbfbvauxnbbfkcdo", # 替换为你的实际API密钥
base_url="https://api.siliconflow.cn/v1",
model="Qwen/Qwen2.5-7B-Instruct"
)
#输入组装成提示
from langchain.prompts.chat import (SystemMessagePromptTemplate,HumanMessagePromptTemplate,AIMessagePromptTemplate,ChatPromptTemplate)
system_message = SystemMessagePromptTemplate.from_template("You are a helpful assistant."
)
# 创建一个人类消息,用于接收用户的输入
human_message = HumanMessagePromptTemplate.from_template("{user_question}"#"{user_question}"为占位
)# 将这些模板结合成一个完整的聊天提示
chat_prompt = ChatPromptTemplate.from_messages([system_message,human_message,
])#创建链 把提示放入模型
chain=chat_prompt|chat_model
response = chain.invoke({"user_question": "你好"}).content
print(response)
可以观察调试信息了解LLMChain的过程,输入的提示词先被格式化为完整的提示词然后输入LLM结束链得到答案。
因此链的作用就是将Prompt和LLM链接起来,构成一个完整的应用。
1.3 自定义链
通过Langchain 可以轻松自定义链。
例如我们构造一条简单链接受用户的输入并给出回答。
自定义链代码
# 使用LCEL表达式构造自定义链
from langchain_core.output_parsers import StrOutputParser # 导入字符串输出解析器
from langchain_core.prompts import ChatPromptTemplate # 导入聊天提示模板
from langchain_openai import ChatOpenAI # 导入ChatOpenAI模型# 使用 OpenAI API 的 ChatOpenAI 模型
chat_model=ChatOpenAI(
openai_api_key="sk-bhpqpryfyiszcqwugbmjgvvccultcovcgbfbvauxnbbfkcdo", # 替换为你的实际API密钥
base_url="https://api.siliconflow.cn/v1",
model="Qwen/Qwen2.5-7B-Instruct"
)# 创建一个聊天提示模板,其中包含占位符 {topic}
prompt = ChatPromptTemplate.from_template("说出一句包含{topic}的诗句。")# 创建一个字符串输出解析器,用于将语言模型的输出解析为字符串
output_parser = StrOutputParser()# 构造一个链,依次包含提示模板、语言模型和输出解析器
chain = prompt | chat_model | output_parser# 使用链来生成回答,并打印结果
print(chain.invoke({"topic": "马"}))
1.4 检索链 RetrievalQA
检索链是Langchain中的一种特殊类型的链,主要用于从大量的文档数据集中检索相关信息,并且通常与向量数据库(如Chroma、Pinecone、Faiss等)结合使用。
检索链可以帮助我们在处理如知识库查询、文档搜索等场景时,更有效地找到相关的文档片段,并且利用这些文档片段来生成准确的回答。
1.2.2.1 检索增强(RAG)
检索增强是指将检索技术与生成式模型相结合的一种方法。
在传统的生成式模型中,所有的知识都是基于模型在训练阶段学到的信息。而在RAG中,当模型接收到一个查询时,它不仅依赖于自身的知识,还会从外部数据源(如文档、数据库或其他形式的知识库)检索相关信息来辅助生成答案。
这种方法特别适用于需要提供精确信息的场景,比如法律咨询、医疗诊断等领域。
1.2.2.2 词嵌入Embedding
词嵌入是自然语言处理(NLP)领域的一个重要概念,指的是将文本中的词汇或短语映射到多维向量空间的技术。
这些向量不仅捕捉了词语的意义,还反映了词语之间的语义关系。在检索增强的上下文中,词嵌入用于将文档转换成向量形式,以便能够进行高效的相似度比较。
向量数据库存储这些向量,并且可以快速地根据新的查询向量来检索出最相似的文档。
安装依赖:
pip install sentence-transformers==3.3.0
pip install faiss-cpu==1.9.0
pip install langchain-huggingface==0.1.2
sentence-transformers
sentence-transformers 是一个Python库,它提供了预训练的模型来计算句子、段落或短文本的嵌入向量(embeddings)。这些嵌入向量可以用来比较文本之间的相似度,进行聚类分析,或者作为其他机器学习任务的输入特征。这个库基于Transformers架构,如BERT等,并且已经针对特定任务进行了微调,使得用户能够轻松地获取高质量的语义表示。
faiss-cpu
faiss-cpu 是Facebook Research开发的一个高效相似度搜索库的CPU版本。Faiss旨在帮助开发者快速地从大量的向量中找到与查询向量最相似的一组向量。这在推荐系统、图像检索、文档相似度匹配等领域有着广泛的应用。Faiss支持多种距离度量方法,包括余弦相似度、欧氏距离等,并且优化了索引结构以提高搜索速度。
这两个库经常一起使用,首先,使用 sentence-transformers 将文本转换为嵌入向量;然后,利用 faiss-cpu 构建高效的索引结构,以便快速地在大量文本嵌入中进行相似性搜索。这样的组合不仅提高了处理效率,也简化了开发流程。
