try langchain (by quqi99)

作者:张华 发表于:2024-03-18
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99)

基于Gemma的测试环境搭建

想学习一个langchain, 所以先运行一下langchain的例子,但发现openai调用API改为收费的了。看来只能本地搭建LLM, 半年前也试过在家里的NUC上运行过LLAMA2,但速度比较慢。现在据说Gemma也开源了,试了一下它速度挺快的。
在这里插入图片描述

curl -fsSL https://ollama.com/install.sh | sh
ollama list
# https://ollama.com/library  , qwen:7b是阿里的通义千问,对中文理解更好
#ollama run --gpu <model_name> gemma:2b
ollama run gemma:2b

sudo mkdir -p /etc/systemd/system/ollama.service.d
cat << EOF |sudo tee /etc/systemd/system/ollama.service.d/override.conf
[Service]
Environment="OLLAMA_HOST=0.0.0.0"
EOF
sudo systemctl daemon-reload && sudo systemctl restart ollama
sudo lsof -i :11434
curl -X POST http://minipc:11434/api/generate \
-H "Content-Type: application/json" \
-d '{"model": "gemma:7b", "prompt": "hi, who are you?"}'

sudo apt install docker.io -y
warp-cli status
sudo docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
# web portal: http://minipc:3000

运行第一个langchain程序

sudo pip3 install langchain
$ cat test.py
#!/usr/bin/env python
# coding=utf-8
#!/usr/bin/env python
# coding=utf-8
from langchain_community.chat_models import ChatOllama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

template = "tell me a joke about {topic}"
prompt = ChatPromptTemplate.from_template(template)
#llm = ChatOllama(model="gemma:2b")
llm = ChatOllama(model="qwen:7b")
chain = prompt | llm | StrOutputParser()
print(chain.invoke({"topic": "关羽"}))

$ ./test.py
Why did关羽战略性地拔掉了自己的一根胡子? 
因为他听说"髯公关,美髯公"不只是个称号,留胡子是身份的象征,他为了保全自己的“美髯”,干脆不留了。

RAG example

例子来自: https://zhuanlan.zhihu.com/p/685166253
RAG前的工作流程如下:向模型提问->模型从已训练数据中查询数据->组织语言->生成答案。
RAG后的工作流程如下:读取文档->分词->嵌入->将嵌入数据存入向量数据库->向模型提问->模型从向量数据库中查询数据->组织语言->生成答案。

$ ./test.py
根据提供的信息,身长七尺,细眼长髯的人物是曹操,他的官职是骑都尉,沛国谯郡人。
$ cat data.txt 
忽见一彪军马,尽打红旗,当头来到,截住去路。为首闪出一将,身长七尺,细眼长髯,官拜骑都尉,沛国谯郡人也,姓曹,名操,字孟德。
$ cat test.py
#!/usr/bin/env python
# coding=utf-8
# pip install tiktoken "langchain[docarray]"
from langchain_community.document_loaders import TextLoader
from langchain_community import embeddings
from langchain_community.chat_models import ChatOllama
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import DocArrayInMemorySearch
from langchain_community.embeddings import OllamaEmbeddings

model_local = ChatOllama(model="qwen:7b")
# 1. 读取文件并分词
documents = TextLoader("./data.txt").load()
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=7500, chunk_overlap=100)
doc_splits = text_splitter.split_documents(documents)
# 2. 嵌入并存储
embeddings = OllamaEmbeddings(model='nomic-embed-text')
vectorstore = DocArrayInMemorySearch.from_documents(doc_splits, embeddings)
retriever = vectorstore.as_retriever()
# 3. 向模型提问
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | model_local
    | StrOutputParser()
)
print(chain.invoke("身长七尺,细眼长髯的是谁?"))

从什么叫嵌入数据来理解自然语言处理原理

上面提到嵌入两个字,嵌入就是将文字(人类适合处理)转成数字(计算机适合处理)。
单词的表示法主要有三类:1)刚毕业2007年那会的基于同义词词典的方法需要人工标注语料库麻烦 2)演化成基于统计计数的方法 3)由于推理(word2vec)的自动标注.

这里以第2)种基于计数的方法为例。如一个语料库总共有N个单词:

  • 预处理,生成单词到数字及数字到单词映射的两个字典,以及这个生成一个NxN的根据上下文出现次数的共现矩阵(上下文是指某个单词最近的window-size距离的词).
  • 原始的共现矩阵需要改进,如根据点互信息生成PPMI矩阵来消除高频词的影响,如根据SVD的方法来降维,这样就形成了就得到了语料库中各单词的分布式表示。
  • 然后词和词之间的相似度就可以使用余弦相似度计算求夹角得到,用户查询一个词时就从向量数据库中返回最相似的如top=5个数的词即可。

