LangChain是一个框架,用于开发由大型语言模型(LLM)驱动的应用程序。
LangChain 简化了 LLM 应用程序生命周期的每个阶段:
总结: LangChain是一个用于开发由LLM支持的应用程序的框架,通过提供标准化且丰富的模块抽象,构建LLM的输入输出规范,主要是利用其核心概念chains,可以灵活地链接整个应用开发流程。(即,其中的每个模块抽象,都是源于对大模型的深入理解和实践经验,由许多开发者提供出来的标准化流程和解决方案的抽象,再通过灵活的模块化组合,才得到了langchain)
添加描述
想象一下,如果要组织一个AI应用,开发者一般需要?
由上边的内容,引出LangChain抽象的一些核心模块:
LangChain通过模块化的方式去高级抽象LLM在不同场景下的能力,其中LangChain抽象出的最重要的核心模块如下:‘
LangChain的特点如下:
在使用大模型的过程中,一些行业痛点:
pip install langchain
faiss: 向量搜索工具,如果有GPU的话,可以安装GPU版本,这里使用的是CPU版本。
pip install pandas
pip install openpyxl
pip install langchain
pip install -U langchain-community
pip install sentence-transformers
pip install faiss-cpu
pip install pyjwt
数据加载: 这里使用的是财经类数据
import pandas as pd
file_path = 'SmoothNLP专栏资讯数据集样本10k.xlsx'
# 使用pandas读取xlsx文件
data = pd.read_excel(file_path)[:50]
data
输出:
文档分割: 这里使用的是较为简单的文档分割方法,即一行内容当作一块检索内容。
from langchain.schema import Document
# 逐行处理数据并创建Document对象
documents = []
for index, row in data.iterrows():
title = row['title']
content = row['content']
combined_text = f"{title}\n{content}"
# 创建Document对象
document = Document(page_content=combined_text)
# 将Document对象添加到列表中
documents.append(document)
# 现在,documents列表包含了所有的Document对象,可以用于后续的处理
documents[1]
输出:
更加通用的一种写法: 这里主要是没有写死列名,而是通过column_names 来更加灵活的获取列名。
column_names = data.columns.tolist()
documents = []
for index, row in data.iterrows():
combined_text = ""
# 遍历每一列,将列名和对应的值拼接成字符串
for column in column_names:
value = row[column]
# 将列名和值拼接,可以用换行符或其他分隔符分隔
combined_text += f"{column}: {value}\n"
# 创建Document对象
document = Document(page_content=combined_text)
# 将Document对象添加到列表中
documents.append(document)
documents[1]
向量搜索: 这里使用HuggingFaceEmbeddings来进行文档的编码,使用Faiss来进行向量的检索,也可以尝试换其他常用的工具。
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
embeddings = HuggingFaceEmbeddings()
db = FAISS.from_documents(documents, embeddings)
query = "双11广告我应该怎么打?"
docs = db.similarity_search(query)
docs
输出:
# 实例化一个 similarity_score_threshold Retriever
retriever = db.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={"score_threshold": 0.8}
)
docs = retriever.get_relevant_documents("苏宁618")
for doc in docs:
print(doc.page_content + "\n")
# 存储
db.save_local("real_estates_sale")
# 加载
db = FAISS.load_local("real_estates_sale", embeddings)
数据库检索&LLM: LLM参考检索的内容来对用户的提问做出回答。
create_stuff_documents_chain: create_stuff_documents_chain 是 LangChain 提供的一个函数,它用于创建一个链,这个链可以将一系列文档(Documents)格式化为一个提示(prompt),并将这个提示传递给一个语言模型(LLM)。这个函数非常适合于需要将多个文档内容作为上下文传递给模型的场景,例如问答系统和文本摘要等任务。
以下是 create_stuff_documents_chain 的一些关键参数和它们的用途:
用chain的概念来介绍: 用户输入内容后,先进行向量检索,得到相应的上下文context,之后上下文嵌入到提示词模板 ChatPromptTemplate()中去,得到一个完整的提示,这里我们使用的大模型为质谱AI,GLM4,完整提示进入大模型,得到响应,最后通过输出规范,StrOutputParser()。
context | ChatPromptTemplate() | ChatZhipuAI | StrOutputParser()
Demo如下所示:
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatZhipuAI
import os
os.environ["ZHIPUAI_API_KEY"] = ""
llm = ChatZhipuAI(
model="glm-4",
temperature=0.5,
)
system_prompt = (
"Use the given context to answer the question. "
"If you don't know the answer, say you don't know. "
"Use three sentence maximum and keep the answer concise. "
"Context: {context}"
)
prompt = ChatPromptTemplate.from_messages(
[
("system", system_prompt),
("human", "{input}"),
]
)
question_answer_chain = create_stuff_documents_chain(llm, prompt)
chain = create_retrieval_chain(db.as_retriever(search_type="similarity_score_threshold",
search_kwargs={"score_threshold": 0.2}),
question_answer_chain)
chain.invoke({"input": query})
输出: 输出的主要成分为Input、检索到的上下文内容、以及LLM参考上下文回复用户的answer。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。