Electron蜜汁依赖问题
问题今天更新electron依赖时遇到了问题:
123npm error command C:\Windows\system32\cmd.exe /d /s /c node install.jsnpm error RequestError: Hostname/IP does not match certificate's altnames: Host: npm.taobao.org. is not in the cert's altnames: DNS:*.tbcdn.cn, DNS:*.taobao.com, DNS:*.alicdn.com, DNS:*.cmos.greencompute.org, DNS:cmos.greencompute.org, DNS:m.intl.taobao.com, DNS:*.mobgslb.tbcache.com, DNS:*.alikunlun.com, DNS:alikunlun.com, DNS:*.django.t.taobao.com, DNS:alicdn.com, DNS:*.tbcache.com, DNS:* ...
一文搞定Electron进程通信
Electron 进程通信渲染进程到主进程(单项)主要使用的api如下:
ipcMain.on
ipcRenderer.send
我们一般使用web界面,向主进程进行发送信息。
demo如下:
写一个将程序窗口标题设置为index.html标题的功能:
main.js
1234567891011121314151617181920212223242526272829303132333435const {BrowserWindow,app,ipcMain} = require("electron")const path = require("path")function createWin(){ const win = new BrowserWindow({ width:200, height:200, webPreferences:{ preload: path.join(__dirname,"preload.js") } ...
大白话系列之JavaScript原型及面向对象
大白话系列之JavaScript原型及面向对象对象前言一开始就和Java一样整个new
12345678// 1.创建一个空的对象var obj1 = new Object()obj1.name = "xiaoyu"obj1.age = 18obj1.height = 1.88obj1.eating = function() { console.log(this.name + "在吃东西")}
后来很多开发者为了方便期间,都是直接通过字面量的形式来创建对象:
12345678var obj2 = { name: "kobe", age: 40, height: 1.98, running: function() { console.log(this.name + "在跑步") }}
对象属性描述如果使用字面量形式进行声明对象属性,我们就失去了对对象属性的精准控制。
如:
这个属性我能不能delete
这个属性能不能在for ...
Langchain系列[20]与SQL数据库进行聊天
使用Python和LangChain与MySQL(或SQLite)数据库进行聊天。
text2Sql chain
text2Sql Agent
Sql 操作封装
我们将使用sqlalchemy的LangChain包装器与数据库交互。我们还将使用langchain包创建一个自定义链/Agent,使我们能够使用自然语言与数据库进行聊天。
使用到的工具
Python 3.9 or later
MySQL
Mysql 安装配置 →https://zhuanlan.zhihu.com/p/338149747
SQLite
[1] sqlite 使用
1-1 下载dll 和 tools 2个zip
1-2 将解压后的文件,放到系统环境变量可以识别的Path下面
1-3 任意打开命令行,验证一下,运行: sqlite3
1-4 模拟数据:Chinook Database
https://github.com/lerocha/chinook-database
Chinook是一个适用于SQL Server、Oracle、MySQL等的示例数据库。Chinook数据库是N ...
Langchain系列[19]信息抽取+langserve服务端
目标了解如何利用模型 抽取信息
1.概览大型语言模型(LLMs)正在成为驱动信息提取应用的一种极其强大的技术。 传统的信息提取解决方案依赖于人力、大量手工制作的规则(例如正则表达式)以及定制微调的机器学习模型。随着时间的推移,这些系统往往会变得复杂,维护成本逐渐增加,且难以提升。 LLMs可以快速适应特定的提取任务,只需向它们提供适当的指令和合适的参考示例。 通过LLM提取文本关键信息。
…
《美棠来信:我们一家人》 作者:饶平如 出品方/出版社:小阅读Random 预计出版时间:2023年6月 (书封待定,图为作者饶平如) 继《平如美棠》后,《美棠来信》更加细致地呈现出家书中一个中国普通家庭的记忆。1973年至1979年,饶平如下放安徽,毛美棠留在上海照顾家庭。不久,家中年长的孩子们也响应知识青年上山下乡,去安徽、江西等地下乡。分散在各地的家庭成员,唯一连接他们亲情的,是一封封往来两地的家书。
本书收录了饶平如在1973年到1979年之间收到的来自妻子美棠和孩子的近两百封家书。在那个通讯不便的年代,在这些家书里,他们互相汇报生活近况,通报生活上遇到的困难,给对方出谋划策,嘘寒 ...
Langchain系列[18]RAG:命令行 + UI + Agent
目标初步认识 RAG。学习基本RAG的实现方式。
索引数据
第一步,我们用Loader载入文档
1234path = "./test"text_loader_kwargs = {'autodetect_encoding': True}loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader, loader_kwargs=text_loader_kwargs,show_progress=True)docs = loader.load()
第二部,我们分割文档
1234567891011text_splitter = RecursiveCharacterTextSplitter( # Set a really small chunk size, just to show. chunk_size=500, chunk_overlap=0, length_function=len,)doc_list = [ ...
Langchain系列[17]基于用户的搜索 + 添加引文信息
注意本文只是一个思路,实际上常规业务场景并不会采用这个方案。基于用户的搜索
当构建一个检索应用时,你通常需要考虑到多个用户。
目前,LangChain 中没有统一的标志或过滤器来实现这一点。相反,每个向量存储和检索器可能都有自己的实现,并且可能被称为不同的事物。 对于向量存储来说,这通常作为一个关键字参数在 similarity_search 过程中传递。通过阅读文档或源代码,弄清楚你使用的检索器是否支持多个用户,如果支持,如何使用它。这意味着你可能不仅仅是为一个用户存储数据,而是为许多不同的用户存储数据,他们不应该能够看到彼此的数据。
实现步骤:
第一步:确保你使用的检索器支持多个用户 (自己设计数据存储结构)
第二步:将该参数作为一个可配置字段添加到链中(当作参数传递)
第三步:使用该可配置字段调用链(调用时,区分用户)
1234比如ElasticSearch 在相似度搜索时,可以添加过滤参数 docs = vectorstore.similarity_search( query_text, filter=[{"term": ...
Langchain系列[16]下载和使用Rerank模型
Rerank
即重新排序,是信息检索、推荐系统、自然语言处理和机器学习领域中的一种常见技术。它的目的是提高搜索结果、推荐列表或生成内容的相关性,使其更符合用户的需求或期望。
在RAG里,我们主要利用Rerank 模型来对初步检索出的文档(比如通过BM25或者向量检索召回的文档)进行重排序和过滤。
支持一种语言的嵌入模型
英语 bge-large-en
中文 bge-large-zh
支持双语的嵌入模型
网易有道 BCEmbedding
网易有道 BCEmbedding
优势
双语和跨语种能力:基于有道翻译引擎的强大能力,BCEmbedding实现强大的中英双语和跨语种语义表征能力。
RAG适配:面向RAG做针对性优化,可适配大多数相关任务,比如翻译,摘要,问答等。此外,针对 问题理解(query understanding) 也做了针对优化
高效且精确的语义检索:EmbeddingModel采用双编码器,可以在第一阶段实现高效的语义检索。RerankerModel采用交叉编码器,可以在第二阶段实现更高精度的语义顺序精排。
更好的领域泛化性:为了在更多场景实现更好的效果,我 ...
Langchain系列[15]向量过滤 VS 文档去重
向量过滤 EmbeddingsFilter
使用大型语言模型(LLM)来处理每个找到的文件很费钱,而且速度不快。
而EmbeddingsFilter这个工具提供了一种更经济、更迅速的方法。
它会先将文件和你的问题转换成一种数学表达(嵌入),然后只挑出那些和你的问题在数学表达上相似的文件。这样就不需要每个文件都去麻烦那个大模型,省时省力。
设定一个门限值,通过输入问题和内容的相关度(0~1),进行过滤
12345678910111213141516171819202122232425question = "What is Task Decomposition ?"# 解析并载入urlloader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")docs = loader.load()text_splitter = RecursiveCharacterTextSplitter(chunk_size=400)docs = text_splitter.split ...
Langchain系列[14]文档内容提取vs内容过滤
文档内容提取:LLMChainExtractor
在检索过程中,一个挑战是通常你不知道你的文档存储系统在数据导入时会遇到哪些具体的查询。这意味着对查询来说最相关的信息可能埋没在一个包含大量不相关文本的文档中。
将整个文档通过你的应用程序可能会导致更昂贵的LLM(大型语言模型)调用和更差的响应。 上下文压缩旨在解决这个问题。这个想法很简单:不是立即按原样返回检索到的文档,而是可以使用给定查询的上下文来压缩它们,以便只返回相关信息。这里的“压缩”既指压缩单个文档的内容,也指整体过滤掉文档。 要使用上下文压缩检索器,你需要:- 一个基础检索器- 一个文档压缩器 上下文压缩检索器将查询传递给基础检索器,获取初始文档并通过文档压缩器传递它们。文档压缩器接收一个文档列表,通过减少文档内容或完全删除文档来缩短列表。
核心思想:对召回的文档进行关键信息提取
langchain 解决办法
retriever : 向量数据库实例化的检索器
compressor: 本质是一个chain, 传入一个语言模型(比如千帆)
12345# LLMChainExtractorcompressor = LLMChai ...
Langchain系列[13]检索器 MultiVector Retriever
目标了解MultiVector Retriever 的使用场景
存储每个文档的多个向量通常是有益的。
LangChain 有一个基础的 MultiVectorRetriever,它可以轻松查询这种类型的设置。大部分复杂性在于如何为每个文档创建多个向量。
创建每个文档的多个向量的方法包括:
较小的块:将文档分成较小的块,并嵌入这些块(这就是 ParentDocumentRetriever)。
摘要:为每个文档创建一个摘要,并嵌入该摘要,以及(或代替)文档。
假设性问题:创建假设性问题,每个文档都适合回答,并嵌入这些问题,以及(或代替)文档。
手动添加
分割成小块
生成摘要
提问
InMemoryByteStore: 将文件ID映射在内存,找到小块后,根据ID找到文件
文本信息保存在内存:InMemoryByteStore
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849# 本地 BGE 模型bge_en_v1p5_model_path = &q ...
Langchain系列[12]检索器 EnsembleRetriever
目标了解EnsembleRetriever的使用场景
EnsembleRetriever是一个工具,它将多个检索器的列表作为输入,并将这些检索器返回的相关文档结果进行整合。然后,它使用Reciprocal Rank Fusion算法对这些结果进行重新排序。 通过结合不同算法的优点,EnsembleRetriever的表现可以超过任何一个单独的算法。 最常见的方法是将一个基于稀疏特征的检索器(比如BM25)与一个基于密集特征的检索器(比如嵌入向量相似性)结合起来,因为它们的优点可以互相补充。这种方法也被称为“混合搜索”。稀疏检索器擅长根据关键词找到相关文档,而密集检索器则擅长根据语义相似度找到相关文档。
BM25搜索 + 向量搜索
ElasticSearch BM25: langchain 实现的ES 数据库的BM25搜索
直接调用Langchain 的 ElasticSearchBM25Retriever 搜索方法,什么也查不到!?
代码分析:
就是调用了ES的 search 方法,在 content 这个域搜索query
12345678910def _get_relevant_ ...
Langchain系列[11]检索器 MultiQueryRetriever
目标了解 MultiQueryRetriever 的使用场景和用法。
检索可能会因查询用词的微小变化或在嵌入不能很好地捕获数据语义时产生不同的结果。
多查询检索器(MultiQueryRetriever)通过使用大型语言模型(LLM)来自动化提示调优过程。对于给定的用户输入查询,它生成多个查询,每个查询都从不同的角度生成。
对于每个查询,它检索一组相关的文档,并取所有查询的独特并集,以获得一组可能相关的更大文档集合。通过为同一问题生成多个视角,多查询检索器可能能够克服基于距离的检索的一些局限性,并获取更丰富的结果集。
MultiQueryRetriever 基本思想 :
基于某个问题,从不同角度提出新问题,每个新问题从数据库中召回文本
关键提示词
1234567You are an AI language model assistant. Your task is to generate 3 different versions of the given user question to retrieve relevant documents from a vect ...
Langchain系列[10]文档加载 Document loader
目标能够熟练把文件载入到系统中,生成Document 对象。
CSV默认参数
1234567loader = CSVLoader(file_path='./test/csv_test.csv')data = loader.load()[Document(page_content='姓名: 张三\n年龄: 23\n成绩: 优秀', metadata={'source': './test/csv_test.csv', 'row': 0}), Document(page_content='姓名: 里斯\n年龄: 26\n成绩: 良', metadata={'source': './test/csv_test.csv', 'row': 1}), Document(page_content='姓名: 王五\n年龄: 34\n成绩: 可', m ...
Langchain系列[09]向量数据库 Chroma+Elastic Search
目标了解向量数据库的作用,能够使用本地向量数据库Chroma 和 云端的 Elastic Search
向量搜索是一种常见的存储和搜索非结构化数据(如非结构化文本)的方法。其思想是存储与文本相关的数值向量。给定一个查询,我们可以将其嵌入为相同维度的向量,并使用向量相似性度量来识别存储中的相关数据。
LangChain VectorStore 对象包含用于将 文本和 Document 对象添加到存储中的方法,并使用各种相似性度量来查询它们。它们通常使用嵌入模型进行初始化,这些模型决定了文本数据如何转换为数值向量。
LangChain 包含了一套与不同向量存储技术集成的工具。一些向量存储由提供商托管(例如,各种云服务提供商),使用时需要特定的凭据;
另一些(如 Postgres)在独立的基础设施中运行,可以本地运行或通过第三方运行;还有一些可以内存运行,用于轻量级工作负载。
文档 Documents在正式进入主题之前,我们需要介绍一下langchain中对于文档的抽象Documents。
LangChain 实现了一个 Document 抽象,旨在表示文本单元和相关元数据。它有两个属 ...
Langchain系列[08]嵌入模型 Embeddings
目标了解嵌入模型的概念及使用
嵌入模型为一段文本创建了一个向量表示。
这很有用,因为这意味着我们可以将文本视为向量空间中的内容,并进行诸如语义搜索之类的操作,在向量空间中寻找最相似的文本片段。
Embeddings类是一个设计用来与文本嵌入模型交互的类。
有许多嵌入模型提供商(如OpenAI、百度、智谱等)——这个类旨在为所有这些提供商提供一个标准的接口。
LangChain中的基础Embeddings类提供了两种方法:
一种用于嵌入文档,另一种用于嵌入查询。
前者接受多个文本作为输入,而后者接受单个文本。
之所以将这两个方法分开,是因为一些嵌入提供商对于文档(搜索对象)和查询(搜索查询本身)有不同的嵌入方法。
bge-base-en-v1.5https://modelscope.cn/models/AI-ModelScope/bge-base-en-v1.5/summary
Rerank模型
bge-large-zh-v1.5https://modelscope.cn/models/AI-ModelScope/bge-large-zh-v1.5/summary
嵌入模型的使用本地 ...
Langchain系列[07] 函数 VS 工具 VS Agent
目标了解 function 调用、工具调用 和 Agent
function:别用了(OpenAI API has deprecated functions in favor of tools)
Tool :能用,但是需要我们自己调用函数,并实现后续逻辑
Agent: 推荐,自动调用我们本地定义的函数
核心思想:通过llms 来识别用户意图并调用本地函数(Agent)
https://python.langchain.com/docs/modules/agents/agent_types/openai_functions_agent
1. function call + tools大模型的函数调用功能,最早来自OpenAI.
OpenAI 函数是 OpenAI API 中的一个功能,允许用户通过 API 调用自定义函数。这些函数可以是在 Python 中定义的任何函数,可以接受任何类型的输入,并返回任何类型的输出。这使得用户可以扩展 OpenAI 模型的功能,使其能够执行特定的任务或操作。
OpenAI 函数的接收方式如下:
首先,用户需要定义一个函数,并将其作为参数传递给 Ope ...
Langchain系列[06]语言模型
目标模型入门
Langchain 2.0 都找不到下面这个图了,藏到了1.0 里面…
语言模型是核心,我们需要熟悉跟语言模型相关的消息:系统消息、AI消息、Human消息、工具消息…
llm vs chatModel
百度千帆
对话
1234567chat_comp = qianfan.ChatCompletion(access_key="...", secret_key="...")# 调用默认模型,即 ERNIE-Bot-turboresp = chat_comp.do(messages=[{ "role": "user", "content": "你好"}])
完成
123456789comp = qianfan.Completion()resp = comp.do(model="ERNIE-Bot", prompt="你好")# 输出:你好!有什么我可以帮助你的吗?# 续写功能同样支 ...
Langchain系列[05]runnable系列函数
目标为了帮助小伙伴们更好的发挥chain 的作用以及增加chain 的灵活性,有一些函数可以参与到chain的各环节,这个文档来给大家介绍一下~
RunnableParallel
RunnablePassthrough
RunnableLambda
RunnableBranch
RunnableParallelRunnableParallel 在将一个 Runnable 的输出调整为符合序列中下一个 Runnable 的输入格式时非常有用。在这里,提示(prompt)的输入预期是一个包含“context”和“question”键的映射(map)。用户输入仅仅是问题(question)。我们需要使用我们的检索器(retriever)获取上下文(context),并将用户输入作为“question”键下的值传递过去。
123456789101112131415161718192021# 提示词template = """Answer the question based only on the following context:{contex ...
Langchain系列[04]表达式语言LCEL
目标123- 了解LCEL包含的组件,可以调用的方法。- 链式调用基本形式
LangChain 表达式语言(LCEL)是一种让用户能够更容易地组合不同链条的声明式编程方式。
之前我们介绍了chain 中的组件,这个文档来明确一下组件之间的输入和输出
LCEL 从一开始就是为了支持将原型直接投入生产而设计的,无需修改任何代码。这适用于从最简单的“提示+大语言模型”链条到最复杂的链条(我们已经看到有人成功在生产环境中运行包含数百个步骤的 LCEL 链条)。以下是您可能想使用 LCEL 的几个原因:
流支持:使用 LCEL 构建链条时,您可以从第一个令牌开始就获得最快的响应时间(即从输出开始到第一个数据块出现的时间)。对于某些链条来说,这意味着我们可以直接从大语言模型向输出解析器发送令牌流,您将以与模型提供者输出原始令牌相同的速度接收到解析后的数据块。
异步支持:使用 LCEL 构建的任何链条都可以通过同步 API(例如,在 Jupyter 笔记本中测试原型)或异步 API(例如,在 LangServe 服务器中)调用。这使得您可以使用相同的代码进行原型设计和生产,同时还能保持出色 ...






























![Langchain系列[01]介绍](/img/langchain/cover.png)

