简单用langchain执行一个llm任务
哈喽哈喽我是你们的金樽清酒。是的,我已经上班一段时间了。感觉工作内容对我来说学习到的东西很有限。大部分都是增、删、改、查。当然也是我能力没有到位,无法完全胜任从事一些很高难度的任务再加上基本需求都是要赶工期的一部分领导的压力也会让你无法静下心来提升自己而是陷入焦虑。所以其实前一段时间我迷茫了,难道一辈子crud嘛,决定学习一点新的东西,打开买了一段时间的langchain小册开始langchain的第一课。
了解deno和Jupter NoteBook
啥是deno?啥是Jupter NoteBook?我相信很多人对这两个东西会很陌生,包括我第一次看到也是。那让我们一一来了解一下吧。
deno
deno和node一样是javascript的运行时环境。是node的原作者为了解决node的历史遗留问题而创建的。
- 核心区别
🔐 安全性
| Deno | Node.js | |
|---|---|---|
| 权限控制 | 默认沙箱化,需显式授权(如 --allow-read) | 默认无限制,直接访问系统资源 |
| 示例 | deno run --allow-net script.ts | node script.js |
📦 模块系统
| Deno | Node.js | |
|---|---|---|
| 导入方式 | URL 或 import map(支持远程模块) | require() 或 import |
| 依赖管理 | 无 node_modules,直接缓存全局依赖 | 需要 npm install 和 package.json |
| 示例 | import { serve } from "https://deno.land/x/std/http/server.ts"; | const fs = require('fs'); |
deno相对于node我觉得最主要的区别就是模块引入的方式。将commonJS规范换成了ESModule的形式。而且默认支持TypeScript。
Jupter NoteBook
Jupyter Notebook 是数据科学、机器学习和科学计算领域的重要工具,广泛应用于教育、研究和工业领域。算是机器学习领域的常客了。那他有什么优势呢? 交互式编程环境:可以分段执行代码,立即查看结果。 我们来看一下它的演示吧,这样可以更好的理解Jupter NoteBook的优势。
这就是Jupter NoteBook的使用界面了,然后右上角我使用的环境是deno。那为什么Jupter NoteBook具有优势呢。那是因为调用大模型型是耗时耗钱的。而Jupter NoteBook可以分段代码运行。由于Jupter Note没有代码提示,我们可以在vscode里面安装JupterNote插件,在vscode里面运行。
如上图所示是我运行的一个简单的llm任务。可以看到它是一个个的代码段,我可以先执行上面的代码然后返回调大模型所用的结果。然后在另一个段我可以打印结果或者对字符串进行处理。当上面的代码段执行完之后结果就不会变了,那我们就可以在下面反复执行,切割字符串调试。如果我们修改了上面的代码要重新运行,但是不会执行下面的代码。也就是说每个代码段的执行可以是独立的。这样碰到耗时或者耗钱的请求而我们又需要频繁调试的时候这是一个很好的选择。恰巧调大模型就是这样的耗时耗钱的任务。
如何安装deno和Jupter NoteBook
如何去学习和安装一个东西。那最好的方式就是看文档。
deno: docs.deno.com/runtime/get…
jupter NoteBook: jupyter.org/install
安装deno有很多种方式,这里我是选择npm install -g deno,在安装完之后检查deno的版本号,出现版本号而不是deno not found那就成功了。
对于Jupter NoteBook我们要用pip去安装。
如果电脑上没有python环境需要去安装python环境。注意python3安装的话使用pip3.
当然macos系统可以用HomeBrew去安装。同样检查一下版本号。
出现版本号之后就可以输入jupyter notebook启动。 当然我比较喜欢在vscode中用插件来运行。
在都安装完之后我们为使用 deno 为 Jupyter Notebook 配置 kernel
deno jupyter --unstable --install
当出现如图上面的提示说明成功了。这样我们运行Jupter Note的时候就是以deno为内核环境。
执行一个简单的llm任务
现在我们就要开始执行一个简单的llm任务啦。 我是在vscode里面用插件执行的,因为用插件会有代码提示。首先到插件市场找到Jupter插件安装。然后我们创建一个.ipynb后缀的文件。
如下图点击➕代码增加一个代码块
在代码块里面输入下面的代码
import { ChatOpenAI } from "@langchain/openai";
import { SystemMessage, HumanMessage } from "@langchain/core/messages";
import { StringOutputParser } from "@langchain/core/output_parsers";
const chatModel = new ChatOpenAI({
configuration: {
baseURL: "https://api.deepseek.com",
apiKey: "your-api-key-here",
},
modelName: "deepseek-chat",
});
const outputPrase = new StringOutputParser();
const simpleChain = chatModel.pipe(outputPrase)
const res1 = await chatModel.invoke([
new SystemMessage("用中文输出。"),
new HumanMessage("请给我讲一个程序员的笑话"),
]);
新建一个deno.json文件粘贴下面的依赖项配置
{
"nodeModulesDir": "auto",
"tasks": {
"dev": "deno run --watch main.ts"
},
"imports": {
"@langchain/community/": "npm:/@langchain/community/",
"@langchain/community": "npm:@langchain/community@^0.3.34",
"@langchain/core": "npm:@langchain/core@^0.3.42",
"@langchain/deepseek": "npm:@langchain/deepseek@^0.0.2",
"@langchain/ollama": "npm:@langchain/ollama@^0.2.0",
"@langchain/openai": "npm:@langchain/openai@^0.4.4",
"@std/assert": "jsr:@std/assert@^1.0.11",
"cheerio": "npm:cheerio@^1.0.0",
"dotenv": "npm:dotenv@^16.4.7",
"ignore": "npm:ignore@^7.0.3",
"langchain": "npm:langchain@^0.3.19",
"lodash": "npm:lodash@^4.17.21",
"pdf-parse": "npm:pdf-parse@^1.1.1",
"zod": "npm:zod@^3.24.2"
}
}
然后点击左上角执行,执行成功后下面会有个执行时间。然后我们再添加一个代码块打印执行结果。
这样我们第一个langchain任务就完成啦。注意这个apiKey要替换成你们的真实的key哦,而且千万不要泄漏这个key。
如何获取key
这里我以deepseek的apiKey为例。我们来到deepseek的官网,点击右上角的API开放平台。
点击APIkeys创建APIkey。也可以看看它的文档。
总结
在运行第一个langchain任务之前我们需要准备安装deno和Jupter Notebook。deno跟node一样是js的运行时环境但是用ESmodule的形式引入文件依赖而且开箱支持ts。Jupter Note可以让代码分代码块运行。对于一些耗时且耗钱的任务可以很好的方便我们调试。对于API key的获取我们可以在deepseek官网上获取,但是要花钱的哦。