1、安装

conda create –name myenv python=3.8

conda activate myenv

conda install langchain

2、注册 LangSmith

网址:https://smith.langchain.com

!pip install -g chromadb
!pip install -q tiktoken
!pip install qU langchain-openai
!pip install -qU langchain-community
!pip install unstructured

import os
with open(“openai_api_key.txt”, “r”) as f:
OPENAI_API_KEY=f.read()
os.environ[‘OPENAI_API_KEY’]= OPENAI_API_KEY

#from langchain deepseek import ChatDeepseek
#os.environ[“DEEPSEEK_API_KEY”]=””
#deepseek_llm=ChatDeepseek(model=”deepseek-chat”)

from langchain_openai import ChatOpenAI
from langchain,schema import HumanMessage, SystemMessage, AIMessage

#这就是我们将要使用的语言模型。我们将在下一节中讨论我们正在做的事情
llm = ChatOpenAI(model=”gpt-4o”, temperature=0.7)
#0.1-0.5,更加严谨,摘要、翻译、代码生成;0.7-1,更加随性,讲故事、写小说

聊天消息

类似文本,但指定了消息类型(系统、人类、人工智能)
。系统(System)-有用的背景信息,告诉人工智能该做什么
。人类(Human)-旨在代表用户的消息
。人工智能(AI)显示人工智能响应的内容的消息

llm.invoke([
SystemMessage(content=”你是一个友好的AI机器人,可以用简短的一句话帮助用户决定去哪里旅行”),
HumanMessage(content=”我喜欢海滩,我应该去哪里?”),
AIMessage(content=”你应该去法国尼斯”),
#第二轮对话
HumanMessage(content=”我到那里后还应该做些什么?”)
])

文档

包含一段文本和元数据(有关该文本的更多信息)的对象

from langchain.schema import Document

Document(page_content=”这是我的文档。它包括了我从其他地方收集的信息”,
metadata=
‘my_document_id’:234234,
‘my_document_source’:”LangChain 论文”
‘my_document_create_time’:1680013019
])

  • 语言模型
  • 聊天模型:经过微调,适用于多轮对话
  • 函数调用模型:经过微调,可提供结构化数据输出。当对外部服务进行 API调用或进行提取时,这会派上很大的用场
  • 文本嵌入模型:将文本转换为向量(一系列包含文本语义“含义”的数字)。主要用于比较两段文本。
    顺便说一句:语义意味着”与语言或逻辑中的含义相关”。

llm = ChatOpenAI(model=”gpt-4o”)

