本文深入浅出地介绍了LangChain框架及其在开发基于语言模型的应用程序中的重要性。文章首先讲解了语言模型的基础概念,包括大语言模型、提示词工程和词嵌入技术,随后详细阐述了LangChain框架的核心组件,如模型输入输出处理、内存管理和检索功能。此外,还介绍了如何使用LangChain构建复杂的应用程序,包括链和智能体的应用。通过本文,读者可以了解LangChain的基本用法,为开发基于语言模型的应用程序打下坚实基础。
1、引言
在本教程中,我们将详细探讨 LangChain 这一用于开发基于语言模型的应用程序的框架。首先,我们会介绍一些与语言模型相关的基本概念,这些概念将对本教程的学习有所帮助。
虽然 LangChain 主要支持 Python 和 JavaScript/TypeScript 版本,但也可以使用 Java 来运行 LangChain。我们将先介绍 LangChain 作为框架的基本组成部分,然后再尝试在 Java 环境中实现这些功能。
2、背景信息
在深入探讨为什么我们需要一个用于构建由语言模型驱动的应用程序的框架之前,我们首先需要了解什么是语言模型。此外,我们还将讨论在处理语言模型时可能会遇到的一些常见挑战。
- 1 大语言模型(Large Language Models)
语言模型是一种自然语言的概率模型,它能够生成一系列词语的概率分布。
大语言模型是一种规模较大的语言模型,它们是由具有数十亿参数的人工神经网络构成的。
大语言模型通常是在大量未标注的数据上进行预训练的,这些训练是通过自监督式和半监督式学习技术实现的。之后,预训练的模型会通过各种方法进行调整,以适应特定的任务需求,比如微调技术和提示词工程等。
这些大语言模型能够执行多种自然语言处理任务,比如语言翻译和内容总结。同时,它们还能进行创作性任务,比如内容生成。因此,它们在回答问题的应用场景中能够发挥非常重要的作用。
几乎所有主要的云服务提供商都在其服务产品中包含了大语言模型。例如,Microsoft Azure 提供了如 Llama 2 和 OpenAI GPT-4 这样的大语言模型。而 Amazon Bedrock 则提供了来自 AI21 Labs、Anthropic、Cohere、Meta 以及 Stability AI 等公司的模型。
- 2. 提示词工程(Prompt Engineering)
大语言模型是基于大量文本数据训练得到的基础模型。因此,它们能够捕捉人类语言所具有的语法和语义特征。不过,为了使其能够完成特定的任务,我们还需要对它们进行进一步的调整和优化。
提示词工程是快速适配大语言模型的一种方式。这是一种对文本进行结构化的过程,使得大语言模型能够理解和处理这些文本。在这里,我们使用自然语言来描述我们希望大语言模型能够完成的任务。
我们创建的提示词有助于让大语言模型在特定上下文中进行学习,但这种帮助是暂时的。我们可以通过设计合适的提示词来促进大语言模型的安全使用,并开发新的功能,比如让大语言模型具备领域知识和外部工具的使用能力。
这是一项活跃的研究领域,新的技术不断被开发出来。不过,像“思维链提示词(chain-of-thought prompting)”这样的技术已经相当流行了。其原理是让大语言模型通过一系列中间步骤来解决问题,然后再给出最终的答案。
- 3. 词嵌入技术(Word Embeddings)
正如我们所看到的,大语言模型能够处理大量的自然语言文本。如果我们把自然语言中的单词表示为词嵌入形式,那么大语言模型的性能将会大幅提升。词嵌入是一种实数向量,它能够编码单词的含义。
通常,词嵌入是通过使用类似 Tomáš Mikolov 的 Word2vec 或斯坦福大学的 GloVe 算法来生成的。GloVe 是一种无监督学习算法,它基于从语料库中提取的全局”词-词(word-word)“共现统计数据进行训练。
在提示词工程领域,我们将提示词转换为单词嵌入形式,这样模型就能更好地理解提示词并作出相应的响应。此外,这种方法还有助于扩展模型所能处理的上下文范围,使其能够给出更丰富的上下文相关的答案。
例如,我们可以从现有的数据集中生成词嵌入,并将它们存储在一个向量数据库中。此外,我们可以使用用户提供的输入来对这个向量数据库进行语义搜索。然后,我们可以将搜索结果作为模型的额外上下文信息。
3、基于 LangChain 的 LLM 技术栈
正如我们已经看到的,创建有效的提示词是成功利用大语言模型的关键所在。这意味着要让与语言模型的互动具有上下文意识,并且能够依赖语言模型来进行推理。
为此,我们需要完成几项任务,比如创建用于提示词的模板、调用语言模型,以及从多个来源获取用户特定的数据供语言模型使用。为了让这些任务更加简单,我们需要一个类似 LangChain 的框架作为我们 LLM 技术栈的一部分。
该框架还有助于开发需要串联多个语言模型的应用程序,并且能够记住与语言模型之间过往交互的信息。此外,还有一些更复杂的应用场景,其中语言模型被用作推理引擎。
最后,我们可以进行日志记录、监控、流式处理以及其他必要的维护与故障排除操作。大语言模型技术栈正在迅速发展,以解决这些相关问题。不过,LangChain 正迅速成为大语言模型技术栈中的重要组成部分。
4、适用于 Java 语言的 LangChain
LangChain 于 2022 年作为一个开源项目诞生,很快便凭借社区的支持获得了发展势头。该项目最初由 Harrison Chase 用 Python 语言开发,后来成为了人工智能领域增长最快的初创企业之一。
在 2023 年初,该项目的 JavaScript/TypeScript 版本问世了,这一版本遵循了 Python 版本的设计思路。很快,这个版本就变得非常受欢迎,并且开始支持多种 JavaScript 环境,如 Node.js、网页浏览器、CloudFlare Workers、Vercel/Next.js、Deno 以及 Supabase Edge 函数等。
遗憾的是,目前并没有适用于 Java/Spring 应用程序的官方 Java 版本的 LangChain。不过,有一个名为 LangChain4j 的社区版 Java 版本可供使用。该版本支持 Java 8 及以上版本,并且兼容 Spring Boot 2 和 3。
LangChain 的各种依赖项都可以在 Maven 中央仓库中找到。根据我们的需求,我们可能需要在应用中添加一个或多个依赖项。
<dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j</artifactId> <version>0.23.0</version></dependency>例如,我们还会需要一些依赖库来支持与 OpenAI 模型的集成,提供嵌入功能的支持,以及像 all-MiniLM-L6-v2 这样的句子转换模型,这些都在本教程的后续章节中会有介绍。
与 LangChain 具有相似的设计目标,LangChain4j 同样提供了简单且连贯的抽象层结构,同时拥有丰富的实现方式。它已经支持多种语言模型提供商,例如 OpenAI,以及像 Pinecone 这样的嵌入存储提供商。
不过,由于 LangChain 和 LangChain4j 都在快速发展中,因此 Python 或 JS/TS 版本中可能包含一些在 Java 版本中尚未存在的功能。不过,基本概念、整体结构和相关术语基本上都是相同的。
5、LangChain 的构建基础
LangChain 为我们的应用程序提供了多种有价值的解决方案,这些解决方案可以作为模块组件来使用。模块组件不仅提供了有用的抽象层,还包含了一系列用于处理语言模型的实现。下面我们将通过一些 Java 示例来介绍这些模块。
- 1. 模型输入/输出处理(Models I/O)
在处理任何语言模型时,我们都需要能够与其进行交互的能力。LangChain 提供了必要的功能,比如可以模板化提示词,以及动态选择和管理模型输入的能力。此外,我们还可以使用输出解析器从模型输出中提取信息。
提示词模板是预先定义好的生成语言模型提示词的配方。这些模板可能包括指导方针、少量样本示例以及特定的上下文信息。
PromptTemplate promptTemplate = PromptTemplate .from("Tell me a {{adjective}} joke about {{content}}..");Map<String, Object> variables = new HashMap<>();variables.put("adjective", "funny");variables.put("content", "computers");Prompt prompt = promptTemplate.apply(variables);在这里,我们创建了一个可以接受多个变量的提示词模板。这些变量是从用户输入中获得的,然后会被传递给提示词模板。
LangChain 支持与两种类型的模型进行集成:语言模型和聊天模型。聊天模型同样基于语言模型构建,但提供了聊天功能。
ChatLanguageModel model = OpenAiChatModel.builder() .apiKey(<OPENAI_API_KEY>) .modelName(GPT_3_5_TURBO) .temperature(0.3) .build();String response = model.generate(prompt.text());在这里,我们使用特定的 OpenAI 模型以及相关的 API 密钥来创建一个聊天模型。可以通过免费注册的方式从 OpenAI 获取 API 密钥。参数“temperature”用于控制模型输出的随机性。
最后,语言模型的输出可能缺乏足够的结构化格式,无法用于展示。
LangChain 提供了输出解析工具,可以帮助我们整理语言模型的响应——例如,将输出中的信息提取出来,以 Java 的 POJO 格式呈现。
- 2. 内存(Memory)
通常,利用大语言模型的应用程序会拥有对话式界面。任何对话的一个重要方面就是能够引用在对话中之前引入的信息。而存储关于以往交互的信息的能力被称为记忆功能。
LangChain 为增强应用程序的记忆功能提供了重要的支持机制。例如,我们需要能够从内存中读取数据以丰富用户输入的内容。此外,我们还需要能够把当前运行过程中的输入和输出结果存储到内存中。
ChatMemory chatMemory = TokenWindowChatMemory .withMaxTokens(300, new OpenAiTokenizer(GPT_3_5_TURBO));chatMemory.add(userMessage("Hello, my name is Kumar"));AiMessage answer = model.generate(chatMemory.messages()).content();System.out.println(answer.text()); // Hello Kumar! How can I assist you today?chatMemory.add(answer);chatMemory.add(userMessage("What is my name?"));AiMessage answerWithName = model.generate(chatMemory.messages()).content();System.out.println(answer.text()); // Your name is Kumar.chatMemory.add(answerWithName);在这里,我们实现了一种基于 TokenWindowChatMemory 的固定窗口聊天内存机制。这种机制使我们能够读写与语言模型交换的聊天消息。
LangChain 还提供了更复杂的数据结构和算法,能够从中选择返回某些消息,而不是全部返回。例如,它可以支持返回过去几条消息的摘要,或者只返回与当前操作相关的消息。
- 3. 检索
大语言模型通常是在大量的文本数据集中进行训练的。因此,它们在处理一般任务时表现得相当高效,但在处理特定领域的任务时可能就不那么有用了。为了解决这个问题,我们需要提取相关的外部数据,并在生成过程中将其传递给语言模型。
这个过程被称为增强生成式检索(RAG)。它有助于让模型基于相关且准确的信息进行运作,同时还能让我们了解模型的生成过程。LangChain 提供了构建此类应用所需的基本框架。
首先,LangChain 提供了文档加载器,用于从存储位置获取文档。此外,还有各种处理工具可以帮助对文档进行进一步处理。例如,我们可以把大文档分割成较小的部分来处理。
Document document = FileSystemDocumentLoader.loadDocument("simpson's_adventures.txt");DocumentSplitter splitter = DocumentSplitters.recursive(100, 0, new OpenAiTokenizer(GPT_3_5_TURBO));List<TextSegment> segments = splitter.split(document);在这里,我们使用 FileSystemDocumentLoader 从文件系统中加载文档。之后,我们使用 OpenAiTokenizer 将文档拆分成更小的片段。
为了更高效地执行检索操作,通常会将文档转换为嵌入格式,并存储到向量数据库中。LangChain 支持多种嵌入处理方案和方法,并且可以与几乎所有流行的向量存储系统进行集成:
EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();List<Embedding> embeddings = embeddingModel.embedAll(segments).content();EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();embeddingStore.addAll(embeddings, segments);在这里,我们使用 AllMiniLmL6V2EmbeddingModel 模型来生成文档段的嵌入向量。之后,将这些嵌入向量存储在一个内存中的向量存储中。
现在,我们的外部数据已经以嵌入格式存储在向量存储中,我们可以开始从中检索信息了。LangChain 支持多种检索算法,比如简单的语义搜索,以及更复杂的集成式检索算法。
String question = "Who is Simpson?";//The assumption here is that the answer to this question is contained in the document we processed earlier.Embedding questionEmbedding = embeddingModel.embed(question).content();int maxResults = 3;double minScore = 0.7;List<EmbeddingMatch<TextSegment>> relevantEmbeddings = embeddingStore .findRelevant(questionEmbedding, maxResults, minScore);我们首先构建了用户问题的嵌入表示,然后利用这一嵌入信息从向量仓库中检索出相关的结果。现在,我们可以将这些相关的结果作为上下文信息,将它们添加到我们打算发送给模型的提示词中。
6、LangChain 技术的复杂应用
到目前为止,我们已经了解了如何使用各个组件来构建带有语言模型的应用程序。LangChain 还提供了一些组件,可以帮助我们构建更复杂的应用程序。例如,我们可以利用链和智能体来构建具有更强功能的自适应型应用程序。
- 1. 链(Chains)
通常,一个应用程序需要调用多个组件,并且这些组件的调用顺序是有要求的。在 LangChain 中,这种情况被称为“链”。这种方式简化了复杂应用程序的开发过程,也使得调试、维护和改进变得更加容易。
这种方法也非常适用于将多个链条组合起来,以构建更复杂的应用。在这种情况下,可能需要与多种语言模型进行交互。LangChain 提供了便捷的方式来创建这样的链条组合,并且提供了许多预构建的链条选项。
ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder() .chatLanguageModel(chatModel) .retriever(EmbeddingStoreRetriever.from(embeddingStore, embeddingModel)) .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) .promptTemplate(PromptTemplate .from("Answer the following question to the best of your ability: {{question}}/n/nBase your answer on the following information:/n{{information}}")) .build();在这里,我们使用了一种预构建的对话链 ConversationalRetreivalChain。通过这个链条,我们可以结合聊天模型、检索器以及记忆体和提示词模板来使用。现在,我们可以轻松地利用这个链条来执行用户提出的查询了。
String answer = chain.execute("Who is Simpson?");该系列工具提供了默认的存储结构和提示词模板,我们可以对这些默认设置进行修改。同时,创建自定义链也很简单。能够创建不同的链结构,使得复杂应用的模块化实现变得更加容易。
- 2. 智能体(Agents)
LangChain 还提供了更强大的功能,比如智能体。与常规链条不同,智能体使用语言模型作为推理引擎,来决定采取哪些行动以及执行的顺序。我们还能够让智能体访问相应的工具,以完成必要的操作。
在 LangChain4j 中,智能体可以作为 AI 服务来使用,从而方便地定义复杂的 AI 行为。让我们看看是否能够将计算器作为一种 AI 服务,并让语言模型能够执行计算任务。
首先,我们将定义一个类,其中包含了一些基本的计算器功能。然后,我们会用自然语言来描述每个函数的功能,以便模型能够理解这些功能。
public class AIServiceWithCalculator { static class Calculator { @Tool("Calculates the length of a string") int stringLength(String s) { return s.length(); } @Tool("Calculates the sum of two numbers") int add(int a, int b) { return a + b; } }然后,我们将定义出用于构建我们的 AI 服务的接口。这里的设计相当简单,但实际上也可以描述更复杂的操作行为。
interface Assistant { String chat(String userMessage);}现在,我们将使用 LangChain4j 提供的构建器工厂,根据我们刚刚定义的接口以及我们创建的工具,来构建一个 AI 服务。
Assistant assistant = AiServices.builder(Assistant.class) .chatLanguageModel(OpenAiChatModel.withApiKey(<OPENAI_API_KEY>)) .tools(new Calculator()) .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) .build();好了!现在我们可以开始向我们的语言模型发送包含需要执行的计算任务的问题了。
String question = "What is the sum of the numbers of letters in the words /"language/" and /"model/"?";String answer = assistant.chat(question);System.out.prtintln(answer); // The sum of the numbers of letters in the words "language" and "model" is 13.当我们运行这段代码时,会观察到语言模型现在已经能够执行计算了。需要注意的是,语言模型在执行某些需要理解时间和空间概念或执行复杂算术运算的任务时存在困难。不过,我们总是可以借助必要的工具来补充模型的功能,从而解决这些问题。
结论
在这个教程中,我们介绍了使用大语言模型来创建应用程序的一些基本要素。此外,我们还讨论了在开发此类应用时,引入像 LangChain 这样的框架的重要性。
这让我们能够探索 LangChain4j 的一些核心组件。LangChain4j 是 LangChain 的 Java 版本。这些库在未来将会快速发展。不过,它们已经让基于语言模型的应用程序开发变得更加成熟且有趣了!
大模型的知识又多又杂,到底怎么学?
做这行久了,被问最多的问题就一个:大模型的知识又多又杂,我到底先学啥?翻了一堆资料,看啥都像重点,结果啥都没学进去。今天把我自己一路摸出来的顺序捋一遍,零基础、应届生、转行的都适用。跟着走,至少方向不乱、不瞎忙,学完拿得出手。
第一阶段(10天):初阶应用
这一阶段就一个目标:把大模型真正"玩明白",不是只会聊天那种,而是能调教它、能用代码把大模型和业务接起来。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
这阶段正式进实战,目标很实在:做出两个能拿出手的东西——一个私有知识库,一个 agent 对话机器人。
为什么要做 RAG
搭建一个简单的 ChatPDF
检索的基础概念
什么是向量表示(Embeddings)
向量数据库与向量检索
基于向量检索的 RAG
搭建 RAG 系统的扩展知识
混合检索与 RAG-Fusion 简介
向量模型本地部署
…
走完这 30 天,Python 或 JavaScript 背景的基本能独立做一套 RAG 应用,简历上也敢写"大模型应用开发"了。
第三阶段(约20天):动手微调
学到这,你已经开始 “造” 模型了 —— 通过微调,搞出垂直领域的专用小模型。
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你从 “只会用” 变成 “能造” 的 AI 小子。那么你还想往下探索吗?
想要入局AI大模型赛道、抢占行业红利的朋友,微信扫描下方CSDN官方认证二维码,即可100%免费领取全套学习资料!
第四阶段(20天):商业闭环,部署落地
技术学完,落地才算数。这阶段带你搞明白大模型怎么真正跑起来、用起来。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
想要入坑大模型的朋友,给大家准备了一份2026 年最新 AI 大模型全套学习资料:
1、大模型系统化学习路线
2、大模型学习视频教程
3、大模型学习书籍&电子文档
4、AI大模型最新行业报告
5、大模型项目实战&配套源码
6、2026大模型大厂面试真题
7、为什么要学习大模型?
我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。
8、适合谁学?
- 传统后端 / Java / 前端开发,想转型 AI 应用
- 大学生、应届生,想拿更好的 offer
- 产品经理、运营,想武装职业竞争力
- 技术负责人,想给团队落地提效
学习是反人性的,但回报是真金白银。技术会更新,赛道会切换,但只要你先动手,机会就永远站在你这边。
9、这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。
想要入局AI大模型赛道、抢占行业红利的朋友,微信扫描下方CSDN官方认证二维码,即可100%免费领取全套学习资料!
好了,就写到这。路线是死的,人是活的,卡住了随时来问我。觉得有用就点个收藏,别让它进收藏夹吃灰——动起来比啥都强。