从零开发短视频电商 Java开发者的AI大模型(LLM)应用开发和设计-LangChain4j
lakernote 2024-06-27 14:01:11 阅读 70
文章目录
简介示例1.添加依赖2.设置OpenAI API 密钥3.创建模型的实例并开始交互
功能实践爬取网页并embeddingHuggingFace在线API集成加载离线model
简介
Github:
https://github.com/langchain4j
https://github.com/langchain4j/langchain4j
https://github.com/langchain4j/langchain4j-embeddings
https://github.com/langchain4j/langchain4j-examples
Java版langchain
, 利用LLMs的力量增强你的java应用程序。
该项目的目标是简化 AI/LLM 功能到 Java 应用程序的集成。
可以通过以下方式实现:
一个简单且连贯的抽象层,旨在确保您的代码不依赖于具体实现,例如 LLM providers, embedding store providers,等。这允许轻松替换组件。上述抽象的多种实现,为您提供了多种 LLMs 和嵌入存储可供选择。LLM 之上的一系列热门功能,例如:
获取您自己的数据 own data(文档、代码库等)的能力,允许LLM 根据您的数据采取行动和做出响应。用于将任务(动态定义)委托给LLM的自主代理 agents ,LLM将努力完成这些任务。提示模板 Prompt templates 可帮助您获得最高质量的 LLM 回复。记忆Memory 为LLM提供您当前和过去对话的背景信息。用于接收来自 LLM 的响应的结构化输出,具有所需的结构(如 Java POJO)。“AI 服务”,用于在简单的 API 背后声明性地定义复杂的 AI 行为。减少常见用例中对大量样板代码的需求的链 Chains 。自动调节以确保LLM的所有输入和输出都不会有害。
这个更像是一个大的框架,给你从头到尾梳理了个标准的流程,我认为是一个很大的解决方案。
Spring Boot 3 的支持
兼容性:Java8 或更高, Spring Boot: 2 or 3
示例
1.添加依赖
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>0.24.0</version>
</dependency>
2.设置OpenAI API 密钥
String apiKey = System.getenv("OPENAI_API_KEY");
可以用自己的秘钥,不过要收费。
OpenAI(付费)或 HuggingFace(免费)
建议使用 OpenAI LLM(
gpt-3.5-turbo
和gpt-4
),因为它们是迄今为止最有能力且价格合理的。
也可以使用免费提供的 API 密钥
demo
来测试 OpenAI。
即
String apiKey = "demo"
3.创建模型的实例并开始交互
OpenAiChatModel model = OpenAiChatModel.withApiKey(apiKey);
String answer = model.generate("Hello world!");
System.out.println(answer); // Hello! How can I assist you today?
功能
AI服务:
简单模式带有记忆功能带有工具支持带有流式处理带有检索器带有自动审核带有结构化输出、结构化提示等功能
与OpenAI和Azure OpenAI集成的功能:
聊天(同步 + 流式 + 函数)完成(同步 + 流式)嵌入
与Google Vertex AI集成的功能:
聊天完成嵌入
与HuggingFace Inference API集成的功能:
聊天完成嵌入
与LocalAI集成的功能:
聊天(同步 + 流式 + 函数)完成(同步 + 流式)嵌入
与DashScope集成的功能:
聊天(同步 + 流式)完成(同步 + 流式)嵌入
聊天记忆
持久性聊天记忆
与文档进行聊天
与Astra DB和Cassandra集成
与Chroma集成
与Elasticsearch集成
与Milvus集成
与Pinecone集成
与Redis集成
与Vespa集成
与Weaviate集成
内存嵌入存储(可持久化)
结构化输出
提示模板
结构化提示模板
LLM响应的流式传输
从文件系统和通过URL加载txt、html、pdf、doc、xls和ppt文档
将文档拆分为段落
按段落、行、句子、单词等:
递归
带有重叠
标记计数估算(以便您可以预测您将支付多少)
实践
爬取网页并embedding
// 从url拉取html
// loaders 有from WebUrl,s3,file
Document document = UrlDocumentLoader.load("https://www.baidu.com", DocumentType.HTML);
// 通过 css选择器 抽取内容和标题
Map<String, String> metadataCssSelectors = new HashMap<>();
metadataCssSelectors.put("title", ".title");
HtmlTextExtractor transformer = new HtmlTextExtractor("#content", metadataCssSelectors, false);
Document transformedDocument = transformer.transform(document);
//
String title = transformedDocument.metadata("title");
log.debug("title: {}", title);
// splitter 文档拆分为段
// 按段,特殊字符,句子,定长
DocumentSplitter splitter = new DocumentBySentenceSplitter(500, 0);
List<TextSegment> segments = splitter.split(transformedDocument);
// embedding
for (TextSegment segment : segments) {
String text = segment.text();
// embedding
Float[] xxx = textEmbeddingService.embed(text, ModelTypeEnum.BERT_EN_UNCASED_L4);
HuggingFace在线API集成
为什么用HuggingFace的在线API,就是因为免费,哈哈哈!!!
对于嵌入(embedding),我们建议使用HuggingFace MTEB 排行榜中的模型之一。您必须找到最适合您的特定用例的一种。
以下是获取 HuggingFace API 密钥的方法:
在https://huggingface.co上创建一个帐户前往https://huggingface.co/settings/tokens 生成新的访问令牌
引入依赖
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-hugging-face</artifactId>
<version>0.24.0</version>
</dependency>
推理示例
EmbeddingModel embeddingModel = HuggingFaceEmbeddingModel.builder()
.accessToken(System.getenv("HF_API_KEY"))
.modelId("sentence-transformers/all-MiniLM-L6-v2")
.waitForModel(true)
.timeout(ofSeconds(60))
.build();
Response<Embedding> response = embeddingModel.embed("Hello, how are you?");
System.out.println(response);
加载离线model
针对加载离线model这块,底层依赖onnxruntime + djl.api
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings</artifactId>
<version>0.24.0</version>
</dependency>
证据在langchain4j-embeddings
依赖的pom:
<!-- 使用这个加载onnx模型 -->
<dependency>
<groupId>com.microsoft.onnxruntime</groupId>
<artifactId>onnxruntime</artifactId>
<version>1.16.2</version>
</dependency>
<!-- 使用这里内置的分词器等 -->
<dependency>
<groupId>ai.djl</groupId>
<artifactId>api</artifactId>
<version>0.25.0</version>
</dependency>
示例代码
1.首先自己去huggingface或其他站点下载开源的onnx模型到本地
例如:https://huggingface.co/bert-base-uncased
2.加载本地onnx模型,并进行推测。
String text = "Let's demonstrate that embedding can be done within a Java process and entirely offline.";
// path "C:/Users/laker/Downloads/model.onnx"
EmbeddingModel embeddingModel = new OnnxEmbeddingModel("/home/me/model.onnx");
Embedding inProcessEmbedding = embeddingModel.embed(text).content();
System.out.println(inProcessEmbedding);
官方也提供了几个带onnx文件的jar,里面内置了onnx文件,你就不需要再下载了。
https://github.com/langchain4j/langchain4j-embeddings
根据需要的模型引入依赖。
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-bge-small-zh</artifactId>
<version>0.24.0</version>
</dependency>
推理的示例代码
// EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
EmbeddingModel embeddingModel = new BgeSmallZhEmbeddingModel();
Embedding inProcessEmbedding = embeddingModel.embed(text).content();
System.out.println(inProcessEmbedding);
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。