大模型(LLMs)学习笔记(四)——LangChain开源框架和智能Agent

目录:

一. LangChain简介

二. Agent简介

一.LangChain简介

1.什么是 LangChain?

LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起, 并集成额外的资源,例如 API 和数据库。

2.LangChain 核心概念

(1)Components and Chains

• Component :模块化的构建块,可以组合起来创建强大的应用程序;

• Chain :组合在一起以完成特定任务的一系列 Components。

(2)LangChain 中 Prompt Templates and Values

• Prompt Template 作用:负责创建 PromptValue,这是最终传递给语言模型的内容 。

• Prompt Template 特点:有助于将用户输入和其他动态信息转换为适合语言模型的格式。PromptValues 是具有方法的类,这些方 法可以转换为每个模型类型期望的确切输入类型(如文本或聊天消息)。

注:一个 Chain 可能包括一个 Prompt 模板、一个语言模型和一个输出解析器,它们一起工作以处理用户输入、生成 响应并处理输出。

(3)Example Selectors

接受用户输入并返回一个示例列表以在提示中使用,使其更强大和特定于上下文。

(4) Output Parsers

• 作用:负责将语言模型响应构建为更有用的格式。

• 实现方法:一种用于提供格式化指令;另一种用于将语言模型的响应解析为结构化格式 。

• 特点:使得在您的应用程序中处理输出数据变得更加容易。

(5) Indexes and Retrievers

Index :一种组织文档的方式,使语言模型更容易与它们交互;

Retrievers:用于获取相关文档并将它们与语言模型组合的接口;

注:LangChain 提供了用于处理不同类型的索引和检索器的工具和功能,例如矢量数据库和文本拆分器。

(6) Chat Message History

• Chat Message History 作用:负责记住所有以前的聊天交互数据,然后可以将这些交互数据传递回模型、汇总或以其他方式组合。

• 优点:有助于维护上下文并提高模型对对话的理解。

(7) Agents and Toolkits

• Agent :在 LangChain 中推动决策制定的实体。他们可以访问一套工具,并可以根据用户输入决定调用哪个工具。

• Tookits :一组工具,当它们一起使用时,可以完成特定的任务。代理执行器负责使用适当的工具运行代理。通过理解和利用这些核心概念,可以利用 LangChain 的强大功能来构建适应性强、高效且能够处理复杂用例的高级语言模型应用程 序。

3.什么是 LangChain Agent?

介绍:LangChain Agent 是框架中驱动决策制定的实体。它可以访问一组工具,并可以根据用户的输入决定调用哪个工具。

优点:LangChain Agent 帮助构建复杂的应用程序,这些应用程序需要自适应和特定于上下文的响应。当存在取决于用户输入和其 他因素的未知交互链时,它们特别有用。

4. 如何使用 LangChain

要使用 LangChain,开发人员首先要导入必要的组件和工具,例如 LLMs, chat models, agents, chains, 内存功能。这些组件组合起来 创建一个可以理解、处理和响应用户输入的应用程序。

5. LangChain 支持哪些功能

• 针对特定文档的问答:根据给定的文档回答问题,使用这些文档中的信息来创建答案。

• 聊天机器人:构建可以利用 LLM 的功能生成文本的聊天机器人。

• Agents:开发可以决定行动、采取这些行动、观察结果并继续执行直到完成的代理。

6. 什么是 LangChain model

LangChain model 是一种抽象,表示框架中使用的不同类型的模型。LangChain 中的模型主要分为三类:

(1)LLM(大型语言模型)

这些模型将文本字符串作为输入并返回文本字符串作为输出。它们是许多语言模型应用程序的支柱。

(2)聊天模型( Chat Model)

聊天模型由语言模型支持,但具有更结构化的 API。他们将聊天消息列表作为输入并返回聊天消息。这使 得管理对话历史记录和维护上下文变得容易。

(3)文本嵌入模型(Text Embedding Models)

这些模型将文本作为输入并返回表示文本嵌入的浮点列表。这些嵌入可用于文档检索、 聚类和相似性比较等任务。开发人员可以为他们的用例选择合适的 LangChain 模型,并利用提供的组件来构建他们的应用程序。

7. LangChain 包含哪些特点?

(1)LLM 和提示:LangChain 使管理提示、优化它们以及为所有 LLM 创建通用界面变得容易。此外,它还包括一些用于处理 LLM 的便 捷实用程序。

(2)链(Chain):这些是对 LLM 或其他实用程序的调用序列。LangChain 为链提供标准接口,与各种工具集成,为流行应用提供端到端 的链。

(3)数据增强生成:LangChain 使链能够与外部数据源交互以收集生成步骤的数据。例如,它可以帮助总结长文本或使用特定数据源回 答问题。

