注:本文是Langchain框架的学习笔记;不是教程!不是教程!内容可能有所疏漏,欢迎交流指正。后续将持续更新学习笔记,分享我的学习心得和实践经验。
Langchain是一个为大语言模型(LLM)应用开发而设计的框架,它诞生于2022年底,正是大语言模型迅速发展的时期。其产生背景主要有以下几个方面:
随着GPT-3、GPT-4等大语言模型的出现,开发者面临着如何有效利用这些模型构建实际应用的挑战。直接调用API虽然简单,但构建复杂应用时会遇到诸多问题:
提示词工程复杂且难以管理
上下文窗口限制导致长文本处理困难
缺乏与外部工具和数据源的连接机制
应用逻辑复杂时代码难以维护
大语言模型存在训练数据截止日期的限制,无法获取最新信息。同时,模型也不包含企业或个人的专有数据。这导致了两个核心问题:
模型回答可能包含过时信息
无法直接回答关于专有数据的问题
虽然大语言模型功能强大,但在特定场景下仍有局限性:
复杂推理能力有限
无法直接访问外部工具和API
长期记忆和上下文管理困难
结构化输出不稳定
Langchain正是为解决这些问题而诞生的,它提供了一套完整的工具和框架,帮助开发者更高效地构建基于大语言模型的应用。
Langchain的设计理念是提供一个模块化、灵活且可扩展的框架,使开发者能够轻松构建复杂的LLM应用。其核心优势体现在以下几个方面:
Langchain采用高度模块化的设计,将LLM应用开发拆分为多个独立组件:
Models:统一的模型接口,支持各种LLM提供商
Prompts:提示模板管理系统
Chains:将多个组件连接成处理流程
Memory:管理对话历史和上下文
Retrievers:实现高效的文档检索
Agents:自主决策和工具使用的智能体系统
这种模块化设计使开发者可以根据需求选择和组合不同组件,而不必从头构建整个系统。
Langchain为各种LLM操作提供了统一的抽象层:
统一的模型接口,屏蔽不同提供商API的差异
标准化的文档处理流程
一致的向量存储接口
通用的工具注册和调用机制
这种抽象使得开发者可以轻松切换底层实现,而不必修改应用逻辑。
Langchain的一大设计理念是"可组合性"(Composability),即各组件可以灵活组合形成复杂系统:
简单组件可以组合成复杂链
不同链可以相互嵌套
记忆系统可以与各种链集成
检索器可以插入到不同处理流程中
这种可组合性大大提高了开发效率和代码复用率。
作为开源项目,Langchain具有强大的社区支持:
活跃的开发者社区不断贡献新功能
丰富的集成支持各种外部服务和工具
完善的文档和示例加速学习曲线
持续更新以适应LLM技术的快速发展
要开始使用Langchain进行开发,首先需要配置适当的Python环境并安装必要的依赖。
需要安装ollama本地服务并下载大模型。
Langchain支持Python 3.8.1及以上版本,推荐使用Python 3.9或3.10以获得最佳兼容性。
本文使用Python3.11.5版本。
建议使用虚拟环境来隔离项目依赖:
# 使用venv创建虚拟环境
python -m venv langchain-env
# 激活虚拟环境
# Windows
langchain-env\Scripts\activate
# macOS/Linux
source langchain-env/bin/activate
pip install langchain langchain_core langchain_community langchain_ollama
# 其他依赖包按需下载
Ollama
是一个轻量级工具,支持在Windows
、Linux
和MacOS
上本地运行大语言模型。它允许用户非常方便地运行和使用各种大语言模型,比如Qwen
模型等。用户只需一行命令就可以下载或启动大模型。
打开官网,选择对应系统下载,下载后直接选择双击(默认安装C盘,可自行搜索如何换盘安装ollama)
安装完成之后,打开一个cmd命令窗口,输入“ollama”命令,如果显示ollama相关的信息就证明安装已经成功了!
Ollama常用命令
ollama serve # 启动ollama
ollama create # 从模型文件创建模型
ollama show # 显示模型信息
ollama run # 运行模型,如果模型不存在则自动下载模型
ollama pull # 下载模型,但不运行
ollama push # 将模型推送到注册仓库
ollama list # 列出已下载模型
ollama ps # 列出正在运行的模型
ollama cp # 复制模型
ollama rm # 删除模型
ChatBox连接本地模型
由于命令行操作窗口使用大模型不方便,可以选择客户端来连接本地模型,可以实现窗口聊天
市场上存在多种LLM应用开发框架,了解它们的异同有助于选择最适合的工具。
LlamaIndex(前身为GPT Index)专注于数据索引和检索:
相似点:
都支持RAG(检索增强生成)应用
都提供文档处理和向量存储集成
都支持多种LLM提供商
差异点:
LlamaIndex更专注于数据索引和查询优化
Langchain提供更全面的应用开发框架(Agents、Memory等)
LlamaIndex的查询引擎更丰富
Langchain的工具集成和Agent系统更强大
Haystack是一个专注于问答系统和搜索的框架:
相似点:
都支持模块化组件设计
都提供文档处理和检索功能
都支持多种模型集成
差异点:
Haystack更专注于搜索和问答系统
Langchain覆盖更广泛的LLM应用场景
Haystack的Pipeline概念类似于Langchain的Chain
Langchain的Agent系统更为先进
AutoGPT和BabyAGI是自主Agent系统:
相似点:
都涉及AI自主决策和任务执行
都利用LLM进行推理和规划
差异点:
AutoGPT/BabyAGI是完整的自主系统,而Langchain是开发框架
Langchain提供构建类似系统的工具和组件
Langchain更灵活,可用于构建各种应用
选择Langchain:如果需要构建全面的LLM应用,需要灵活性和可扩展性
选择LlamaIndex:如果主要关注数据索引和高效检索
选择Haystack:如果专注于构建搜索和问答系统
使用组合:实际上,这些框架可以结合使用,Langchain可以集成LlamaIndex作为检索器
Langchain发展迅速,版本选择和兼容性是重要考量因素。
Langchain更新非常频繁,几乎每周都有新版本发布:
主要版本(Major):引入重大架构变更,可能不向后兼容
次要版本(Minor):添加新功能,保持向后兼容
补丁版本(Patch):修复bug,不添加新功能
Langchain框架在其发展过程中进行了架构重组,将原本单一的包拆分为多个专注不同功能的包:
主包依赖于core和community包,提供了更高级别的抽象和功能,适合直接构建应用。
langchain-core (基础抽象和接口)
↑
|
langchain-community (第三方集成)
↑
|
langchain (高级功能和应用)
根据项目需求选择合适的版本策略:
生产环境:锁定特定版本,确保稳定性
开发环境:使用最新版本,获取新功能
长期维护项目:定期更新,但进行充分测试
注意Langchain与其他库的兼容性:
OpenAI API版本变更可能影响Langchain
向量数据库客户端版本需要匹配
Python版本兼容性(建议Python 3.9或3.10)
下面我将实际搭建一个基于Ollama和Langchain的开发环境,并实现一个简单的问答应用。
Ollama是一个轻量级工具,用于在本地运行各种开源大语言模型,如Llama 2、Mistral等。它的优势在于:
简化本地模型的运行和管理
提供API接口,便于与Langchain集成
支持多种开源模型
资源占用相对较低
ollama与langchain:
Ollama是一个应用工具,可以在本地部署和运行大模型,并提供标准化的API接口
LangChain 是一个开发框架,用于构建基于大语言模型的应用,LangChain 可以连接任何模型(无论是通过 Ollama 运行的本地模型 还是通过 API 访问的云端模型)
from langchain.llms import Ollama
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# 初始化Ollama LLM
llm = Ollama(model="llama2")
# 创建提示模板
template = """
请回答以下问题,尽可能详细和准确:
问题: {question}
回答:
"""
prompt = PromptTemplate(template=template, input_variables=["question"])
# 创建LLM链
chain = LLMChain(llm=llm, prompt=prompt)
# 运行链
question = "什么是Langchain框架,它有什么主要功能?"
response = chain.run(question)
print(response)
from langchain.llms import Ollama
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 初始化Ollama LLM
llm = Ollama(model="llama2")
# 创建对话记忆
memory = ConversationBufferMemory()
# 创建对话链
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# 对话循环
print("聊天机器人已启动,输入'退出'结束对话")
while True:
user_input = input("你: ")
if user_input.lower() == "退出":
break
response = conversation.predict(input=user_input)
print(f"机器人: {response}")
import os
from langchain.llms import Ollama
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OllamaEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 初始化Ollama LLM和嵌入模型
llm = Ollama(model="llama2")
embeddings = OllamaEmbeddings(model="llama2")
# 加载文档
loader = TextLoader("data/document.txt")
documents = loader.load()
# 分割文档
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# 创建向量存储
vectorstore = Chroma.from_documents(texts, embeddings)
# 创建检索QA链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
# 提问
query = "文档中提到了哪些主要概念?"
result = qa_chain.run(query)
print(result)
为了更好地理解Langchain,我们需要掌握其核心工作流程和概念。
Langchain的典型工作流程包括:
初始化模型:配置和初始化LLM或ChatModel
创建提示模板:设计和格式化提示词
构建处理链:将模型、提示和其他组件连接成链
执行链:处理输入并生成输出
解析结果:处理和格式化输出结果
Langchain支持两类主要模型:
LLM:接收文本输入,返回文本输出
ChatModel:基于消息列表交互,支持角色区分
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
# LLM示例
llm = OpenAI(temperature=0.7)
result = llm.predict("讲一个笑话")
# ChatModel示例
chat_model = ChatOpenAI()
from langchain.schema import HumanMessage
result = chat_model.predict_messages([HumanMessage(content="讲一个笑话")])
提示是与模型交互的关键:
PromptTemplate:文本模板,支持变量插入
ChatPromptTemplate:聊天模板,支持多角色消息
from langchain.prompts import PromptTemplate, ChatPromptTemplate
from langchain.prompts.chat import HumanMessagePromptTemplate
# 文本提示模板
prompt = PromptTemplate(
input_variables=["topic"],
template="给我讲一个关于{topic}的故事"
)
# 聊天提示模板
chat_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template("给我讲一个关于{topic}的故事")
])
链是Langchain的核心概念,用于组合多个组件:
LLMChain:最基本的链,连接提示和模型
SequentialChain:按顺序执行多个链
RouterChain:根据输入选择不同的链
from langchain.chains import LLMChain
# 基本LLM链
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run(topic="太空探索")
记忆组件用于管理对话历史:
ConversationBufferMemory:存储完整对话历史
ConversationSummaryMemory:存储对话摘要,节省上下文空间
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 带记忆的对话链
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=llm,
memory=memory
)