当前位置: 首页 > news >正文

大模型应用:LangChain-Golang核心模块使用

在这里插入图片描述

1.简介

LangChain是一个开源的框架,它提供了构建基于大模型的AI应用所需的模块和工具。它可以帮助开发者轻松地与大型语言模型(LLM)集成,实现文本生成、问答、翻译、对话等任务。LangChain的出现大大降低了AI应用开发的门槛,使得任何人都可以基于LLM构建自己的创意应用。本文将介绍基于Golang使用LangChain相关模块。
项目地址:https://github.com/tmc/langchaingo

2.核心模块

llm调用

func demo(ctx context.Context) {llm, err := openai.New(openai.WithModel("gpt-3.5-turbo"),openai.WithBaseURL("https://api.openai-proxy.com/v1"),openai.WithToken(conf.LLMHubConfig.Openai.Key),)if err != nil {log.Fatal(err)}completion, err := llms.GenerateFromSinglePrompt(ctx,llm,"hello world!",llms.WithTemperature(0),)if err != nil {log.Fatal(err)}fmt.Println(completion)
}

prompt模板

  • 简单使用
func promptTemplate(ctx context.Context) {llm, err := openai.New(openai.WithModel("gpt-3.5-turbo"),openai.WithBaseURL(conf.LLMHubConfig.Openai.Host),openai.WithToken(conf.LLMHubConfig.Openai.Key),)if err != nil {log.Fatal(err)}prompt := prompts.PromptTemplate{Template:       "你是一个文本翻译员,请将```括起来的原始文本转化为{{.lang}}。原始文本```{{.text}}```",InputVariables: []string{"text"},PartialVariables: map[string]any{"lang": "英语",},TemplateFormat: prompts.TemplateFormatGoTemplate,}result, err := prompt.Format(map[string]any{"text": "我是中国人",})if err != nil {log.Fatal(err)}fmt.Println(result)result, err = llm.Call(ctx, result)if err != nil {log.Fatal(err)}fmt.Println(result)
}
  • 带输出格式化
func promptWithRoleJSON(ctx context.Context) {llm, err := openai.New(openai.WithModel("gpt-4o"),openai.WithBaseURL(conf.LLMHubConfig.Openai.Host),openai.WithToken(conf.LLMHubConfig.Openai.Key),)if err != nil {log.Fatal(err)}messages := []llms.MessageContent{llms.TextParts(llms.ChatMessageTypeSystem, "你是一个英文翻译员,需要将<>括起来的英文翻译为中文,用JSON格式输出:原始文本、翻译文本"),llms.TextParts(llms.ChatMessageTypeHuman, "<hello world>"),}content, err := llm.GenerateContent(ctx, messages, llms.WithJSONMode())if err != nil {log.Fatal(err)}fmt.Println(content.Choices[0].Content)
}

上下文记忆

func conversationMemory(ctx context.Context) {llm, err := openai.New(openai.WithModel("gpt-4o"),openai.WithBaseURL(conf.LLMHubConfig.Openai.Host),openai.WithToken(conf.LLMHubConfig.Openai.Key),)if err != nil {log.Fatal(err)}//memoryBuffer := memory.NewConversationBuffer()memoryBuffer := memory.NewConversationWindowBuffer(10)//memoryBuffer := memory.NewConversationTokenBuffer(llm, 1024)chatChain := chains.NewConversation(llm, memoryBuffer)messages := []string{"你好,我叫PBR","你知道我叫什么吗?","你可以解决什么问题?",}for _, message := range messages {completion, err := chains.Run(ctx, chatChain, message)for {if err == nil {break}time.Sleep(30 * time.Second)completion, err = chains.Run(ctx, chatChain, message)}chatMessages, _ := memoryBuffer.ChatHistory.Messages(ctx)fmt.Printf("上下文对话历史:%v\n", json.SafeDump(chatMessages))fmt.Printf("输入:%v\n输出:%v\n", message, completion)}
}

模型链