(4)Agents:Agents 让 LLM 做出有关行动的决定,采取这些行动,检查结果,并继续前进直到工作完成。LangChain 提供了代理的标 准接口,多种代理可供选择,以及端到端的代理示例。

(5)内存:LangChain 有一个标准的内存接口,有助于维护链或代理调用之间的状态。它还提供了一系列内存实现和使用内存的链或代 理的示例。

(6)评估:很难用传统指标评估生成模型。这就是为什么 LangChain 提供提示和链来帮助开发者自己使用 LLM 评估他们的模型。

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

8. LangChain的使用

(1)LangChain调用 LLMs 生成回复

# 官方llm使用OPENAI 接口
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003") prompt = "你好"
response = llm(prompt)
# 你好,我是chatGPT,很高兴能够和你聊天。有什么我可以帮助你的吗?

# 用chatglm来演示该过程,封装一下即可
from transformers import AutoTokenizer, AutoModel class chatGLM():
    def init (self, model_name) -> None:
        self.tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
        self.model = AutoModel.from_pretrained(model_name, trust_remote_code=True).half().cuda().eval()

    def call (self, prompt) -> Any:
        response, _ = self.model.chat(self.tokenizer , prompt) # 这里演示未使用流式接口. stream_chat()
        return response

llm = chatGLM(model_name="THUDM/chatglm-6b") prompt = "你好"
response = llm(prompt) print("response: %s"%response) “”“
response: 你好 !我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。”“”

(2)LangChain 修改提示模板

from langchain import PromptTemplate template = """
Explain the concept of {concept} in couple of lines """
prompt = PromptTemplate(input_variables=["concept"], template=template) prompt = prompt.format(concept="regularization") print(“prompt=%s”%prompt)
#'\nExplain the concept of regularization in couple of lines\n'
template = "请给我解释一下{concept}的意思"
prompt = PromptTemplate(input_variables=["concept"], template=template)
prompt = prompt.format(concept="人工智能")
print("prompt=%s" % prompt) # '请给我解释一下人工智能的意思'

(3)LangChain 链接多个组件处理一个特定的下游任务

#chains ---------
from langchain.chains import LLMChain
chain = LLMChain(llm=openAI(), prompt=promptTem) print(chain.run("你好"))

#chains  Chatglm对象不符合LLMChain类llm对象要求,模仿一下
class DemoChain():
    def   init  (self, llm, prompt)  > None:
        self.llm = llm
        self.prompt = prompt


    def run(self, query)  > Any:
        prompt = self.prompt.format(concept=query)
        print("query=%s  >prompt=%s"%(query, prompt))
        response = self.llm(prompt) 
        return response
    
chain = DemoChain(llm=llm, prompt=promptTem) print(chain.run(query="天道酬勤"))

“”“
query=天道酬勤  >prompt=请给我解释一下天道酬勤的意思
天道酬勤是指自然界的规律认为只要一个人勤奋努力,就有可能会获得成功。这个成语的意思是说,尽管一个人可能需要付出很多努力才能取得成功,但只要他/她坚持不懈地努力,就有可   能会得到回报。
”“”

(4)LangChain Embedding & vector store

# 官方示例代码,用的OpenAI的ada的文本Embedding模型
# 1) Embeding model
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model_name="ada")
query_result = embeddings.embed_query("你好")

# 2) 文本切割
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=100, chunk_overlap=0
)
texts = """天道酬勤"并不是鼓励人们不劳而获,而是提醒人们要遵循自然规律,通过不断的努力和付出来追求自己的目标。\n这种努力不仅仅是指身体上的劳动,
也包括精神上的努力和思考,以及学习和适应变化的能力。\n只要一个人具备这些能力,他就有可能会获得成功。"""
texts = text_splitter.create_documents([texts])
print(texts[0].page_content)

# 3)入库检索,官方使用的Pinecone,他提供一个后台管理界面 | 用户需求太大,不好用了已经,一直加载中....
import pinecone
from langchain.vectorstores import Pinecone
pinecone.init(api_key=os.getenv(""), enviroment=os.getenv(""))
index_name = "demo"
search = Pinecone.from_documents(texts=texts, embeddings, index_name=index_name)
query = "What is magical about an autoencoder?"
result = search.similarity_search(query)

# 这里参考langchain-chatglm代码
# 1) Embedding model: text2vec-large-chinese
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="GanymedeNil/text2vec-large-chinese",
                                   model_kwargs={'device': "cuda"})
query_result = embeddings.embed_query("你好")