上面第2)种基于计数的方法有一个问题,就是维数太大,例如,据说英文的词汇量就有超过100W, 那就是100Wx100W的庞大矩阵,这这么大的矩阵来运行SVD降维是不现实的。所以基于第3)种推理的来将单词分布式表示的方法就出来了。它一次只需计算一小部分数据(mini-batch),并反复更新权重。推理就是模型将一个词的上下文词(窗口可为1或更多)作为输入并输出各个单词的出现概率,这个上下文就可以通过one-hot方法来表示为2xN的向量(假设2是上下文窗口大小,N是语料库词汇量总数), 上下文词汇变成向量之后就可以通过神经网络来计算各个单词出的出现概率了。

所以各个模型就是来生成这个单词的分布式表示:

  • word2vec: 学习词在语料库的分布,根据上下(前后固定window-size的词)来找一个词(输出概念最大的几个)
  • RNN, 有记忆,无论上下文有多长都记得住,根据记忆中的上下文序列(多个词)找到下一个词(单个词), 这样适合机器翻译和语音识别
  • seq2seq, 根据记忆中的序列(多个词)找到下一个序列(多个词), 这样就可以写文章了和聊天了. 如组合两个RNN就可以实现seq2seq
  • seq2seq+Attention, 多头注意力能捕获词的关联性
  • Transformer, 并行化
  • GPT, 生成预训练(无监督)

所以这里的嵌入(往向量数据库添加数据时)是针对词一级别的嵌入还是基于一句话或者整段文字呢?

  • 对于上面提到的机器学习的大模型,感觉应该是基于词一级的嵌入,设置window-size大小可以改变上下文的大小,我们往向量库添加自己的数据之后,向量库里的词的分布式表示也会随之改变。这样就实现了学习。
  • 但对于上面的RAG例子中将外部文档数据应该是以chunk级别的,做查询的时候应该是先用api根据用户问题从向量库查出最相关的几段chunk文本,然后再将这些chunk文本和用户的问题一块往大模型里送

其他知识点:

  • TensorFlow,是一个机器学习的主流框架,它支持CNN, RNN等算法,可运行在大部分异构的硬件上(如CPU, GPU,TPU等)和网络设置上(如RPC,RDMA等)
  • kubeflow, 用于将tensorflow等框架跑在k8s上,相当于kubeflow是一个连接云计算与机器学习的桥梁。模型训练可以在性能好的物理机上运行,但是模型训练只是很小一部分,大部分工作是模型训练之外的工作如平台的搭建和配置,数据收集,数据检查,数据转换,模型分析,监控,日志收集和分析,服务发布与更新,迁移训练等还是在kubeflow上实现更好
  • langchain, 是一个怎么用各种大模型的就是开发大模型应用的框架。langchain需要去和众多的大模型打交道,并且还得通过Agent来得到大模型之后未学习到的实时数据,还得通过chain将这些数据流链起来。

Reference

[1] https://blog.csdn.net/quqi99/article/details/132720519
[2] https://zhuanlan.zhihu.com/p/685166253
[3] 使用 Langchain 和 Ollama 的 PDF 聊天机器人分步指南 - https://blog.csdn.net/woshicver/article/details/135614856
[4] https://python.langchain.com/docs/integrations/chat/ollama

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/481908.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8个国产全能型AI写作神器,给个标题就能自动生成全文 #其他#知识分享

国外ChatGPT爆火&#xff0c;AI写作在国内也引起不小的瞩目&#xff0c;目前国内的AI写作工具少说也有几十上百个&#xff0c;要在这么多AI写作中找出适合自己的工具&#xff0c;一个一个尝试是不太现实的&#xff0c;所以今天就给大家推荐一些款AI写作工具。帮助你少走弯路&am…

【黄啊码】使用cloudflare搭建OpenAI的接口

现在&#xff0c;我们可以使用cloudflare自己搭建一个OpenAI代理服务&#xff0c;使用我们自己的转发代理 第一步&#xff1a;注册cloudflare账号 前往官方网站注册一个账户 第二步&#xff1a;创建worker&#xff0c;进行请求中转 名字可以自己随便取一个&#xff0c;点击快…

GraalVM详细安装及打包springboot、java、javafx使用教程(打包springboot3篇)

前言 在当前多元化开发环境下&#xff0c;Java作为一种广泛应用的编程语言&#xff0c;其应用部署效率与灵活性的重要性日益凸显。Spring Boot框架以其简洁的配置和强大的功能深受开发者喜爱&#xff0c;而JavaFX则为开发者提供了构建丰富桌面客户端应用的能力。然而&#xff…

STC89C52单片机启动--综合案例秒表

代码功能&#xff1a; 1.自动开始计数&#xff0c;一共5个数码管来显示时间。一位数码管显示0-9&#xff0c;对应分度值是0.1s&#xff1b;两位数码管显示00-59&#xff0c;对应分度值1s&#xff1b;两位数码管显示00-59&#xff0c;对应分度值1min&#xff1b;上电后自动开始计…

C# 提示信息的几种方式,总有一种是你不知道的

很久没写文章了&#xff0c;今天有时间就总结一下关于提示信息的几种写法。 &#xff08;1&#xff09;第一种提示信息是winform中的提示信息MessageBox.Show() 开发C#的朋友们肯定都用过这个提示信息&#xff0c;这个方法中有几个参数。 平时用的比较多的形式有&#xff1a;…