func llmChains(ctx context.Context) {llm, err := openai.New(openai.WithModel("gpt-4o"),openai.WithBaseURL(conf.LLMHubConfig.Openai.Host),openai.WithToken(conf.LLMHubConfig.Openai.Key),)if err != nil {log.Fatal(err)}// 单个输入prompt := prompts.NewPromptTemplate(`将"""括起来中文翻译为英文输出输入中文:"""{{.text}}"""输出结果中只需要有英文翻译,不要有其他字符`,[]string{"text"})llmChain := chains.NewLLMChain(llm, prompt)out, err := chains.Run(ctx, llmChain, "langchain是一款不错的llm脚手架")if err != nil {log.Fatal(err)}fmt.Println(out)// 多个输入translatePrompt := prompts.NewPromptTemplate("Translate the following text from {{.inputLanguage}} to {{.outputLanguage}}. {{.text}}",[]string{"inputLanguage", "outputLanguage", "text"},)llmChain = chains.NewLLMChain(llm, translatePrompt)// Otherwise the call function must be used.outputValues, err := chains.Call(ctx, llmChain, map[string]any{"inputLanguage":  "English","outputLanguage": "Chinese","text":           "I love programming.",})if err != nil {log.Fatal(err)}out, ok := outputValues[llmChain.OutputKey].(string)if !ok {log.Fatal(err)}fmt.Println(out)
}

顺序链

unc sequenceChains(ctx context.Context) {llm, err := openai.New(openai.WithModel("gpt-4o"),openai.WithBaseURL(conf.LLMHubConfig.Openai.Host),openai.WithToken(conf.LLMHubConfig.Openai.Key),)if err != nil {log.Fatal(err)}// 将输入翻译为特定语言chain1 := chains.NewLLMChain(llm,prompts.NewPromptTemplate("请将输入的原始文本:{{.originText}}翻译为{{.language}},直接输出翻译文本",[]string{"originText", "language"}))chain1.OutputKey = "transText"// 总结翻译后的文本概要chain2 := chains.NewLLMChain(llm, prompts.NewPromptTemplate("请将输入的原始文本:<{{.transText}}>总结50字以内概要文本。严格使用JSON序列化输出结果,不要带有```json序列化标识。其中originText为原始文本,summaryText为概要文本",[]string{"transText"}))chain2.OutputKey = "summary_json"chain, err := chains.NewSequentialChain([]chains.Chain{chain1, chain2}, []string{"originText", "language"}, []string{"summary_json"})if err != nil {log.Fatal(err)}resp, err := chain.Call(ctx, map[string]any{"originText": "langchain is a good llm frameworks","language":   "中文",})if err != nil {log.Fatal(err)}for key, value := range resp {fmt.Printf("key = %v | value = %v\n", key, value)}
}

向量生成

func embeddingCreate(ctx context.Context) {// embedding生成测试llm, err := openai.New(openai.WithEmbeddingModel("text-embedding-ada-002"),openai.WithBaseURL(conf.LLMHubConfig.Openai.Host),openai.WithToken(conf.LLMHubConfig.Openai.Key),)if err != nil {log.Fatal(err)}vectors, err := llm.CreateEmbedding(ctx, []string{"chatgpt-3.5"})if err != nil {log.Fatal(err)}fmt.Println(vectors)
}

RAG

  • RAG:检索增强生成,分为向量创建、向量存储、向量召回应用
func embeddingRag(ctx context.Context) {// embedding生成测试llm, err := openai.New(openai.WithEmbeddingModel("text-embedding-ada-002"),openai.WithBaseURL(conf.LLMHubConfig.Openai.Host),openai.WithToken(conf.LLMHubConfig.Openai.Key),)if err != nil {log.Fatal(err)}// 创建embedderopenAiEmbedder, err := embeddings.NewEmbedder(llm)if err != nil {log.Fatal(err)}// 基于redis存储向量redisStore, err := redisvector.New(ctx,redisvector.WithConnectionURL(conf.LLMHubConfig.Redis.Url),redisvector.WithIndexName("test_vector_idx", true),redisvector.WithEmbedder(openAiEmbedder),)if err != nil {log.Fatalln(err)}// 插入测试数据data := []schema.Document{{PageContent: "狸花猫", Metadata: nil},{PageContent: "金渐层猫", Metadata: nil},{PageContent: "松狮犬", Metadata: nil},}_, err = redisStore.AddDocuments(ctx, data)if err != nil {log.Fatalln(err)}docs, err := redisStore.SimilaritySearch(ctx, "猫", 3,vectorstores.WithScoreThreshold(0.5),)fmt.Println(docs)// 将vector检索接入chains中result, err := chains.Run(ctx,chains.NewRetrievalQAFromLLM(llm,vectorstores.ToRetriever(redisStore, 3, vectorstores.WithScoreThreshold(0.8)),),"有哪些猫?",)fmt.Println(result)
}

Agent

  • Agent = LLM + Memory + Tools
  • 已集成工具使用
