【AI开发】Langchain基础

我想当个程序员 2024-10-03 08:01:01 阅读 70

基础对话

首先先去deepseek上搞一个API key

根据deepseek官网的介绍,一个基础的chat模型应该这样写

<code># pip3 install langchain_openai

# python3 deepseek_v2_langchain.py

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(

model='deepseek-chat', code>

openai_api_key='', code>

openai_api_base='https://api.deepseek.com',code>

max_tokens=1024

)

response = llm.invoke("给我一个很土但是听起来很好养活的男孩小名", temperature=1)

print(response.content)

其中需要注意的地方有

deepseek接口与openai兼容,所以调用deepseek接口可以实现之前的langchain.llms和langchain.chat_models已经换成了langchain_openaipredict和predict_messages在新版中已经被换成了invoketemperature表示唯一性,为0时一般结果不变,越大每次结果越容易变化直接执行llm.invoke会出来完整的消息类型,如AIMessage…,我们可以通过.content或者其他属性来获取我们想要的内容

LangChain提供了几个对象,用于方便地区分不同的角色:

HumanMessage: 来自人类/用户的ChatMessage。AIMessage: 来自AI/助手的ChatMessage。SystemMessage: 来自系统的ChatMessage。FunctionMessage: 来自函数调用的ChatMessage。

我们可以这样写

response = llm.invoke("Hi!")

print(response.content)

text = "做logo的公司的好名字是什么?"

message = [HumanMessage(content=text)]

response1=llm.invoke(message)

print(response1.content)

提示模板

大多数LLM应用程序不会是用户说啥,就完全传入到LLM中,那样会太麻烦。

在特定任务中,我们应该输入最核心的内容,然后LLM把该内容添加到一个更大的文本片段中,这就是提示模板prompttemplates

比如

from langchain.prompts import PromptTemplate

prompt = PromptTemplate.from_template("做{product}的公司的好名字应该是?")

prompt.format(product="宠物食品")code>

输出为

'做宠物食品的公司的好名字应该是?'

LLMChain是langchain中一个用的很多的工具,包含一个PromtTemplate和一个语言模型(LLM或者chatmodel)

大概流程是这样

在这里插入图片描述

所以我们的代码可以接着写

<code>from langchain.chains import LLMChain

chain = LLMChain(llm=llm,prompt=prompt)

chain.run("宠物食品")

这其中语言模型指定为上面的变量llm,prompt也是上面设定好的

fewshot版的提示词

from langchain.prompts.few_shot import FewShotPromptTemplate

from langchain.prompts.prompt import PromptTemplate

############################用few-shot,给定一些例子,让模型学会某些特定的回复

examples = [

{

"question": "how are you?",

"answer": "I'm fine, handsome man."

},

{

"question": "What day of the week?",

"answer": "It's Friday, handsome man."

},

{

"question": "how is the weather?",

"answer": "It's a sunny day, handsome man."

},

]

example_prompt = PromptTemplate(template="Question:{question}\n{answer}", input_variables=["question","answer"])#设置一个提示模板code>

prompt = FewShotPromptTemplate(

examples=examples,

example_prompt=example_prompt,

suffix="Question:{input}",#相当于一个后缀code>

input_variables=["input"]

)

from langchain_openai import ChatOpenAI

chat_model = ChatOpenAI(

model="deepseek-chat",code>

openai_api_key='sk-f8f1fab675ea4d2d9e565877d354d464',code>

openai_api_base='https://api.deepseek.com',code>

max_tokens=1024

)

chat_model.invoke(prompt.format(input="Why am I so ugly?"))code>

Answer: You are not ugly, handsome man. Beauty is subjective and varies from person to person. Everyone has their unique qualities and features that make them special and attractive in their own way.

另:

样本筛选器用来筛选相干的样本,防止不相干的example对模型影响

senmaticSimilarityExampleSelector 语义相似度筛选器

代理人

agent可以看作在某个职位上的人,拥有一系列tool来完成一些工作

在链式结构中,agent可以看作chain的其中一个单位,许多agent按照顺序连在一起,完成各自的任务来维护chain的稳定

#######################加载模型

from langchain_openai import ChatOpenAI

chat_model = ChatOpenAI(

model="deepseek-chat",code>

openai_api_key='',code>

openai_api_base='https://api.deepseek.com',code>

max_tokens=1024

)

#######################加载代理人工具

from langchain.agents import initialize_agent

from langchain.agents import load_tools

tool = load_tools(["llm-math"],llm=chat_model)#llm-math 是一个用于计算的代理人工具

至于具体有哪些tool,我们可以通过很多方式来查询

api文档用来查类和工具

langchain开发很快,有些新东西在文档中没有及时更新,最好去源代码里面跳转进去看

比如llm-math工具,我如果想知道还有没有其他工具,就跳转进去loadtool里面看

#######################初始化代理人

from langchain.agents import AgentType

agent = initialize_agent(

tools=tool, llm=chat_model, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose =True, handle_parsing_errors=True

)

agent.run("5的3.5次方是多少? no need to add action")

基础应用——聊天模块

conversation chain和之前直接用invoke(predict)的区别是,conversation内部有关于聊天记录的工具,跟它的聊天可以结合上文

from langchain_openai import ChatOpenAI

chat_model = ChatOpenAI(

model="deepseek-chat",code>

openai_api_key='',code>

openai_api_base='https://api.deepseek.com',code>

max_tokens=1024

)

from langchain.chains import ConversationChain

conversation = ConversationChain(llm=chat_model,verbose=True)#verbose就是来控制输出的内容有没有系统上的东西,false时就只有对话内容

conversation.run("hello")

自定义模块

目前只定义了一个最基础的

from typing import Any, List, Mapping, Optional

from langchain.llms.base import LLM

from langchain.callbacks.manager import CallbackManagerForLLMRun

class zzyAI(LLM):

@property

def _llm_type(self) -> str:

return "zzyAI"

def _call(

self,

prompt: str,

stop: Optional[List[str]] = None,

run_manager: Optional[CallbackManagerForLLMRun] = None,

) -> str:

if stop is not None:

raise ValueError("stop kwargs are not permitted.")

pd = prompt.find("吗")

if pd >= 0:

return prompt[0:pd] + ","

return "哦."

llm = zzyAI()

print(llm)

llm("你好吗")



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。