Springboot笔记-03

1.properties配置文件 #配制oerson的值 person.lastname张三 person.age12 person.birth2017/12/12 person.bossfalse person.dog.namedag person.dog.age15 person.maps.k1v1 person.maps.k212 person.listsa,b,c运行结果乱码 因为idea默认是utf-8编码而properties是ascall编…

奇客PDF评论:优点、缺点和个人的结论

作为一个在职业中接触大量PDF文档的人&#xff0c;PDF编辑器对我来说是基本必需品。我希望我的 PDF 编辑器使用起来非常简单&#xff0c;同时还提供普通的编辑和转换功能。 我对功能足够强大、又不失简单性的 PDF 编辑器的追求最初让我想到了奇客PDF。 在过去的1年里我一直在…

Stompy:一款针对时间戳的Timestomp工具

关于Stompy Stompy是一款功能强大的时间戳管理工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员能够轻松对指定文件或目录的时间戳进行修改和操作。该工具基于PowerShell开发&#xff0c;并且支持对目标目录中的所有文件执行递归时间戳操作。 功能介绍 1、修改独立…

鸿蒙Harmony应用开发—ArkTS(@Extend装饰器:定义扩展组件样式)

在前文的示例中&#xff0c;可以使用Styles用于样式的扩展&#xff0c;在Styles的基础上&#xff0c;我们提供了Extend&#xff0c;用于扩展原生组件样式。 说明&#xff1a; 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 装饰器使用说明 语法 Extend(UI…

【NC】:追踪 CeO2上 Pt 单位点的形成、归宿和催化活性结果

摘要&#xff1a;铂单中心由于其高原子经济性而非常有吸引力&#xff0c;并且可以通过氧化高温处理在CeO2上生成。然而&#xff0c;它们的位置和活动引起了激烈的争论。此外&#xff0c;迄今为止&#xff0c;反应驱动的结构动力学尚未得到解决。在这项研究中&#xff0c;我们能…

JavaEE 初阶篇-多线程属性和方法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 创建线程对象并命名 2.0 线程属性 2.1 线程属性 - ID 2.2 线程属性 - 名称 2.3 线程属性 - 后台线程 2.4 线程属性 - 判断 PCB 是否存活 2.5 线程属性 - 终止线程…

Redis实战篇-1

实战篇Redis 开篇导读 短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节&#xff0c;我们会理解缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩等问题&#xff0c;让小伙伴的对于这些概念的理解不仅仅是停留在概念上&#xff0c;更是能在代码…

数据格式化方法

首先你需要一个可以展示代码的组件&#xff1b; 我使用的是tech-ui(内部组件库)&#xff1b; 你如果没有类似的组件&#xff0c;可以参考以下链接替代&#xff1a; react-monaco-editor -- 代码编辑器(适用Umi)_umi monaco editor-CSDN博客 Codemirror -- 代码编辑器(react…

Flutter Widget:StatefulWidgetStatelessWidgetState

Widget 概念 Widget 将是构建Flutter应用的基石&#xff0c;在Flutter开发中几乎所有的对象都是一个 Widget 。 在Flutter中的widget 不仅表示UI元素&#xff0c;也表示一些功能性的组件&#xff0c;如&#xff1a;手势 、主题Theme 等。而原生开发中的控件通常只是指UI元素。…

RK3568驱动指南|第十三篇 输入子系统-第145 章 输入子系统上报数据格式分析

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

CodeSys创建自定义的html5控件

文章目录 背景创建html5control.xml文件控件界面以及逻辑的实现使用的资源安装自定义的html5控件库 背景 查看官方的资料&#xff1a;https://content.helpme-codesys.com/en/CODESYS%20Visualization/_visu_html5_dev.html 官方的例子&#xff1a;https://forge.codesys.com/…

#Linux(VMwareTOOL安装)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09; &#xff08;2&#xff09;打开虚拟机然后安装&#xff0c;出现灰色可能是已经安装过但是自己没有找到 &#xff08;3&#xff09;删除VM…

React【Day1】

B站视频链接 一、React介绍 React由Meta公司开发&#xff0c;是一个用于 构建Web和原生交互界面的库 React的优势 相较于传统基于DOM开发的优势 组件化的开发方式不错的性能 相较于其它前端框架的优势 丰富的生态跨平台支持 React的市场情况 全球最流行&#xff0c;大…

烟火AI识别检测算法在新能源汽车充电桩站点的应用方案

新能源汽车作为现代科技与环保理念的完美结合&#xff0c;其普及和应用本应带给人们更加便捷和绿色的出行体验。然而&#xff0c;近年来新能源汽车充电火灾事故的频发&#xff0c;无疑给这一领域投下了巨大的阴影。这不禁让人深思&#xff0c;为何这一先进的交通工具在充电过程…

OpenCV+OpenCV-Contrib源码编译

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、OpenCV是什么&#xff1f;二、OpenCV 源码编译1.前期准备1.1 源码下载1.2 cmake安装1.3 vscode 安装1.4 git 安装1.5 mingw安装 2.源码编译2.1 打开cmake2.…