官方教程非常长,我看了很认可,但是看完了之后呢就需要一些整理得当的笔记让我自己能更快地找到需求。所以有了这篇文章。【写给自己看的,里面半句废话的解释都没有,如果看不懂的话直接看官方教程再看我的】

我是不打算一开始就用OpenAI的,打算先用一下开源模型。之后我还会写一篇OpenAI的速通版。

前置准备

pip install langchain
curl -fsSL https://ollama.com/install.sh | sh # linux装llama2的指令
# 如果用的是Windows或者MacOS,前往这里下载:https://ollama.com/

用Prompt模板

from langchain_community.llms import Ollama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser output_parser = StrOutputParser() llm = Ollama(model="llama2")
prompt = ChatPromptTemplate.from_messages([
("system", "You are world class technical documentation writer."),
("user", "{input}")
])
chain = prompt | llm | output_parser print(chain.invoke({"input": "how can langsmith help with testing?"}))

增加context:自定义文档内容

from langchain_community.llms import Ollama
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain llm = Ollama(model="llama2") prompt = ChatPromptTemplate.from_template("""Answer the following question based only on the provided context: <context>
{context}
</context> Question: {input}""") document_chain = create_stuff_documents_chain(llm, prompt) from langchain_core.documents import Document
docs = [Document(page_content="langsmith can let you visualize test results")] document_chain.invoke({
"input": "how can langsmith help with testing?",
"context": docs
})

增加context:从网页中获取文档内容

下面这个代码会读网页的内容到docs里,可以替代上一节的docs = Document(page_content="langsmith can let you visualize test results")部分。

from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://bbs.csdn.net/topics/618378840") docs = loader.load()

增加context:从PDF中获取文档内容

from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("3399.pdf") docs = loader.load()

注意,根据我的观察,LangChain的PDF loader 是基于 pypdf 的,而实际上pypdf 不是很好用,对表格之类的信息更是一塌糊涂,我更喜欢自己解析一下PDF文件。详情可以看这篇文章:【记录】Python|处理PDF的第三方库的对比大全(2024年)

用文档检索器 (RAG方法)

文档检索器的作用是根据一些加权,来判断所有的文档列表中哪一个文档是最适合当前的提问的。

下面的代码中增加了矢量检索器,详细的原理介绍见这里(具体原理我也没看,直觉上就是给文本加权重然后算一算这样)。根据官方说,它还可以加SQL 表、互联网等,我也没看懂。

from langchain_community.llms import Ollama
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain llm = Ollama(model="llama2") prompt = ChatPromptTemplate.from_template("""Answer the following question based only on the provided context: <context>
{context}
</context> Question: {input}""") document_chain = create_stuff_documents_chain(llm, prompt) from langchain_core.documents import Document
docs = [Document(page_content="langsmith can let you visualize test results")] from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs) from langchain_community.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings()
from langchain_community.vectorstores import FAISS
vector = FAISS.from_documents(documents, embeddings) from langchain_community.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings()
from langchain_community.vectorstores import FAISS
vector = FAISS.from_documents(documents, embeddings) from langchain.chains import create_retrieval_chain retriever = vector.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain) response = retrieval_chain.invoke({"input": "how can langsmith help with testing?"})
print(response["answer"])

增加chat_history:利用MessagesPlaceholder

总之就是改了Prompt结构,再多引入了一个create_history_aware_retriever函数。

from langchain_community.llms import Ollama
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain llm = Ollama(model="llama2") from langchain_core.prompts import MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages([
("system", """Answer the user's questions based on the below context: <context>
{context}
</context>"""),
MessagesPlaceholder(variable_name="chat_history"),
("user", "{input}"),
]) ## Add MessagesPlaceholder document_chain = create_stuff_documents_chain(llm, prompt) from langchain_core.documents import Document
docs = [Document(page_content="langsmith can let you visualize test results")] from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs) from langchain_community.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings()
from langchain_community.vectorstores import FAISS
vector = FAISS.from_documents(documents, embeddings) from langchain_community.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings()
from langchain_community.vectorstores import FAISS
vector = FAISS.from_documents(documents, embeddings) from langchain.chains import create_retrieval_chain ##-- Start changing --##
retriever = vector.as_retriever() from langchain.chains import create_history_aware_retriever
retriever_chain = create_history_aware_retriever(llm, retriever, prompt) from langchain.chains import create_retrieval_chain
retrieval_chain = create_retrieval_chain(retriever_chain, document_chain) from langchain_core.messages import HumanMessage, AIMessage chat_history = [HumanMessage(content="Can LangSmith help test my LLM applications?"), AIMessage(content="Yes!")]
response = retrieval_chain.invoke({
"chat_history": chat_history,
"input": "Tell me how",
"context": "" # I don't know why the 'context' variable is needed here, but it is required by the 'prompt' variable.
}) print(response)

运行结果:

切换LLM model

ollama中包含了许多开源大模型,llama2只是其中的只有3.8G的一个小模型llama2:7b罢了。
为了实现更好的效果,建议用更大的模型比如13b或者70b。

运行大模型只需要对应的内存满足要求就可以了,不需要像训练那样需要太多的GPU开销啥的,挺划算的也挺好部署的,你们也可以试试用比较大的开源模型而不是用初始的那个llama2:7b。

切换模型很简单,步骤如下:

  1. 打开https://ollama.com/library找到你想要的模型。
  2. 以llama2:13b为例。切换分支到13b,关注指令pull后接的名称(这里是llama2:13b)。
  3. 复制pull指令并粘贴到终端:ollama run llama2:13b
  4. 修改代码,把model=后面的llama2改成对应的名称即可,如下所示:
    from langchain_community.llms import Ollama
    llm = Ollama(model="llama2:13b")