# 2)文本分割, 这里仅为了方便快速看流程,实际应用的会复杂一些
texts = """天道酬勤"并不是鼓励人们不劳而获,而是提醒人们要遵循自然规律,通过不断的努力和付出来追求自己的目标。\n这种努力不仅仅是指身体上的劳动,
也包括精神上的努力和思考,以及学习和适应变化的能力。\n只要一个人具备这些能力,他就有可能会获得成功。"""
from langchain.text_splitter import CharacterTextSplitter
from langchain.docstore.document import Document

class TextSpliter(CharacterTextSplitter):
    def __init__(self, separator: str = "\n\n", **kwargs: Any):
        super().__init__(separator, **kwargs)
    def split_text(self, text: str) -> List[str]:
        texts = text.split("\n")
                texts = [Document(page_content=text, metadata={”from“: "知识库.txt"}) for 
text in texts]
        return texts
    
text_splitter = TextSpliter()
texts = text_splitter.split_text(texts)

#3) 直接本地存储
vs_path = "./demo-vs"
from langchain.vectorstores import FAISS docs  = embeddings.embed_documents(sentences)
vector_store = FAISS.from_documents(texts, embeddings)
vector_store.save_local(vs_path)

vector_store = FAISS.load_local(vs_path, embeddings)
related_docs_with_score = vector_store.similarity_search_with_score(query, k=2)

9. LangChain存在哪些问题及方法

(1) LangChain 低效的令牌使用问题

• 问题:Langchain的一个重要问题是它的令牌计数功能,对于小数据集来说,它的效率很低。虽然一些开发人员选择创建自己的令 牌计数函数,但也有其他解决方案可以解决这个问题。

• 解决方案:Tiktoken是OpenAI开发的Python库,用于更有效地解决令牌计数问题。它提供了一种简单的方法来计算文本字符串中的 令牌,而不需要使用像Langchain这样的框架来完成这项特定任务。

(2)LangChain 文档的问题

• 问题:文档是任何框架可用性的基石,而Langchain因其不充分且经常不准确的文档而受到指责。误导性的文档可能导致开发项目 中代价高昂的错误,并且还经常有404错误页面。这可能与Langchain还在快速发展有关,作为快速的版本迭代,文档的延后性问题

(3)LangChain 太多概念容易混淆,过多的“辅助”函数问题

• 问题:Langchain的代码库因很多概念让人混淆而备受批评,这使得开发人员很难理解和使用它。这种问题的一个方面是存在大量 的“helper”函数,仔细检查就会发现它们本质上是标准Python函数的包装器。开发人员可能更喜欢提供更清晰和直接访问核心功能的 框架,而不需要复杂的中间功能。

(4)LangChain 行为不一致并且隐藏细节问题

• 问题:LangChain因隐藏重要细节和行为不一致而受到批评,这可能导致生产系统出现意想不到的问题。eg: Langchain ConversationRetrievalChain的一个有趣的方面,它涉及到输入问题的重新措辞。这种重复措辞有时会非常广泛,甚至破 坏了对话的自然流畅性,使对话脱离了上下文。

(5)LangChain 缺乏标准的可互操作数据类型问题

• 问题:缺乏表示数据的标准方法。这种一致性的缺乏可能会阻碍与其他框架和工具的集成,使其在更广泛的机器学习工具生态系统 中工作具有挑战性。

(6)LangChain 替代方案

• LlamaIndex是一个数据框架,它可以很容易地将大型语言模型连接到自定义数据源。它可用于存储、查询和索引数据,还提供了各 种数据可视化和分析工具。

• Deepset Haystack是另外一个开源框架,用于使用大型语言模型构建搜索和问答应用程序。它基于Hugging Face Transformers,提供了多种查询和理解文本数据的工具。

二.Agent简介

1.获取全量历史对话

以一般客服场景为例 在电信公司的客服聊天机器人场景中,如果用户在对话中先是询问了账单问题,接着又谈到了网络连接问题, ConversationBufferMemory 可以用来记住整个与用户的对话历史,可以帮助 AI 在回答网络问题时还记得账单问题的相关细 节,从而提供更连贯的服务。

  from langchain.memory import ConversationBufferMemory
  memory = ConversationBufferMemory()
  memory.save_context({"input": "你好"}, {"output": "怎么了"})
  variables = memory.load_memory_variables({})

2.滑动窗口获取最近部分对话内容

以商品咨询场景为例 在一个电商平台上,如果用户询问关于特定产品的问题(如手机的电池续航时间),然后又问到了配送方式, ConversationBufferWindowMemory 可以帮助 AI 只专注于最近的一两个问题(如配送方式),而不是整个对话历史,以提供 更快速和专注的答复。

from langchain.memory import ConversationBufferWindowMemory
# 只保留最后1次互动的记忆
memory = ConversationBufferWindowMemory(k=1)