llm.invoke([
SystemMessage(content=”你是一个友好的AI机器人”),
HumanMessage(content=”上海现在的天气怎么样?”)
])
functions=[{
“name”: “get_current_weather”,
“description”:“获取指定位置的当前天气”,
“parameters”:{
“type”: “object”,
‘properties”:{
“location”:{“type”:”string”,”description”:“城市和州,例如中国上海’},
“unit”:{“type”:”string”,”enum”:[“celsius”,”fahrenheit”]
“required”:[“location”]
}
])
output =llm.invoke(input=messages, functions=functions)

from langchain_openai import OpenAIEmbeddings
embeddings =OpenAIEmbeddings()
text=”今天艳阳高照天气很舒服!”
text_embedding = embeddings.embed query(text)
print(f”这是一个样本:{text_embedding[:5]}…”)
print(f”你的词嵌入长度是:{len(text_embedding)}”)

提示

需要传递给底层模型的内容

llm = ChatOpenAI(model_name=”gpt-4o”)
prompt = “””
今天是星期一,明天是星期三。
这句话有什么问题?
“””
print(llm(prompt))

提示模板

一个帮助根据用户输入、其他非静态信息和固定模板字符串的组合创建提示的对象。将其视为 Python 中的 f-string,但用于提示

from langchain import PromptTemplate
llm = ChatopenAI(model_name=”gpt-4o”)
#注意下面的”Location”,这是稍后另一个值的占位符
template = “””
我真的很想去{location}旅行。我应该在那里做什么?
用一个简短的句子回复
“””
prompt = PromptTemplate(input_variables=[“location”], template=template)
final_prompt = prompt.format(location=’上海’)
print(f”最终提示词:{final_prompt}”)
print(“————–“)
print(f”LLM 输出:{llm(final_prompt)}”)

示例选择器

一种从一系列示例中进行选择的简单方法,可让您动态地将上下文信息放入提示中。通常在您的任务很细致或您有大量示例时使用。

from langchain.prompts,example selector import SemanticSimilarityExampleSelectorlangchain.vectorstoresimportChromafrom
fromlangchain.embeddings import OpenAIEmbeddings
from langchain.prompts import FewShotPromptTemplate, PromptTemplatefrom langchain.llms import OpenAI
llm = ChatOpenAI(model_name=”gpt-4o”)
example_prompt = PromptTemplate(
input_variables=[“input”, “output”],{output}”,
template=”示例输入:{input}\n示例输出:{output}”,
)
名词所在位置的示例#
examples = [
{“input”:”海盗”,”output”:”船”},
{“input”:”飞行员”,”output”:”飞机”},
{“input”:”司机”,”output”:”汽车”},
(“input”:”树”,”output”:”地面”},
(“input”:”鸟”,”output”:”巢”},
]

#SemanticSimilarityExampleSelector  将通过语义含义选择与输入相似的示例
example_selector = SemanticSimilarityExampleSelector.from_examples(
#这是可供选择的示例列表
examples,

#这是用于生成嵌入的嵌入类,用于测量语义相似性
OpenAIEmbeddings(),

#这是用于存储嵌入并进行相似性搜索的 Vectorstore 类
Chroma,

#这是要生成的示例数量
k=1
)
similar_prompt = FewShotPromptTemplate(
#有助于选择示例的对象
example_selector=example_selector,

#你的提示词
example_prompt=example_prompt,

# 将添加到提示顶部和底部的自定义内容
prefix=”给出物品通常出现的位置”,
suffix=”Input:{noun}\noutput:”,

#你的提示将收到什么输入
input_variables=[“noun”]
)
my_noun =”老虎”
my_noun1 =”学生”
my_noun2 = “植物”
print(similar_prompt.format(noun=my_noun))
print(“==========”)
print(similar_prompt.format(noun=my_noun1))
print(“==========”)
print(similar_prompt.format(noun=my_noun2))

给出物品通常出现的位置

示例输入:鸟
示例输出:巢

Input:老虎
Output:
==========
给出物品通常出现的位置

示例输入:司机
示例输出:汽车

Input:学生
Output:
==========
给出物品通常出现的位置

示例输入:树
示例输出:地面

Input:植物
Output:

llm(similar_prompt.format(noun=my_noun))

输出解析器方法 1:提示指令和字符串解析

一种格式化模型输出的有用方法。通常用于结构化输出。LangChain 在其文档中列出了更多输出解析器。

两个大概念:

1.格式化指令:自动生成的提示,告诉 LLM 如何根据您期望的结果格式化其响应

2.解析器:一种将模型的文本输出提取到所需结构(通常是json)的方法

from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate
from langchain openai import OpenAI
from pydantic import BaseModel,Field, model_validator

model = OpenAI(model name="gpt-3.5-turbo-instruct",temperature=0.0)

#定义你所需的数据结构。
class Joke(BaseModel):
    setup:str =Field(description="设置笑话的问题")
    punchline:str=Field(description="解答笑话的答案")

# 设置解析器并将指令注入提示模板。
parser = PydanticOutputParser(pydantic object=Joke)

prompt = PromptTemplate(
    template="回答用户的询问。\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)

#一个用于提示语言模型填充数据结构的查询。
prompt_and model = prompt | model
output = prompt_and_model.invoke({"query":"可以讲个笑话给我听吗?"})
parser.invoke(output)

输出:
Joke(setup='为什么熊猫喜欢睡觉?',punchline='因为他们是熊猫,不是熊猫狗。')

输出解析器方法 2:函数调用模型

当 OpenAl发布函数调用时,游戏发生了变化。

他们专门训练模型以输出结构化数据。指定 Pydantic(一种python中的数据验证模式)模式并获得结构化输出变得非常容易。

有很多方法可以定义你的模式,我更喜欢使用 Pydantic 模型,因为它们的组织性很强。请参考 OpenAl 的 文档 了解其他方法。

使用此方法需要使用支持函数调用的模型。我将使用gpt4-0613

示例 1:简单

让我们从定义一个简单的模型开始,以便从中提取。

from pydantic import BaseModel, Field
from typing import Optional

class Person(BaseModel):
    """关于一个人的身份信息。"""

    name:str = Field(...,description="该人的姓名")
    age:int = Field(...,description="该人的年龄")
    fav food:0ptional[str] = field(None,description="该人最喜欢的食物")

示例 2:枚举

现在让我们解析列表中提及的产品

import enum
11m = ChatopenAI(model_name="gpt-4o")
class Product(str,enum.Enum):
    CRM ="CRM"
    VIDEO_EDITING = "视频剪辑"
    HARDWARE = "硬件"
class Products(BaseModel):
    """识别文本中提到的产品"""
    products:Sequence[Product]= Field(...,description="文中提到的产品")
structured_llm = llm.with_structured_output(Products)
structured_llm.invoke(
"这个演示中的 CRM 很棒。喜欢硬件。麦克风也很酷。喜欢视频编辑"
)

Products(products=[<Product.CRM:’CRM’>,<Product.HARDWARE:’硬件’>,<Product.VIDEO_EDITING:’视频剪辑’>])

索引-将文档结构化为 LLM 可以使用它们的格式

文档加载器

从其他来源导入数据的一系列简单方法。与 OpenAl插件 特别是检索插件 共享功能
可以访问下面的网站查看文档加载器的更多信息(https://python.langchain.com/docs/how_to/#document-loaders)。
[Llama Index另外一个类似langchain的框架,主要是索引和提取](https://lamahub.ai) 上还有更多的信息

https://www.bilibili.com/video/BV1WXoCY1Er4?spm_id_from=333.788.player.switch&vd_source=3790692eb971db4659c7e5f6dc3e29fc&p=6

作者 admin

百度广告效果展示