后话

代理那一节,官方说本地模型的代理不可靠,而且这个也只是调用一些其他工具API,有需求的话自己看一下,我对这个没需求。

至于后面的 langserve 的介绍,对我挺有用的但是暂时不需要写这个部分的代码,所以我寻思着以后要用了再写下一篇博客吧,这篇博客差不多长度了。

【记录】LangChain|Ollama结合LangChain使用的速通版(包含代码以及切换各种模型的方式)的更多相关文章

  1. 澎湃新闻速览版UWP 隐私策略

    ThePaper UWP 此为 澎湃新闻速览版 的隐私策略,本隐私策略内容会不定期更新,以最新内容为主. 若您已经阅读并了解以下内容后,并继续使用该软件,即表示您已同意该协议. 内容: 这是澎湃新闻的 ...

  2. 【资源分享】半条命2速通AHK脚本

    *----------------------------------------------[下载区]----------------------------------------------* ...

  3. Linux速通 随笔整理

    Linux速通 随笔整理 为了方便阅读,特整理了相关的学习笔记 零.大纲 一.系统安装 二.命令格式 三.文件管理 四.用户群组 五.文件处理 六.系统初始化及监控 七.硬盘初始化 八.网络原理

  4. (数据科学学习手札151)速通pandas2.0新版本干货内容

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,前两天pandas正式发布了其 ...

  5. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

  6. Linux速通04 用户、群组、权限

    用户及passwd文件 # /etc/passwd文件的功能:存储所有用户的相关信息,实际上是存放用户信息的数据库(database) # 各个字段的含义: * 第一个字段(列)记录的是这个用户的名字 ...

  7. Python系列教程-详细版 | 图文+代码,快速搞定Python编程(附全套速查表)

    作者:韩信子@ShowMeAI 教程地址:http://showmeai.tech/article-detail/python-tutorial 声明:版权所有,转载请联系平台与作者并注明出处 引言 ...

  8. go包管理速通,一篇文章就够了,再也不用担心因为不会导包被辞退

    前言 最近在看一些go语言相关的书,发现了一个有意思的事情:其中一本书最新印刷的版本是2017年3月,而golang包管理的后起之秀go module伴随go1.11于2018年8月诞生--因此,书里 ...

  9. Win7旗舰版-X86-X64-快速装机版

    装机版作品简介 Win7 32/64位旗舰版 6.5z 专注于Win7,致力于做更好用的系统!一如既往的品质,不流氓,不欺骗,不夸大!一直在改进,只为做得更好!万千用户的信赖,作者的品质保证! 作品摘 ...

  10. 【Unity3D自学记录】可视化对照十多种排序算法(C#版)

    在这篇文章中.我会向大家展示一些排序算法的可视化过程.我还写了一个工具.大家可对照查看某两种排序算法. 下载源代码 – 75.7 KB 下载演示样例 – 27.1 KB 引言 首先,我觉得是最重要的是 ...

随机推荐

  1. Flink客户端操作

    一.mysql数据准备 mysql -hip -uroot -p密码 CREATE DATABASE flink; USE flink; CREATE TABLE user ( id INTEGER ...

  2. calcite-avatica数据传输时对日期类型压缩,导致客户端展示数据异常问题排查

    一.背景 用户使用如下sql来获取周开始和结束时间,直连presto查询该sql,得到的week_start=2019-12-30,而通过calcite-avatica查询出结果为week_start ...

  3. USACO24DEC Cake Game S 题解 [ 黄 ] [ 前缀和 ] [ adhoc ]

    Cake Game:小清新前缀和题,但是我场上想了半天优先队列贪心假完了 /ll/ll/ll. 观察 本题有三个重要的结论,我们依次进行观察. 不难发现,第二个牛一定会拿 \(\frac{n}{2}- ...

  4. nginx 简单实践:Web 缓存【nginx 实践系列之三】

    〇.前言 本文为 nginx 简单实践系列文章之二,主要简单实践了两个内容:正向代理.反向代理,仅供参考. 关于 Nginx 基础,以及安装和配置详解,可以参考博主过往文章: https://www. ...

  5. ABC323E Playlist 题解

    考虑第 \(i\) 时刻时,第 \(j\) 首歌刚好结束与第 \(i-j\) 时刻有关,因此设 \(dp_{i,j}\) 表示第 \(i\) 时刻第 \(j\) 首歌刚好结束的概率,那么 \(dp\) ...

  6. Arduino函数库和程序架构

    Arduino程序的架构大体可分为3个部分. (1)声明变量及接口的名称. (2)setup().在Arduino程序运行时首先要调用setup()函数,用于初始化变量.设置针脚的输出/输入类型.配置 ...

  7. DeepSeek过时了?全网刷屏的Manus到底是什么?这样写申请秒过审核

    1.Manus是什么? Manus的官网地址:https://manus.im/ Manus是一个通用AI智能体,它连接思维与行动:它不仅思考,还能交付成果. 2. Manus能做什么? 最近几天,M ...

  8. Python 潮流周刊#93:为什么“if not list”比len()快2倍?(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  9. Detected non-NVML platform: could not load NVML: libnvidia-ml.so.1: cannot open shared object

    前言 在 kubernetes 中配置 https://github.com/NVIDIA/k8s-device-plugin 时, 报错:Detected non-NVML platform: co ...

  10. deepseek内网离线部署手册

    前言 在当下 AI 浪潮汹涌的时代,DeepSeek 以其卓越的性能和出色的表现,迅速成为了众多专业人士和科技爱好者热议的焦点工具.在众多AI大模型的比拼中,DeepSeek 展现出了优越的实力.然而 ...