本文紧张是目标是 讲解如何在本地 搭建一个大略单纯的AI问答系统,紧张用java来实现,也有一些大略的python知识;网上很多例子都因此 ChatGPT来讲解的,但由于它对海内访问有限定,OpeAi连接太麻烦,又要虚拟账号注册账号啥的,第一步就劝退了,以是选择了 llama和qwen替代,但是事理都是一样的;
干系观点理解:(一)大措辞模型 LLM
大型措辞模型(LLM,Large Language Models),是近年来自然措辞处理(NLP)领域的主要进展。这些模型由于其弘大的规模和繁芜性,在处理和天生自然措辞方面展现了前所未有的能力。
关于LLM的一些关键点:
1.定义:
◦大模型常日指的是拥有大量参数的深度学习模型,这些模型可能包含数十亿至数万亿的参数。
◦LLM是大模型的一个子类,专门设计用于处理和理解自然措辞,它们能够模拟人类措辞的天生和理解过程。
2.架构:
◦LLM常日基于Transformer架构,这是一种利用自把稳力机制(self-attention mechanism)的序列模型,它由多个编码器和解码器层组成,每个层包含多头自把稳力机制和前馈神经网络。
3.演习:
◦这些模型在大规模文本数据集上进行演习,这使得它们能够学习到措辞的繁芜构造,包括语法、语义、高下文关系等。
◦演习过程常日涉及大量的打算资源,包括GPU集群和海量的数据存储。
4.运用:
◦LLM可以运用于各种自然措辞处理任务,包括但不限于文本天生、问答、翻译、择要、对话系统等。
◦它们还展示了在few-shot和zero-shot学习场景下的能力,即在少量或没有额外演习数据的情形下,模型能够理解和实行新任务。
5.发展趋势:
◦学术研究和工业界都在探索LLM的边界,包括如何更有效地演习这些模型,以及如何使它们在不同领域和任务中更具适应性。
◦开源和闭源模型的竞争也在加剧,推动了模型的持续创新和改进。
6.学习路径:
◦对付那些希望深入理解LLM的人来说,可以从学习基本的Transformer模型开始,然后逐渐深入到更繁芜的模型,如GPT系列、BERT、LLaMA、Alpaca等,海内的有 qwen(通义千问)、文心一言、讯飞星火、华为盘古、言犀大模型(ChatJd)等 。
7.社区资源:
◦Hugging Face等平台供应了大量的开源模型和工具,可以帮助研究职员和开拓者快速上手和运用LLM。
LLM的涌现标志着NLP领域的一个新时期,它们不仅在学术研究中产生了深远的影响,也在商业运用中展现出了巨大的潜力。
(二)Embedding
在自然措辞处理(NLP)和机器学习领域中,"embedding" 是一种将文本数据转换成数值向量的技能。这种技能将单词、短语、句子乃至文档映射到多维空间中的点,使得这些点在数学上能够表示它们在语义上的相似性或差异。
Embeddings 可以由预演习模型天生,也可以在特界说务中演习得到。常见的 embedding 方法包括:
1. Word2Vec:由 Google 提出,通过高下文预测目标词(CBOW)或通过目标词预测高下文(Skip-gram)来演习词向量。
2. GloVe:环球向量(Global Vectors for Word Representation),通过统计词共现矩阵来优化词向量。
3. FastText:Facebook 研究院提出的一种方法,它基于词 n-gram 来构建词向量,适用于稀少词和未见过的词。
4. BERT:基于 Transformer 架构的预演习模型,可以天生高下文干系的词嵌入,即“动态”词嵌入。
5. ELMo:利用双向 LSTM 措辞模型天生的词嵌入,同样考虑了高下文信息。
6. Sentence Transformers:这是 BERT 的一种变体,专门设计用于天生句子级别的嵌入。
Embeddings 的紧张优点在于它们能够捕捉词汇之间的繁芜关系,犹如义词、反义词以及词义的细微差别。此外,它们还能够处理多义词问题,即一个词在不同高下文中可能有不同的含义。
在实际运用中,embeddings 被广泛用于多种 NLP 任务,如文本分类、情绪剖析、命名实体识别、机器翻译、问答系统等。通过利用 embeddings,机器学习模型能够理解和处理自然措辞数据,从而做出更加准确和故意义的预测或决策。
(三)向量数据库
向量数据库是一种专门设计用于存储和查询高维向量数据的数据库系统。这种类型的数据库在处理非构造化数据,如图像、文本、音频和视频的高效查询和相似性搜索方面表现出色。与传统的数据库管理系统(DBMS)不同,向量数据库优化了对高维空间中向量的存储、索引和检索操作。
以下是向量数据库的一些关键特点和功能:
1.高维向量存储: 向量数据库能够高效地存储和管理大量的高维向量数据,这些向量常日是由深度学习模型(如BERT、ResNet等)从原始数据中提取的特色。
2.相似性搜索: 它们供应了快速的近似最近邻(Approximate Nearest Neighbor, ANN)搜索,能够在高维空间中找到与查询向量最相似的向量凑集。
3.向量索引: 利用分外的数据构造,如树形构造(如KD树)、哈希表、图构造或量化方法,以加速向量的检索过程。
4.稠浊查询能力: 许多向量数据库还支持结合向量查询和构造化数据查询,这意味着除了向量相似性搜索之外,还可以进行SQL风格的查询来筛选构造化属性。
5.扩展性和容错性: 高效的数据分布和复制策略,使得向量数据库可以水平扩展,以处理海量数据,并且具备数据冗余和故障规复能力。
6.实时更新: 许可动态添加和删除向量数据,支持实时更新,这对付不断变革的数据集尤其主要。
7.云原生设计: 许多当代向量数据库采取云原生架构,可以轻松支配在云端,利用云做事的弹性打算资源。
向量数据库在多个领域得到运用,包括推举系统、图像和视频检索、自然措辞处理(NLP)以及生物信息学。一些有名的向量数据库项目包括FAISS(由Facebook AI Research开拓)、Pinecone、Weaviate、Qdrant、Milvus等。
(四)RAG
文章题目中的 "智能问答" 实在专业术语 叫 RAG;
在大模型(尤其是大型措辞模型,LLMs)中,RAG 指的是“Retrieval-Augmented Generation”,即检索增强天生。这是一种结合了 检索(Retrieval)和天生(Generation)技能的人工智能方法, 紧张用于增强措辞模型在处理须要外部知识或实时信息的任务时的表现;
RAG 是 "Retrieval-Augmented Generation" 的缩写,即检索增强天生。这是一种结合了检索(Retrieval)和天生(Generation)两种技能的人工智能模型架构。RAG 最初由 Facebook AI 在 2020 年提出,其核心思想是在天生式模型中加入一个检索组件,以便在天生过程中利用外部知识库中的干系文档或片段。
在传统的天生模型中,如基于Transformer的模型,输出完备依赖于模型的内部知识,这常日是在大规模语料库上进行预演习得到的。然而,这些模型可能无法包含所有特定领域或最新更新的信息,尤其是在处理专业性较强或时效性较高的问题时。
RAG 架构通过从外部知识源检索干系信息来增强天生过程。当模型须要天生相应时,它会首先查询一个文档凑集或知识图谱,找到与输入干系的高下文信息,然后将这些信息与原始输入一起送入天生模型,从而产生更加准确和丰富的内容。
事情事理
1.检索(Retrieval):
•当模型吸收到一个输入或查询时,RAG 首先从外部知识库或数据源中检索干系信息。 这常日涉及到利用向量数据库和近似最近邻搜索算法来找到与输入最干系的文档片段或知识条款。
1.天生(Generation):
•一旦检索到干系的信息,这些信息会被整合到天生模型的输入中,作为高下文或提示(prompt)。 这样,当模型天生输出时,它就能利用这些额外的信息来供应更准确、更详细和更干系的相应。
基本流程:
RAG的上风:
1.减少知识局限性:LLMs 常日受限于其演习数据,而 RAG 可以让模型访问实时或最新的信息,从而战胜这一限定。
2.减少幻觉:幻觉是指模型天生不存在于其演习数据中的不真实信息。RAG 通过供应事实依据,可以减少这种征象。
3.提高安全性:RAG 可以通过掌握检索的范围和类型,避免模型天生潜在的有害或敏感信息。
4.增强领域专业性:对付特定领域的查询,RAG 可以从专业的知识库中检索信息,从而使模型的回答更具专业性
RAG 可以运用于多种场景,包括但不限于:
•问答系统:RAG 能够检索到与问题最干系的答案片段,然后基于这些片段天生终极的回答。
•对话系统:在对话中,RAG 可以帮助模型引用历史对话或外部知识来天生更自然、更有信息量的回答。
•文档择要:RAG 能够从大量文档中提取关键信息,天生总结或概述。
•文本补全:在文本补全任务中,RAG 可以参考干系文档来供应更准确的建议。
RAG 架构的一个主要组成部分是检索组件,它常日利用向量相似度搜索技能,如倒排索引或基于神经网络的嵌入空间搜索。这使得模型能够在大规模文档凑集中快速找到最干系的部分。
AI 运用开拓框架(一)Langchain
官网:https://www.langchain.com/langchain
LangChain不是一个大数据模型,而是一款可以用于开拓类似AutoGPT的AI运用的开拓工具,LangChain简化了LLM运用程序生命周期的各个阶段,且供应了 开拓协议、开拓范式,并 拥有相应的平台和生态;
LangChain 是一个由 Harrison Chase 创立的框架,专注于帮助开拓者利用措辞模型构建端到真个运用程序。它特殊设计来简化与大型措辞模型(LLMs)的集成,使得创建由这些模型支持的运用程序变得更加随意马虎。LangChain 供应了一系列工具、组件和接口,可以用于构建谈天机器人、天生式问答系统、择要工具以及其他基于措辞的AI运用。
LangChain 的核心特性包括:
1.链式思维(Chains): LangChain 引入了“链”(Chain)的观点,这是一系列可组合的操作,可以按顺序实行,比如从获取输入、处理数据到天生输出。链条可以嵌套和组合,形成繁芜的逻辑流。
2.代理(Agents): 代理是更高等别的抽象,它们可以自主地决定如何利用不同的链条来完成任务。代理可以根据输入动态选择最佳行动方案。
3.影象(Memory): LangChain 支持不同类型的内存,许可模型保留历史对话或操作的高下文,这对付构建有状态的对话系统至关主要。
4.加载器和拆分器(Loaders and Splitters): 这些工具帮助读取和处理各种格式的文档,如PDF、网页、文本文件等,为模型供应输入数据。
5.提示工程(Prompt Engineering): LangChain 供应了创建和管理提示模板的工具,帮助勾引模型天生特定类型的内容。
6.Hub: LangChain Hub 是一个社区驱动的资源库,个中包含了许多预构建的链条、代理和提示,可以作为构建块来加速开拓过程。
7.与外部系统的集成: LangChain 支持与外部数据源和API的集成,如数据库查询、知识图谱、搜索引擎等,以便模型能够访问更广泛的信息。
8.监控和调试工具: 为了更好地理解和优化运用程序,LangChain 供应了日志记录和剖析功能,帮助开拓者追踪模型的行为和性能。
(二)LangChain4J
上面说的 LangChain 是基于python 开拓的,而 LangChain4J 是一个旨在为 Java 开拓者供应构建措辞模型运用的框架。受到 Python 社区中 LangChain 库的启示,LangChain4J 致力于供应相似的功能,但针对 Java 生态系统进行了优化。它许可开拓者轻松地构建、支配和掩护基于大型措辞模型的运用程序,如谈天机器人、文本天生器和其他自然措辞处理(NLP)任务。
紧张特点:
1.模块化设计:LangChain4J 供应了一系列可组合的模块,包括措辞模型、影象、工具和链,使得开拓者可以构建繁芜的措辞处理流水线。
2.支持多种措辞模型:LangChain4J 支持与各种措辞模型供应商集成,如 Hugging Face、OpenAI、Google PaLM 等,使得开拓者可以根据项目需求选择最得当的模型。
3.影象机制:它供应了影象组件,许可模型记住先前的对话历史,从而支持高下文感知的对话。
4.工具集成:LangChain4J 支持集成外部工具,如搜索API、数据库查询等,使得模型能够访问实时数据或实行特界说务。
5.链式实行:通过链式实行,可以将多个措辞处理步骤链接在一起,形成繁芜的处理流程,例如先剖析用户意图,再查询数据库,末了天生回答。
紧张功能:
1.LLM 适配器:许可你连接到各种措辞模型,如 OpenAI 的 GPT-3 和 GPT-4,Anthropic 的 Claude 等。
2.Chains 构建:供应一种机制来定义和实行一系列操作,这些操作可以包括调用模型、数据检索、转换等,以完成特定的任务。
3.Agent 实现:支持创建代理(agents),它们可以自主地实行任务,如回答问题、完成指令等。
4.Prompt 模板:供应模板化的提示,帮助辅导模型天生更详细和有用的回答。
5.工具和影象:许可模型访问外部数据源或存储之前的交互记录,以便在会话中保持高下文。
6.模块化和可扩展性:使开拓者能够扩展框架,添加自己的组件和功能。
本地问答系统搭建环境准备(一)用 Ollama 启动一个本地大模型
1.下载安装 Ollma
2.ollama 是一个命令行工具,用于方便地在本地运行 LLaMA 系列模型和其他类似的 transformer 根本的大型措辞模型。该工具简化了模型的下载、配置和推理过程,使得个人用户能够在自己的机器上直接与这些模型交互,而不须要直接打仗繁芜的模型加载和推理代码;
3.下载地址:https://ollama.com/,下载完成后,打开 Ollma,其默认端口为11334,浏览器访问:http://localhost:11434 ,会返回:Ollama is running,电脑右上角展示图标;
1.下载 大模型
2.安装完成后,通过命令行下载大模型,命令行格式:ollma pull modelName,如:ollma pull llama3;
3.大模型一样平常要几个G,须要等一会;个人建议至少下载两个, llama3、 qwen(通义千问),这两个都是开源免费的,英文场景 用 llama3,中文场景用 qwen;
下载完成后,通过 ollma list 可以查看 已下载的大模型;
1.启动 大模型
确认下载完成后,用命令行 :ollma run 模型名称,来启动大模型;启动后,可以立即输入内容与大模型进行对话,如下:
(二)启动 本地向量数据库 chromadb
Chroma 是一款 AI 原生开源矢量数据库,它内置了入门所需的统统,可在本地运行,是一款很好的入门级向量数据库。
1.安装:pip install chromadb ;
2.启动:chroma run :
用java 实现 本地AI问答功能(一)核心maven依赖:
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <langchain4j.version>0.31.0</langchain4j.version></properties><dependencies> <!-- langchain4j --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-core</artifactId> <version>${langchain4j.version}</version> </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-chroma</artifactId> <version>${langchain4j.version}</version> </dependency> <!-- ollama --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-ollama</artifactId> <version>${langchain4j.version}</version> </dependency> <!-- chroma 向量数据库 --> <dependency> <groupId>io.github.amikos-tech</groupId> <artifactId>chromadb-java-client</artifactId> <version>0.1.5</version> </dependency> </dependencies>
1. 加载本地文件作为本地知识库:
public static void main(String[] args) throws ApiException { //======================= 加载文件======================= Document document = getDocument("笑话.txt"); }private static Document getDocument(String fileName) { URL docUrl = LangChainMainTest.class.getClassLoader().getResource(fileName); if (docUrl == null) { log.error("未获取到文件"); } Document document = null; try { Path path = Paths.get(docUrl.toURI()); document = FileSystemDocumentLoader.loadDocument(path); } catch (URISyntaxException e) { log.error("加载文件发生非常", e); } return document; }
1.拆分文件内容:
//======================= 拆分文件内容=======================//参数:分段大小(一个分段中最大包含多少个token)、重叠度(段与段之前重叠的token数)、分词器(将一段文本进行分词,得到token)DocumentByLineSplitter lineSplitter = new DocumentByLineSplitter(200, 0, new OpenAiTokenizer());List<TextSegment> segments = lineSplitter.split(document);log.info("segment的数量是: {}", segments.size());//查看分段后的信息segments.forEach(segment -> log.info("========================segment: {}", segment.text()));
1.文本向量化 并存储到向量数据库:
//提前定义两个静态变量private static final String CHROMA_DB_DEFAULT_COLLECTION_NAME = "java-langChain-database-demo";private static final String CHROMA_URL = "http://localhost:8000";//======================= 文本向量化=======================OllamaEmbeddingModel embeddingModel = OllamaEmbeddingModel.builder() .baseUrl("http://localhost:11434") .modelName("llama3") .build();//======================= 向量库存储=======================Client client = new Client(CHROMA_URL);//创建向量数据库EmbeddingStore<TextSegment> embeddingStore = ChromaEmbeddingStore.builder() .baseUrl(CHROMA_URL) .collectionName(CHROMA_DB_DEFAULT_COLLECTION_NAME) .build();segments.forEach(segment -> { Embedding e = embeddingModel.embed(segment).content(); embeddingStore.add(e, segment);});
1.向量库检索:
//======================= 向量库检索=======================String qryText = "北极熊";Embedding queryEmbedding = embeddingModel.embed(qryText).content();EmbeddingSearchRequest embeddingSearchRequest = EmbeddingSearchRequest.builder().queryEmbedding(queryEmbedding).maxResults(1).build();EmbeddingSearchResult<TextSegment> embeddedEmbeddingSearchResult = embeddingStore.search(embeddingSearchRequest);List<EmbeddingMatch<TextSegment>> embeddingMatcheList = embeddedEmbeddingSearchResult.matches();EmbeddingMatch<TextSegment> embeddingMatch = embeddingMatcheList.get(0);TextSegment textSegment = embeddingMatch.embedded();log.info("查询结果: {}", textSegment.text());
1.与LLM交互
//======================= 与LLM交互=======================PromptTemplate promptTemplate = PromptTemplate.from("基于如下信息用中文回答:\n" + "{{context}}\n" + "提问:\n" + "{{question}}");Map<String, Object> variables = new HashMap<>();//以向量库检索到的结果作为LLM的信息输入variables.put("context", textSegment.text());variables.put("question", "北极熊干了什么");Prompt prompt = promptTemplate.apply(variables);//连接大模型OllamaChatModel ollamaChatModel = OllamaChatModel.builder() .baseUrl("http://localhost:11434") .modelName("llama3") .build();UserMessage userMessage = prompt.toUserMessage();Response<AiMessage> aiMessageResponse = ollamaChatModel.generate(userMessage);AiMessage response = aiMessageResponse.content();log.info("大模型回答: {}", response.text());
(三)功能测试:
1.代码中用到 "笑话.txt" 是我随便从网上找的一段内容,大家可以随便输入点内容,为了给大家展示测试结果,我贴一下我 文本内容:
有一只北极熊和一只企鹅在一起耍,企鹅把身上的毛一根一根地拔了下来,拔完之后,对北极熊说:“好冷哦!
”北极熊听了,也把自己身上的毛一根一根地拔了下来,转头对企鹅说:”果真很冷!
”
1.当我输入问题:“北极熊干了什么”,程序打印如下结果:
根据故事,北极熊把自己的身上的毛一根一根地拔了下来
结语
1.以上便是 完成了一个超大略单纯的AI问答 功能,如果想搭一个问答系统,可以用Springboot搞一个Web运用,把上面的代码放到 业务逻辑中即可;
2.langchain 还有其他很多很强大的能力,prompt Fomat、output Fomat、工具调用、memory存储等;
3.早点认识和学习ai,不至于被它取代的时候,连对手是谁都不知道;
参考资料:
1.langchain 官网
2.langchain 入门教程
3.langchain4j github
4.langchain4j 视频先容