func agent_math_and_search(ctx context.Context) {llm, err := openai.New(openai.WithModel("gpt-3.5-turbo"),openai.WithBaseURL(conf.LLMHubConfig.Openai.Host),openai.WithToken(conf.LLMHubConfig.Openai.Key),)if err != nil {log.Fatal(err)}wikiTool := wikipedia.New("test")agentTools := []tools.Tool{tools.Calculator{},wikiTool,}agent := agents.NewOneShotAgent(llm, agentTools)executor := agents.NewExecutor(agent,agentTools,agents.WithCallbacksHandler(callbacks.LogHandler{}),)// 计算result, err := chains.Run(ctx, executor, "计算1024除以2并加1024的结果")if err != nil {log.Fatal(err)}fmt.Println(result)// 搜索result, err = chains.Run(ctx, executor, "今天的日期以及中国在去年今天发生了什么大事")if err != nil {log.Fatal(err)}fmt.Println(result)
}
  • 自定义工具
type randomNumberTool struct{}func (r randomNumberTool) Name() string {return "随机数计算工具"
}func (r randomNumberTool) Description() string {return "用于获取随机数"
}func (r randomNumberTool) Call(ctx context.Context, input string) (string, error) {return "1024", nil
}func agent_diy(ctx context.Context) {llm, err := openai.New(openai.WithModel("gpt-3.5-turbo"),openai.WithBaseURL(conf.LLMHubConfig.Openai.Host),openai.WithToken(conf.LLMHubConfig.Openai.Key),)if err != nil {log.Fatal(err)}agentTools := []tools.Tool{randomNumberTool{},}agent := agents.NewOneShotAgent(llm, agentTools)executor := agents.NewExecutor(agent,agentTools,agents.WithCallbacksHandler(callbacks.LogHandler{}),)result, err := chains.Run(ctx, executor, "告诉我一个随机数")if err != nil {log.Fatal(err)}fmt.Println(result)
}

相关文章:

大模型应用:LangChain-Golang核心模块使用

1.简介 LangChain是一个开源的框架&#xff0c;它提供了构建基于大模型的AI应用所需的模块和工具。它可以帮助开发者轻松地与大型语言模型(LLM)集成&#xff0c;实现文本生成、问答、翻译、对话等任务。LangChain的出现大大降低了AI应用开发的门槛&#xff0c;使得任何人都可以…...

【Tkinter界面】Canvas 图形绘制(03/5)

文章目录 一、说明二、画布和画布对象2.1 画布坐标系2.2 鼠标点中画布位置2.3 画布对象显示的顺序2.4 指定画布对象 三、你应该知道的画布对象操作3.1 什么是Tag3.2 操作Tag的函数 https://www.cnblogs.com/rainbow-tan/p/14852553.html 一、说明 Canvas&#xff08;画布&…...

【CS.PL】Lua 编程之道: 基础语法和数据类型 - 进度16%

2 初级阶段 —— 基础语法和数据类型 文章目录 2 初级阶段 —— 基础语法和数据类型2.0 关键字(keywords) &#x1f525;2.1 注释与标识符2.1.1 注释2.1.2 标识符 2.2 变量与赋值2.2.1 所有变量默认是全局变量 ≠ local, 有一个例外2.2.2 local变量是局部变量, 以end作为边界2.…...

centos7 xtrabackup mysql 基本测试(3)---虚拟机环境 安装mysql

centos7 xtrabackup mysql 基本测试&#xff08;3&#xff09;—虚拟机环境 安装mysql centos7 安装 mysql5.7 可以在运行安装程序之前导入密钥&#xff1a; sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022第一步、下载MySQL 安装包&#xff1a; sudo w…...

Java Native Interface 使用指南

我们知道Java本身的实现&#xff0c;很大一部分是用C写的。实际上&#xff0c;Java也允许我们和原生平台的代码进行交互。 Java定义了一个接口规范&#xff0c;就叫做Java Native Interface&#xff0c;通过这个接口规范&#xff0c;我们就可以让Java代码运行原生平台的代码。…...

代码随想录算法训练营第三十九天 | 62.不同路径、63. 不同路径 II、343. 整数拆分、96.不同的二叉搜索树

62.不同路径 题目链接&#xff1a;https://leetcode.cn/problems/unique-paths/ 文档讲解&#xff1a;https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE… 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ve4y1x7Eu/ 思路 确定dp数组以及下标的含…...

C/C++函数指针、C#委托是什么?

