检索增强生成(Retrieval-Augmented Generation, RAG) 是一种结合了检索和生成两种关键技术的机器学习方法。这种方法在自然语言处理任务中特别有效,例如对话系统和问答系统。
• RAG 首先从大型数据集或知识库中检索与用户查询相关的文档或数据。
• 通常使用信息检索技术,如向量搜索或关键词匹配。
• 在检索到相关信息后,模型生成一个响应或答案,结合检索到的内容和原始查询。
• 通常使用生成模型,如 GPT(生成式预训练变换器)或类似的架构。
• 提高准确性:通过结合检索和生成,RAG 可以提供更准确和上下文相关的答案。
• 知识利用:它可以利用大量外部知识,适用于复杂查询,而简单的生成模型可能无法处理。
• 动态响应:系统可以生成不仅基于预定义响应,还针对特定用户查询和检索信息定制的答案。
• 聊天机器人:RAG 可用于创建提供准确且上下文相关答案的对话代理。
• 问答系统:它在需要基于大型数据集回答问题的系统中表现出色,例如客户支持或教育平台。
• 内容生成:RAG 可以通过检索相关信息并将其整合为连贯的叙述来辅助内容生成。
大型语言模型(LLM)是驱动智能聊天机器人和其他自然语言处理(NLP)应用的关键人工智能技术。目标是创建能够通过参考权威知识源回答用户问题的机器人。然而,LLM 技术的不确定性可能导致以下问题:
• 提供虚假信息。
• 提供过时或通用信息,而用户需要具体、当前的响应。
• 从非权威来源生成响应。
• 由于术语混淆,不同训练源使用相同术语讨论不同事物,可能导致不准确的响应。
RAG 是解决这些挑战的一种方法。它将 LLM 重定向到从预定的权威知识源中检索相关信息。组织对生成的文本输出有更多控制,用户可以了解 LLM 如何生成响应。
在没有 RAG 的情况下,LLM 根据其训练数据或已知信息生成响应。RAG 引入了一个信息检索组件,该组件使用用户输入从新数据源中提取信息。用户查询和相关信息都被提供给 LLM。LLM 使用新知识和其训练数据来生成更好的响应。
LLM 原始训练数据集之外的新数据称为外部数据。它可以来自多个数据源,如 API、数据库或文档库。数据可以以各种格式存在,如文件、数据库记录或长文本。另一种称为嵌入语言模型的 AI 技术将数据转换为数字表示并存储在向量数据库中。此过程创建了一个生成式 AI 模型可以理解的知识库。
下一步是执行相关性搜索。用户查询被转换为向量表示并与向量数据库匹配。例如,考虑一个可以回答组织人力资源问题的智能聊天机器人。如果员工搜索**“我有多少年假?”**,系统将检索年假政策文件以及员工过去的休假记录。这些特定文档将被返回,因为它们与员工输入的内容高度相关。相关性通过数学向量计算和表示来建立。
接下来,RAG 模型通过添加上下文中的检索相关数据来增强用户输入(或提示)。此步骤使用提示工程技术来有效地与 LLM 通信。增强的提示允许大型语言模型生成准确的用户查询答案。
接下来的问题可能是——如果外部数据过时了怎么办?为了保持检索的当前信息,异步更新文档并更新文档的嵌入表示。您可以通过自动实时过程或定期批处理过程来完成此操作。这是数据分析中的常见挑战——可以使用不同的数据科学方法进行变更管理。
LangChain 是一个为开发使用大型语言模型(LLM)的应用程序而设计的框架。它提供了工具和抽象,简化了将 LLM 集成到各种工作流中的过程,使开发者能够创建更复杂和功能丰富的应用程序。
使用 LangChain 在 Spring Boot Java 中实现 RAG 应用程序。
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>rag</artifactId>
<properties> <java.version>17</java.version> <langchain4j.version>0.23.0</langchain4j.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j</artifactId> <version>${langchain4j.version}</version> </dependency> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-open-ai</artifactId> <version>${langchain4j.version}</version> </dependency> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-embeddings</artifactId> <version>${langchain4j.version}</version> </dependency> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId> <version>${langchain4j.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build></project>
@Controller@RequiredArgsConstructorpublic class SBotController { private final SBotService sBotService; @PostMapping("/ask") public ResponseEntity<String> ask(@RequestBody String question) { try { return ResponseEntity.ok(sBotService.askQuestion(question)); } catch (Exception e) { return ResponseEntity.badRequest().body("Sorry, I can't process your question right now."); } }}Service和其他配置
@Service@RequiredArgsConstructor@Slf4jpublic class SBotService { private final ConversationalRetrievalChain chain; public String askQuestion(String question) { log.debug("======================================================"); log.debug("Question: " + question); String answer = chain.execute(question); log.debug("Answer: " + answer); log.debug("======================================================"); return answer; }}
@RequiredArgsConstructor@Slf4jpublic class EmbeddingStoreLoggingRetriever implements Retriever<TextSegment> { private final EmbeddingStoreRetriever retriever; @Override public List<TextSegment> findRelevant(String text) { List<TextSegment> relevant = retriever.findRelevant(text); relevant.forEach(segment -> { log.debug("======================================================="); log.debug("Found relevant text segment: {}", segment); }); return relevant; }}
@Configuration@RequiredArgsConstructor@Slf4jpublic class LangChainConfiguration { @Value("${langchain.api.key}") private String apiKey; @Value("${langchain.timeout}") private Long timeout; private final List<Document> documents; @Bean public ConversationalRetrievalChain chain() { EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>(); EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder() .documentSplitter(DocumentSplitters.recursive(500, 0)) .embeddingModel(embeddingModel) .embeddingStore(embeddingStore) .build(); log.info("Ingesting Spring Boot Resources ..."); ingestor.ingest(documents); log.info("Ingested {} documents", documents.size()); EmbeddingStoreRetriever retriever = EmbeddingStoreRetriever.from(embeddingStore, embeddingModel); EmbeddingStoreLoggingRetriever loggingRetriever = new EmbeddingStoreLoggingRetriever(retriever); /*MessageWindowChatMemory chatMemory = MessageWindowChatMemory.builder() .maxMessages(10) .build();*/ log.info("Building ConversationalRetrievalChain ..."); ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder() .chatLanguageModel(OpenAiChatModel.builder() .apiKey(apiKey) .timeout(Duration.ofSeconds(timeout)) .build() ) .promptTemplate(PromptTemplate.from(PROMPT_TEMPLATE_2)) //.chatMemory(chatMemory) .retriever(loggingRetriever) .build(); log.info("Spring Boot knowledge base is ready!"); return chain; }}
RAG 是一种强大的方法,通过结合信息检索和文本生成的优势,增强了 AI 系统的能力。
欢迎关注 SpringForAll社区(spring4all.com),专注分享关于Spring的一切!关注公众号:SpringForAll社区,回复“加群”还可加入Spring技术交流群!
给大家推荐我们团队开发的Chrome插件:YouTube中文配音。如果您跟我们一样,热爱看国外的视频学习前沿知识或者其他内容,该插件可以很好的帮助您讲外语视频一键转化为中文视频,官网:https://www.youtube-dubbing.com/
现如今大模型岗位需求越来越大,但是相关岗位人才难求,薪资持续走高,AI运营薪资平均值约18457元,AI工程师薪资平均值约37336元,大模型算法薪资平均值约39607元。
掌握大模型技术你还能拥有更多可能性:
• 成为一名全栈大模型工程师,包括Prompt,LangChain,LoRA等技术开发、运营、产品等方向全栈工程;
• 能够拥有模型二次训练和微调能力,带领大家完成智能对话、文生图等热门应用;
• 薪资上浮10%-20%,覆盖更多高薪岗位,这是一个高需求、高待遇的热门方向和领域;
• 更优质的项目可以为未来创新创业提供基石。
可能大家都想学习AI大模型技术,也_想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把都打包整理好,希望能够真正帮助到大家_。
[CSDN大礼包:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()
很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,下面是我整理好的一套完整的学习路线,希望能够帮助到你们学习AI大模型。
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
【一一AGI大模型学习 所有资源获取处(无偿领取)一一】
所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~
[CSDN大礼包:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()