3.获取历史对话中实体信息

在法律咨询的场景中,客户可能会提到特定的案件名称、相关法律条款或个人信息(如“我在去年的交通事故中受了伤,想了解 关于赔偿的法律建议”)。ConversationEntityMemory 可以帮助 AI 记住这些关键实体和实体关系细节,从而在整个对话过程中 提供更准确、更个性化的法律建议

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) memory = ConversationEntityMemory(llm=llm)
_input = {"input": "公众号《LLM应用全栈开发》的作者是莫尔索"} memory.load_memory_variables(_input)
memory.save_context(
    _input,
    {"output": "是吗,这个公众号是干嘛的"}
)
print(memory.load_memory_variables({"input": "莫尔索是谁?"})) # 输出,可以看到提取了实体关系
{'history': 'Human: 公众号《LLM应用全栈开发》的作者是莫尔索 \n AI: 是吗,这个公众号是干嘛的',
'entities': {'莫尔索': '《LLM应用全栈开发》的作者。'}}

4.利用知识图谱获取历史对话中的实体及其联系

医疗咨询场景为例 在医疗咨询中,一个病人可能会描述多个症状和过去的医疗历史(如“我有糖尿病史,最近觉得经常口渴和疲劳”)。ConversationKGMemory 可以构建一个包含病人症状、疾病历史和可能的健康关联的知识图谱,从而帮助 AI 提供更全面和深 入的医疗建议。

from langchain.memory import ConversationKGMemory from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
memory = ConversationKGMemory(llm=llm)
memory.save_context({"input": "小李是程序员"}, {"output": "知道了,小李是程序员"}) memory.save_context({"input": "莫尔索是小李的笔名"}, {"output": "明白,莫尔索是小李的笔名"})
variables = memory.load_memory_variables({"input": "告诉我关于小李的信息"}) print(variables)
# 输出
{'history': 'On 小李: 小李 is 程序员. 小李 的笔名 莫尔索.'}

5.对历史对话进行阶段性总结摘要

以教育辅导场景为例 在一系列的教育辅导对话中,学生可能会提出不同的数学问题或理解难题(如“我不太理解二次方程的求解方法”)。ConversationSummaryMemory 可以帮助 AI 总结之前的辅导内容和学生的疑问点,以便在随后的辅导中提供更针对性的解释 和练习

6.需要获取最新对话,又要兼顾较早历史对话

以技术支持场景为例 在处理一个长期的技术问题时(如软件故障排查),用户可能会在多次对话中提供不同的错误信息和反馈。ConversationSummaryBufferMemory 可以帮助 AI 保留最近几次交互的详细信息,同时提供历史问题处理的摘要,以便于更有 效地识别和解决问题.

7.回溯最近和最关键的对话信息

以金融咨询场景为例 在金融咨询聊天机器人中,客户可能会提出多个问题,涉及投资、市场动态或个人财务规划(如“我想了解股市最近的趋势以及 如何分配我的投资组合”)。ConversationTokenBufferMemory 可以帮助 AI 聚焦于最近和最关键的几个问题,同时避免由于记 忆过多而导致的信息混淆。

8.基于向量检索对话信息

以了解最新新闻事件为例 用户可能会对特定新闻事件提出问题,如“最近的经济峰会有什么重要决策?” VectorStoreRetrieverMemory 能够快速从大量历 史新闻数据中检索出与当前问题最相关的信息,即使这些信息在整个对话历史中不是最新的,也能提供及时准确的背景信息和 详细报道。

vectorstore = Chroma(embedding_function=OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs=dict(k=1)) memory = VectorStoreRetrieverMemory(retriever=retriever)
memory.save_context({"input": "我喜欢吃火锅"}, {"output": "听起来很好吃"})
memory.save_context({"input": "我不喜欢看摔跤比赛"}, {"output": "我也是"})
PROMPT_TEMPLATE = """以下是人类和 AI 之间的友好对话。AI 话语多且提供了许多来自其上
下文的具体细节。如果 AI 不知道问题的答案,它会诚实地说不知道。
以前对话的相关片段:
{history}
(如果不相关,你不需要使用这些信息)
当前对话:
人类:{input}
AI:"""
prompt = PromptTemplate(input_variables=["history", "input"], 
template=PROMPT_TEMPLATE) conversation_with_summary = ConversationChain(
    llm=llm,
    prompt=prompt,
    memory=memory,
    verbose=True
)
print(conversation_with_summary.predict(input="你好,我是莫尔索,你叫什么"))
print(conversation_with_summary.predict(input="我喜欢的食物是什么?")) print(conversation_with_summary.predict(input="我提到了哪些运动?"))

如何学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

学习路线

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值