函数指针 #include<stdio.h>//声明函数指针 typedef int(*Calc)(int a, int b); int Add(int a, int b) {return a b; } int Sub(int a, int b) {return a - b; }int main() {Calc funcPoint1 &Add;Calc funcPoint2 &Sub;int x 120;int y 140;int z 0;z …...

红队攻防渗透技术实战流程:组件安全:JacksonFastJsonXStream

红队攻防渗透实战 1. 组件安全1.1 J2EE-组件Jackson-本地demo&CVE1.1.1 代码执行 (CVE-2020-8840)1.1.2 代码执行(CVE-2020-35728)1.2 J2EE-组件FastJson-本地demo&CVE1.2.1 FastJson <= 1.2.241.2.2 FastJson <= 1.2.471.2.3 FastJson <= 1.2.801.3 J2EE-组…...

Perl 语言学习进阶

一、如何深入 要深入学习Perl语言的库和框架&#xff0c;可以按照以下步骤进行&#xff1a; 了解Perl的核心模块&#xff1a;Perl有许多核心模块&#xff0c;它们提供了许多常用的功能。了解这些模块的功能和用法是深入学习Perl的第一步。一些常用的核心模块包括&#xff1a;S…...

LangGraph实战:从零分阶打造人工智能航空客服助手

❝ 通过本指南&#xff0c;你将学习构建一个专为航空公司设计的客服助手&#xff0c;它将协助用户查询旅行信息并规划行程。在此过程中&#xff0c;你将掌握如何利用LangGraph的中断机制、检查点技术以及更为复杂的状态管理功能&#xff0c;来优化你的助手工具&#xff0c;同时…...

R可视化:R语言基础图形合集

R语言基础图形合集 欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 基础图形可视化 数据分析的图形可视化是了解数据分布、波动和相关性等属性必…...

mysql导入sql文件失败及解决措施

1.报错找不到表 1.1 原因 表格创建失败&#xff0c;编码问题mysql8相较于mysql5出现了新的编码集 1.2解决办法&#xff1a; 使用vscode打开sql文件ctrlh&#xff0c;批量替换&#xff0c;替换到你所安装mysql支持的编码集。 2.timestmp没有设置默认值 Error occured at:20…...

JS:获取鼠标点击位置

一、获取鼠标在目标元素中的点击位置 getClickPos.ts: export const getClickPos (e: MouseEvent) > {return {x: e.offsetX,y: e.offsetY,}; };二、获取鼠标在页面中的点击位置 getClickPos.ts: export const getPageClickPos (e: MouseEvent) > {return {x: e.pa…...

使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压(附源码)

目录 1、使用场景 2、压缩包的创建 3、压缩包的解压 4、CloseZipZ和CloseZipU两接口的区别...

npm 异常:peer eslint@“>=1.6.0 <7.0.0“ from eslint-loader@2.2.1

node 用16版本 npm install npm6.14.15 -g将版本降级到6...

Docker|了解容器镜像层(2)

引言 容器非常神奇。它们允许简单的进程表现得像虚拟机。在这种优雅的底层是一组模式和实践&#xff0c;最终使一切运作起来。在设计的根本是层。层是存储和分发容器化文件系统内容的基本方式。这种设计既出人意料地简单&#xff0c;同时又非常强大。在今天的帖子[1]中&#xf…...

使用Python爬取temu商品与评论信息

【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作&#xff01; 【&…...

mybatis学习--自定义映射resultMap

1.1、resultMap处理字段和属性的映射关系 如果字段名和实体类中的属性名不一致的情况下&#xff0c;可以通过resultMap设置自定义映射。 常规写法 /***根据id查询员工信息* param empId* return*/ Emp getEmpByEmpId(Param("empId") Integer empId);<select id…...

Elasticsearch之写入原理以及调优

1、ES 的写入过程 1.1 ES支持四种对文档的数据写操作 create&#xff1a;如果在PUT数据的时候当前数据已经存在&#xff0c;则数据会被覆盖&#xff0c;如果在PUT的时候加上操作类型create&#xff0c;此时如果数据已存在则会返回失败&#xff0c;因为已经强制指定了操作类型…...

python中装饰器的用法

最近发现装饰器是一个非常有意思的东西&#xff0c;很高级&#xff01; 允许你在不修改函数或类的源代码的情况下&#xff0c;为它们添加额外的功能或修改它们的行为。装饰器本质上是一个接受函数作为参数的可调用对象&#xff08;通常是函数或类&#xff09;&#xff0c;并返…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...