检索增强生成(RAG,Retrieval-Augmented Generation)是一种结合了信息检索技术与语言生成模型的人工智能技术。它通过从外部知识库中检索相关信息,并将其作为提示(Prompt)输入给大型语言模型(LLMs),以增强模型处理知识密集型任务的能力,如问答、文本摘要、内容生成等。
RAG的核心优势在于它能够将传统信息检索系统的优势与生成式大语言模型的功能结合起来,使得LLM能够通过结合额外的知识与自身的语言技能,撰写更准确、更具时效性且更贴合具体需求的文字。RAG技术的目的在于提高生成模型的性能,其关键创新在于打破传统生成模型仅仅依赖自身参数预测输出的限制,转而引入检索策略获取外部知识库中的相关信息,再利用这些信息引导模型生成更准确、更具信息量的内容。
RAG的工作流程通常包括以下几个步骤:
- 检索(Retrieval):根据用户请求从外部知识源检索相关上下文。使用嵌入模型将用户查询嵌入到与向量数据库中的附加上下文相同的向量空间中,执行相似性搜索,并返回矢量数据库中最接近的前k个数据对象。
- 增强(Augment):用户查询和检索到的附加上下文被填充到提示模板中,形成增强的输入。
- 生成(Generate):利用增强后的输入,大型语言模型生成响应或文本。
RAG技术相较于直接使用LLMs进行问答具有多个优点,包括可扩展性、准确性、可控性、可解释性、多功能性和时效性。它允许开发者无需为每个特定任务重新训练大型模型,仅需连接外部知识库,即可为模型注入额外的信息资源,从而显著提升其回答的精确度。这种技术尤其适用于那些高度依赖专业知识的任务,并且能够支持知识内容的灵活更新与个性化配置。
LangChain 是一个专为利用大型语言模型(LLMs)创建应用程序而设计的全面框架。以下是关于 LangChain 的一些关键点:
-
框架目标:LangChain 的主要目标是帮助开发人员轻松构建基于语言模型的应用,与多种语言模型兼容,特别是与 OpenAI ChatGPT 无缝集成。
-
核心组件:LangChain 通过三个核心组件实现增强:
- Components(组件):为 LLMs 提供接口封装、模板提示和信息检索索引。
- Chains(链):将不同的组件组合起来解决特定的任务,比如在大量文本中查找信息。
- Agents(代理):使得 LLMs 能够与外部环境进行交互,例如通过 API 请求执行操作。
-
工具和代理:LangChain 提供各种工具和代理,用于帮助用户在应对挑战和生成有意义的回答时提高效率和便捷性。代理是根据自然语言指令行动的机器人,可以利用工具来回答查询。
-
LangGraph:LangChain 还包含了 LangGraph,这是一个通过将步骤建模为图中的边和节点,构建强大且有状态的多参与者应用程序的框架。它与 LangChain 无缝集成,但也可以单独使用。
-
LangServe 和 LangSmith:LangServe 用于将 LangChain 链部署为 REST API,而 LangSmith 是一个开发者平台,让开发者可以调试、测试、评估和监控 LLM 应用程序。
-
应用场景:LangChain 可以用于构建聊天机器人、生成式问答(GQA)、摘要等多种应用。
-
开发与部署:LangChain 简化了 LLM 应用程序生命周期的每个阶段,从开发到生产化再到部署,提供了一套完整的工具和平台支持。
LangChain 提供了一个灵活的框架,利用公司的数据和 API 构建上下文感知、推理应用程序,并使应用程序的未来证明,通过将供应商可选性作为 LLM 基础设施设计的一部分。通过这个框架,开发者可以构建更加智能和强大的应用程序,这些应用程序能够处理复杂的任务,并且能够与外部数据源和工具进行交互。
"""
本文件是【检索增强生成:通过 RAG 助力鲜花运营】章节的配套代码,课程链接:https://juejin.cn/book/7387702347436130304/section/7388069959185727524
您可以点击最上方的“运行“按钮,直接运行该文件;更多操作指引请参考Readme.md文件。
"""
# 设置OpenAI的API密钥
import osfrom volcenginesdkarkruntime import Ark
from typing import List, Any
from langchain.embeddings.base import Embeddings
from langchain.pydantic_v1 import BaseModel# 初始化Embedding类
class DoubaoEmbeddings(BaseModel, Embeddings):client: Ark = Noneapi_key: str = ""model: strdef __init__(self, **data: Any):super().__init__(**data)if self.api_key == "":self.api_key = os.environ["OPENAI_API_KEY"]self.client = Ark(base_url=os.environ["OPENAI_BASE_URL"],api_key=self.api_key)def embed_query(self, text: str) -> List[float]:"""生成输入文本的 embedding.Args:texts (str): 要生成 embedding 的文本.Return:embeddings (List[float]): 输入文本的 embedding,一个浮点数值列表."""embeddings = self.client.embeddings.create(model=self.model, input=text)return embeddings.data[0].embeddingdef embed_documents(self, texts: List[str]) -> List[List[float]]:return [self.embed_query(text) for text in texts]class Config:arbitrary_types_allowed = Trueembeddings_model = DoubaoEmbeddings(model=os.environ["EMBEDDING_MODELEND"],
)# Embed文本
embeddings = embeddings_model.embed_documents(["您好,有什么需要帮忙的吗?","哦,你好!昨天我订的花几天送达","请您提供一些订单号?","12345678",]
)
print(len(embeddings), len(embeddings[0]))# Embed查询
embedded_query = embeddings_model.embed_query("刚才对话中的订单号是多少?")
print(embedded_query[:3])