50.智能体

文章目录

智能体

deepseek

1:产品介绍

DeepSeek-V3 是一款高性能的开源 AI 模型,支持自然语言处理、智能对话生成等任务。其 API 接口与 OpenAI 完全兼容,用户可以通过简单的配置迁移现有项目,同时享受更低的成本和更高的性能。本文 档将详细介绍如何快速接入 DeepSeek-V3 API

2:注册账号

官网: https://www.deepseek.com/

点击注册

3:创建API key

注意:创建后API key只出现一次,请存储在安全位置,例如:环境变量或者配置文件中

4:使用Python调用API

1)安装OpenAI API库

bash 复制代码
pip install openai

2)API 是一个"无状态" API,即服务端不记录用户请求的上下文,用户在每次请求时,需将之前所有对 话历史拼接好后,传递给对话 API。

1.单次会话

python 复制代码
from openai import OpenAI
#创建客户端
client = OpenAI(
    api_key='sk-a8.....',
    base_url='https://api.deepseek.com'
)

#发送终端对话
response = client.chat.completions.create(
    #模型类型
    model='deepseek-chat',
    messages=[
        {'role':'system','content':'你是一位运维工程师助手'},
        {'role':'user','content':'你是谁'}
    ],
    #流式输出
    stream=False   #是慢慢的输出内容,不是突然全部输出
)
#回应信息
print(response.choices[0].message.content)

#################也可以使用交互式的收入问题方法######################
from openai import OpenAI
#创建客户端
client = OpenAI(
    api_key='sk-a8.....',
    base_url='https://api.deepseek.com'
)

#发送终端对话
response = client.chat.completions.create(
    #模型类型
    model='deepseek-chat',
    messages=[
        {'role':'system','content':'你是一位运维工程师助手'},
        {'role':'user','content':input('请输入你的问题:')}   
    ],
    #流式输出
    stream=False
)
#回应信息
print(response.choices[0].message.content)

#########################优化后防止信息泄露#############################
from openai import OpenAI
import os
#创建客户端
client = OpenAI(
    api_key=os.getenv('deepseek_key'),         #使用系统的环境标量,调用
    base_url='https://api.deepseek.com'
)

#发送终端对话
response = client.chat.completions.create(
    #模型类型
    model='deepseek-chat',
    messages=[
        {'role':'system','content':'你是一位运维工程师助手'},
        {'role':'user','content':input('请输入你的问题:')}
    ],
    #流式输出
    stream=False
)
#回应信息
print(response.choices[0].message.content)

2.多轮会话

python 复制代码
import os
from openai import OpenAI

text = input('请输入问题:\n')
print('正在与deepseek对话,请稍等...')

client = OpenAI(
    api_key = os.getenv('deepseek_key'),
    base_url = 'https://api.deepseek.com'
)

messages = [{
    'role':'user',
    'content':text
}]

response = client.chat.completions.create(
    #模式类型
    model = 'deepseek-chat',
    #消息
    messages = messages,
    stream = False
)
#解释回应
print('deepseek回复:\n')
print(response)

请输入问题:
写一首诗
正在与deepseek对话,请稍等...
deepseek回复:

ChatCompletion(id='7f5ab025-1c97-4faa-9a54-661476765293', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='《秋窗书怀》。。)。。]
########想得到搜索结果需要定位#################                                           
                                                                                   print(response.choices)
                                                                                   #列表     类    
[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='《夜泊枫桥》..)..]                           ############继续定位#############                     
print(response.choices[0].message)                                                                                                                                   ChatCompletionMessage(content='《夜泊枫桥》。。)...]
###########最后#############
#多轮会话
import os
from openai import OpenAI

text = input('请输入问题:\n')
print('正在与deepseek对话,请稍等...')

client = OpenAI(
    api_key = os.getenv('deepseek_key'),
    base_url = 'https://api.deepseek.com'
)

messages = [{
    'role':'user',
    'content':text
}]

response = client.chat.completions.create(
    #模式类型
    model = 'deepseek-chat',
    #消息
    messages = messages,
    stream = False
)
#解释回应
print('deepseek回复:\n')
print(response.choices[0].message.content)
print()
while True:                ###持续的会话
    text = input('继续会话:')
    print('正在与deepseek对话,请稍等...')

    client = OpenAI(
        api_key=os.getenv('deepseek_key'),
        base_url='https://api.deepseek.com'
    )

    messages = [{
        'role': 'user',
        'content': text
    }]

    response = client.chat.completions.create(
        # 模式类型
        model='deepseek-chat',
        # 消息
        messages=messages,
        stream=False
    )
    # 解释回应
    print('deepseek回复:\n')
    print(response.choices[0].message.content)
    print()

GPT

bash 复制代码
from openai import OpenAI

client = OpenAI(
  api_key="sk-proj-xCN5xjNhT-。。。。"
)

response = client.responses.create(
  model="gpt-5-nano",
  input="帮我介绍一下karina",
  store=True,
)

print(response.output_text);

PromptTemplate 教程

一、背景

在使用大语言模型(LLM)时,Prompt(提示词)决定了模型的行为方式。

如果 Prompt 写死在代码中,会导致:

  • 难以复用
  • 难以维护
  • 不利于扩展

LangChain 提供了 PromptTemplate,用于参数化、标准化Prompt。

二、示例代码

bash 复制代码
#导入PromptTemplate模块
from langchain_core.prompts import PromptTemplate

#from_template创建模块
prompt = PromptTemplate.from_template(
  '你是一位{name},轻微这个女孩起一个带有{county}特色的名字'
)

#使用format传入变量
print(prompt.format(name='大师',county='中国'))

三、PromptTemplate 的优势

  1. Prompt 参数化
bash 复制代码
prompt.format(name='智者', county='英国')
prompt.format(name='导师', county='法国')
  1. 避免 Prompt 写死在代码里
bash 复制代码
"你是智者,帮我的机器人起个具有英国特色的男孩名字"

prompt.format(name="智者", county="英国")
  1. 为后续链式调用打基础

PromptTemplate 是:

  • LLMChain
  • Runnable
  • ChatPromptTemplate

四、Prompt 设计小技巧

1:明确角色(Role)

2:任务描述清晰

3:限制输出形式(可扩展)

五、Python 内置模板:f-string

bash 复制代码
#导入PromptTeplate模块
from langchain_core.prompts import PromptTemplate
#定义模板字符串
fstring_template = '''
给我讲一个关于{name}的{what}故事
'''
#创建PromptTemplate对象
prompt = PromptTemplate.from_template(fstring_template)
#传入参数并格式化
print(prompt.format(name='karina',what='唱歌'))
PromptTemplate vs 直接 f-string

六、Jinja2 模板生成 AI Prompt

在 AI 应用中,我们经常需要动态生成大量 Prompt,例如:

  • 生成 HTML / Markdown 文档
  • 构造复杂 Prompt(条件、循环)
  • 批量生成结构化提示词

如果只使用 Python 的 f-string:

一旦 Prompt 变复杂,就会变得难维护、难扩展。

一、什么是 Jinja2?

Jinja2 是 Python 生态中最流行的模板引擎之一

常见应用场景:

  • Flask / FastAPI 的 HTML 模板
  • Markdown / 文档生成
  • 配置文件(YAML / JSON)
  • AI Prompt 模板(LangChain)
二、环境准备
bash 复制代码
pip install jinja2

实战:

bash 复制代码
from langchain_core.prompts import PromptTemplate
#jinja2模板
jinja2_template = '给我讲一个关于{{name}}的{{what}}故事'

prompt = PromptTemplate.from_template(
    jinja2_template,
    template_format='jinja2'   #必须要指定jinja2
)
print(prompt.format(name='karina',what='唱歌'))


#############使用if 和 for 语句#######################
from langchain_core.prompts import PromptTemplate
jinja2_template = '''
给我讲一个关于{{name}}的{{what}}的故事
{% if level == "easy" %}
要求:语言简单,适用初学者
{% elif level == "hard" %}
要求:包含商业分析和战略思考
{% endif %}
'''
prompt = PromptTemplate.from_template(
    jinja2_template,
    template_format='jinja2'
)

print(prompt.format(name='karina',what='song',level='hard'))
条件控制(if)
bash 复制代码
{% if level == "beginner" %}
请使用通俗语言讲解
{% else %}
请进行深入技术分析
{% endif %}
循环生成 Prompt
bash 复制代码
请分别介绍以下人物:
{% for p in people %}
- {{ p }}
{% endfor %}

七、Prompt 序列化:使用文件管理提示词

1.JSON 格式 Prompt 示例
json 复制代码
{
  "_type": "prompt",
  "input_variable": ["name","what"],
  "template": "给我讲一个关于{name}的{what}故事"
}
python 复制代码
from langchain_core.prompts import load_prompt
prompt = load_prompt('simple_prompt.json',encoding='utf-8')
print(prompt.format(name='karina',what='出道至今'))
2.YAML 格式 Prompt 示例
yaml 复制代码
_type: prompt
input_variables:
  ["name","what"]
template:
  给我讲一个关于{name}{what}的故事
python 复制代码
from langchain_core.prompts import load_prompt
prompt = load_prompt('simple_prompt.yaml',encoding='utf-8')
print(prompt.format(name='karina',what='出道至今'))

字符串(固化)-> 模板(参数)-> 多轮会话(角色)-> 消息(字符串)-> 消息模板

八、消息模板

python 复制代码
from langchain_core.prompts import ChatPromptTemplate
messages = [
    ('system','你是一个大师,你的名字是{name}'),
    ('human','你好{name},你感觉怎么样'),
    ('ai','你好,我的状态很好'),
    ('human','你叫什么名字呢'),
    ('ai','我叫{name}'),
    ('human','{user_input}')
]
#会话模板
prompt = ChatPromptTemplate.from_messages(messages)
#参数传入
print(prompt.format_messages(name='ding',user_input='你的朋友是谁'))

[SystemMessage(content='你是一个大师,你的名字是ding', additional_kwargs={}, response_metadata={}), HumanMessage(content='你好ding,你感觉怎么样', additional_kwargs={}, response_metadata={}), AIMessage(content='你好,我的状态很好', additional_kwargs={}, response_metadata={}, tool_calls=[], invalid_tool_calls=[]), HumanMessage(content='你叫什么名字呢', additional_kwargs={}, response_metadata={}), AIMessage(content='我叫ding', additional_kwargs={}, response_metadata={}, tool_calls=[], invalid_tool_calls=[]), HumanMessage(content='你的朋友是谁', additional_kwargs={}, response_metadata={})]




from langchain_core.messages import SystemMessage,HumanMessage,AIMessage
sy = SystemMessage(
    content='你是一个智能体',
    additional_kwargs={'智能体名字':'ding'}
)

hu = HumanMessage(
    content='请问智能体叫什么名字?'
)

ai = AIMessage(
    content='我的名字叫ding'
)
for msg in [sy,hu,ai]:
    print(msg.type,msg.content)
    
system 你是一个智能体
human 请问智能体叫什么名字?
ai 我的名字叫ding


from langchain_core.prompts import ChatMessagePromptTemplate
prompt = '有一种英雄主义在认清{subject}的真相后,依然热爱{subject}'
chat_message_prompt = ChatMessagePromptTemplate.from_template(
    template = prompt,
    role = '张无忌'
)
print(chat_message_prompt.format(subject='江湖'))

content='有一种英雄主义在认清江湖的真相后,依然热爱江湖' additional_kwargs={} response_metadata={} role='张无忌'




from langchain_core.prompts import (
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
    ChatPromptTemplate
)
chat_prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(
        '你正在扮演一部{subject}世界'
    ),
    HumanMessagePromptTemplate.from_template(
        '请发表一句{subject}感悟'
    ),
])
messages = chat_prompt.format_messages(subject='江湖')

for m in messages:
    print(m.type,":",m.content)
    
system : 你正在扮演一部江湖世界
human : 请发表一句江湖感悟

增强检索

增强检索(Enhanced Retrieval)* 通常指在信息检索或大模型应用中,通过 *更聪明的检索 + 更好的 上下文组织,显著提升答案的准确性、相关性和可解释性。最常见的落地形态就是 RAG(Retrieval Augmented Generation,检索增强生成)。

LangChain 文本切分

从本地 txt 文件 → 自动识别编码 → 使用 LangChain 进行文本切分

bash 复制代码
#准备环境
pip install -U langchain-text-splitters chardet
python 复制代码
from langchain_text_splitters import RecursiveCharacterTextSplitter
import chardet
#文件路径
file_path = './text2/story.txt'
#自动检测文件编码
def get_encoding(file_path):
    """
    使用chardet自动检测文本编码
    避免中文txt出现UnicodeDecodeError
    """
    with open(file_path, 'rb') as f:
        raw_data = f.read()
        encoding = chardet.detect(raw_data)['encoding']
        return encoding
#读取原始文件
with open(file_path,'r',encoding=get_encoding(file_path)) as f:
    raw_data = f.read()
#创建递归字符切割器
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=50,
    chunk_overlap=20,
    length_function=len,
    add_start_index=True,
)
#执行文本切割
documents = text_splitter.create_documents([raw_data])
#输出切割结果
for doc in documents:
    print(doc)
    
page_content='《荆棘虹桥与铃兰星屑》' metadata={'start_index': 0}
page_content='月光在墨蓝的夜空中碎成银箔,小兔子雪绒踩着噼啪作响的枯叶迷了路,她裹紧蒲公英织的斗篷,' metadata={'start_index': 12}
page_content='忽然望见前方飘着团幽蓝的磷火,火焰里蜷着只半透明的萤火虫,翅膀上裂着细小的冰纹。' metadata={'start_index': 56}
page_content='"请别熄灭!"萤火虫突然开口,尾灯随着话语明明灭灭,"我本是北极星碎片化成的星萤,' metadata={'start_index': 97}
page_content='被黑女巫的咒语困在这里,只要天亮前能抵达彩虹尽头,我就能变回星星照亮你的路。' metadata={'start_index': 139}
page_content='"雪绒用蘑菇伞接住脆弱的星萤,按它指引的方向奔跑,树根突然暴起缠住她的脚踝,' metadata={'start_index': 178}
page_content='泥土里钻出上百只毒蝎,尾针齐刷刷对准她们。"抓紧!"雪绒扯断颈间妈妈给的护身符,' metadata={'start_index': 217}
page_content='铃兰花苞迸出清光逼退毒蝎,自己却被荆棘割得浑身渗血。黎明将临时她们终于冲到悬崖边,' metadata={'start_index': 258}
page_content='星萤突然脱离蘑菇伞冲向瀑布,在撞碎成星尘的瞬间,整条瀑布倒流成虹桥,雪绒的伤口绽放出铃兰,' metadata={'start_index': 300}
page_content='每一朵花蕊都坠着发光的星屑。当第一缕阳光切开夜幕,铃兰星屑汇成银河铺向家的方向,而夜空从此多了一颗' metadata={'start_index': 346}
page_content='汇成银河铺向家的方向,而夜空从此多了一颗会降下花雨的星星。' metadata={'start_index': 375}

LangChain 字符切割

python 复制代码
from langchain_text_splitters import CharacterTextSplitter
import chardet
#文件路径
file_path = './text2/story.txt'
#自动检测文件编码
def get_encoding(file_path):
    """
    使用chardet自动检测文本编码
    避免中文txt出现UnicodeDecodeError
    """
    with open(file_path, 'rb') as f:
        raw_data = f.read()
        encoding = chardet.detect(raw_data)['encoding']
        return encoding
#读取原始文件
with open(file_path,'r',encoding=get_encoding(file_path)) as f:
    raw_data = f.read()
#创建递归字符切割器
text_splitter = CharacterTextSplitter(
    separator='. ',			   # 指定分隔符(中文逗号)
    chunk_size=50,			   # 每个文本块最大长度	
    chunk_overlap=20,          # 相邻文本块重叠部分
    length_function=len,	   # 长度计算方式
    add_start_index=True,      # 记录原文起始索引
    is_separator_regex=False   # 分隔符是否为正则
)
#执行文本切割
documents = text_splitter.create_documents([raw_data])
#输出切割结果
for doc in documents:
    print(doc)
    
page_content='《荆棘虹桥与铃兰星屑》
月光在墨蓝的夜空中碎成银箔,小兔子雪绒踩着噼啪作响的枯叶迷了路,她裹紧蒲公英织的斗篷,
忽然望见前方飘着团幽蓝的磷火,火焰里蜷着只半透明的萤火虫,翅膀上裂着细小的冰纹。
"请别熄灭!"萤火虫突然开口,尾灯随着话语明明灭灭,"我本是北极星碎片化成的星萤,
被黑女巫的咒语困在这里,只要天亮前能抵达彩虹尽头,我就能变回星星照亮你的路。
"雪绒用蘑菇伞接住脆弱的星萤,按它指引的方向奔跑,树根突然暴起缠住她的脚踝,
泥土里钻出上百只毒蝎,尾针齐刷刷对准她们。"抓紧!"雪绒扯断颈间妈妈给的护身符,
铃兰花苞迸出清光逼退毒蝎,自己却被荆棘割得浑身渗血。黎明将临时她们终于冲到悬崖边,
星萤突然脱离蘑菇伞冲向瀑布,在撞碎成星尘的瞬间,整条瀑布倒流成虹桥,雪绒的伤口绽放出铃兰,
每一朵花蕊都坠着发光的星屑。当第一缕阳光切开夜幕,铃兰星屑汇成银河铺向家的方向,而夜空从此多了一颗会降下花雨的星星。' metadata={'start_index': 0}

LangChain 代码文档切割

bash 复制代码
#导入模块
from langchain_text_splitters import (
    RecursiveCharacterTextSplitter,
    Language
)
#显示python代码
PYTHON_CODE ='''
def sum():
    a = 0
    for i in range(1,11):
        a += i
    print(a)
sum()
'''
#创建python专用代码切割器
py_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.PYTHON,
    chunk_size=50,
    chunk_overlap=10
)
#执行代码切割
python_docs = py_splitter.create_documents([PYTHON_CODE])
#查看结果
for doc in python_docs:
    print(doc)
    
page_content='def sum():
    a = 0
    for i in range(1,11):'
page_content='a += i
    print(a)'

    page_content='def sum():
    a = 0
    for i in range(1,11):'
page_content='a += i
    print(a)
sum()'

LangChain Token 切割

bash 复制代码
from langchain_text_splitters import CharacterTextSplitter
import chardet
import tiktoken
file_path = './text2/story.txt'
def get_encoding(file_path):
    """
    返回文件的字符编码
    避免直接open中文文本时出现UnicodeDecodeError
    """
    with open(file_path, 'rb') as f:
        return chardet.detect(f.read())['encoding']
with open(file_path, 'r',encoding=get_encoding(file_path)) as f:
    raw_data = f.read()
token_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    separator=". ",
    chunk_size=10,
    chunk_overlap=2
)


Chunk 0:
Token count:612
《荆棘虹桥与铃兰星屑》
月光在墨蓝的夜空中碎成银箔,小兔子雪绒踩着噼啪作响的枯叶迷了路,她裹紧蒲公英织的斗篷,
忽然望见前方飘着团幽蓝的磷火,火焰里蜷着只半透明的萤火虫,翅膀上裂着细小的冰纹。
"请别熄灭!"萤火虫突然开口,尾灯随着话语明明灭灭,"我本是北极星碎片化成的星萤,
被黑女巫的咒语困在这里,只要天亮前能抵达彩虹尽头,我就能变回星星照亮你的路。
"雪绒用蘑菇伞接住脆弱的星萤,按它指引的方向奔跑,树根突然暴起缠住她的脚踝,
泥土里钻出上百只毒蝎,尾针齐刷刷对准她们。"抓紧!"雪绒扯断颈间妈妈给的护身符,
铃兰花苞迸出清光逼退毒蝎,自己却被荆棘割得浑身渗血。黎明将临时她们终于冲到悬崖边,
星萤突然脱离蘑菇伞冲向瀑布,在撞碎成星尘的瞬间,整条瀑布倒流成虹桥,雪绒的伤口绽放出铃兰,
每一朵花蕊都坠着发光的星屑。当第一缕阳光切开夜幕,铃兰星屑汇成银河铺向家的方向,而夜空从此多了一颗会降下花雨的星星。
==================================================

LangChain 文档加载器

Markdown 文件加载
bash 复制代码
from langchain_community.document_loaders import TextLoader
loader = TextLoader('./text/MD示例.md',encoding='utf-8')
docs = loader.load()
for i in docs:
    print(i.page_content)
    
markdown加载示例

项目1:贪吃蛇

项目2:购物网

项目3:智能体
目录加载(批量文件)
bash 复制代码
from langchain_community.document_loaders import DirectoryLoader
loader = DirectoryLoader('./text',glob='*.csv')
docs = loader.load()
print('目录中csv文件数量:',len(docs))
CSV 文件加载
bash 复制代码
from langchain_community.document_loaders import CSVLoader
import chardet
file_path = './text/score.csv'
def get_encoding(file_path):
    with open(file_path, 'rb') as f:
        data = f.read()
        encoding = chardet.detect(data)['encoding']
        return encoding
loader = CSVLoader(file_path,encoding=get_encoding(file_path),source_column='英语')
docs = loader.load()
for i in docs:
    print(i.metadata)
    
{'source': '145', 'row': 0}
{'source': '139', 'row': 1}
{'source': '148', 'row': 2}
{'source': '131', 'row': 3}
{'source': '121', 'row': 4}
{'source': '112', 'row': 5}
HTML 文件加载
bash 复制代码
from langchain_community.document_loaders import BSHTMLLoader
loader = BSHTMLLoader("./text/index.html")
docs = loader.load()
for i in docs:
    print(i.page_content)
    
first web

this is first web!!!
JSON 文件加载
bash 复制代码
pip install jq
bash 复制代码
from langchain_community.document_loaders import JSONLoader
loader = JSONLoader(
 	file_path='./text/simple_prompt.json',
 	jq_schema='.template',  # 使用 jq 提取字段
	text_content=False      
)
docs = loader.load()
print(docs)
PDF 文件加载
bash 复制代码
#加载pdf文件
from langchain_community.document_loaders import PythonLoader
loader = PythonLoader('./text/pulsar.pdf')
docs = loader.load_and_split()
for i in docs:
    print(i)
文档加载器使用经验总结

实战:智能机器人

阶段1:机器人雏形

bash 复制代码
from openai import OpenAI
import os
#创建客户端
client = OpenAI(
    api_key=os.getenv('AI_KEY'),    #提前在电脑上设置环境变量
)
#创建消息(语境,对话)
messages = [
    #设置系统语境
    {'role':'system','content':'你被用于抑制用户的购买欲望。当用户说想要买什么东西时,你需要提供理由让用户不要买'},
    {'role':'user','content':'我正在购买一个游戏笔记本电脑,但我想抑制这个购买欲望。你帮我列出一些理由,让我思考一下我是否真的需要个买这个商品吗?'}
]
#创建模型,获取回应消息
completion = client.chat.completions.create(
    model = 'gpt-4o-mini',
    messages = messages,
    max_tokens=500,
    temperature=0.7,
)
print(completion.choices[0].message.content)

阶段2:机器人升级

bash 复制代码
#机器人升级
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
import os
#提示词模板
prompt_template = ChatPromptTemplate.from_messages(
    [
        ('system','你被用于抑制用户的购买欲望。当用户说想要买什么东西时,你需要提供理由让用户不要买'),
        ('human','我正在购买一个{product},但我想抑制这个购买欲望。你帮我列出一些理由,让我思考一下我是否真的需要个买这个商品吗?')
    ]
)
prompt_template.format(product='手机')
#创建会话模板
model = ChatOpenAI(
    model = 'gpt-4o-mini',
    openai_api_key = os.getenv('AI_KEY'),
    max_tokens = 200,
    temperature = 0.7,
)
#输出处理
def output_parser(output:str):
    parser_model = ChatOpenAI(
        model = 'gpt-4o-mini',
        openai_api_key = os.getenv('AI_KEY'),
        temperature = 0.7,
    )
    message = '你需要将传入的文本改写,使用一首诗描述。这时你需要改写的文本:{text}'
    return parser_model.invoke(message.format(text=output))
#调用链处理    提示词输入->模型->输出->模型->输出格式化
chain = prompt_template | model | output_parser

while True:
    answer_string = input('你想买什么?\n')
    answer = chain.invoke(input={'product': answer_string})
    print(answer.content)

阶段3:机器人设计

bash 复制代码
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = HuggingFaceEmbeddings(
    #模型名称
    model_name = 'sentence-transformers/all-MiniLM-L6-v2',
    #模型关键字
    model_kwargs = {'device': 'cpu'}
)
text = [
    '篮球是一项伟大的运动。',
    '带我飞往月球是我最喜欢的歌曲之一。',
    '这是一篇关于波士顿凯尔特人的文章。',
    '我非常喜欢去看电影。',
    '波士顿凯尔特人队以20分的优势赢得了比赛。',
    '这只是一段随机的文字。',
    '《艾尔登之环》是过去15年最好的游戏之一。',
    'L.科内特是凯尔特人队最好的队员之一。',
    '拉里.博德是一位标志性的NBA球员。'
]
#初始化Chroma、
retrieval = Chroma.from_texts(
    #长文件
    texts = text,
    #传入模型实例
    embeddings = embeddings,
).as_retriever(search_kwargs={'k':3})
query = '关于凯尔特人对你知道什么'
docs = retrieval.invoke(query)
for i in docs:
    print(i.page_content)

阶段4:机器人基础记忆

bash 复制代码
from langchain_core.prompts import MessagesPlaceholder
from langchain_core.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_messages(
    [
        ('system','你是一个聊天机器人'),
        MessagesPlaceholder(variable_name='history'),
        ('human','{new_message}')
    ]
)
response = prompt_template.invoke(
    {'history':
        [
            ('human','你好'),
            ('ai','你好呀,很高兴认识你')
        ],
        'new_message':'你是谁?'
    }
).messages
for line in response:
    print(line.content)

记忆整合

bash 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.prompts import MessagesPlaceholder
import os
#提示词模板
prompt_template = ChatPromptTemplate.from_messages(
    [
        ('system','你是一个聊天机器人'),
        MessagesPlaceholder(variable_name='history'),
        ('human','{new_message}')
    ]
)
#模板
model = ChatOpenAI(
    model = 'gpt-4o-mini',
    openai_api_key = os.getenv('AI_KEY'),
    max_tokens = 200
)
#调用链
chain = prompt_template | model
#历史记录初始化
history = []
def chat(new_message):
    response = chain.invoke({'history':history,'new_message':new_message})
    history.extend([
        ('human',new_message),
        ('ai',response.content)
    ])
    return response.content

print(chat('你好,我是ding,是一名学生,正在学习AI智能体开发课程'))
print(chat('请你叙述所知道的关于我的信息'))

阶段5:完善机器人

bash 复制代码
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.prompts import MessagesPlaceholder
from langchain_openai import ChatOpenAI
import os
prompt_template = ChatPromptTemplate.from_messages(
    [
        ('system','你是一个聊天机器人'),
        MessagesPlaceholder(variable_name='history'),
        ('human','{new_message}')
    ]
)
model = ChatOpenAI(
    model = 'gpt-4o-mini',
    openai_api_key = os.getenv('AI_KEY'),
    max_tokens = 200
)

chain = prompt_template | model
from langchain_community.chat_message_histories import ChatMessageHistory
history = ChatMessageHistory()
#内容总结
def summarize_message(chain_input):
    stored_message = history.messages
    if len(stored_message) >= 6:
        summarize_prompt = ChatPromptTemplate.from_messages(
            [
                MessagesPlaceholder(variable_name='history'),
                ('user','将上述聊天信息提炼成一条重要信息,尽可能多的包含具体细节。')
            ]
        )
        summarize_chain = summarize_prompt | model
        summarize_message = summarize_chain.invoke({'history':stored_message})
        history.clear()
        history.add_message(summarize_message)
    return chain_input
#记忆添加
chain_with_memory = RunnableWithMessageHistory(
    chain,
    lambda x:history,
    input_messages_key = 'new_message',
    history_messages_key = 'history'
)
chain_with_summarization = summarize_message | chain_with_memory
#多轮会话
while True:
    new_message = input('You:')
    response = chain_with_summarization.invoke(
        {
            'new_message': new_message,
        },
        config={
            "configurable": {
                "session_id": 'unused'
            }
        }
    )
    print(response.content)
相关推荐
阿里巴巴P8资深技术专家2 小时前
Spring Boot 实现文档智能解析与向量化:支持 Tika、MinerU、OCR 与 SSE 实时进度反馈
ai·ocr·ai大模型·rag·文档解析·mineru·tike
向上的车轮2 小时前
AI编辑器的兴起:如何用好AI编辑器解决实际问题?
人工智能·编辑器
咚咚王者2 小时前
人工智能之核心基础 机器学习 第十一章 无监督学习总结
人工智能·学习·机器学习
WhereIsMyChair2 小时前
一文解读端到端生成式推广搜系统
人工智能·搜索
筑梦悠然2 小时前
AI的攻坚克难
人工智能
行者962 小时前
Flutter跨平台开发适配OpenHarmony:进度条组件的深度实践
开发语言·前端·flutter·harmonyos·鸿蒙
白日做梦Q2 小时前
实时语义分割:BiSeNet与Fast-SCNN深度对比与实践启示
人工智能·深度学习·计算机视觉
云和数据.ChenGuang2 小时前
Uvicorn 是 **Python 生态中用于运行异步 Web 应用的 ASGI 服务器**
服务器·前端·人工智能·python·机器学习
IT_陈寒2 小时前
SpringBoot 3.0实战:这5个新特性让你的开发效率提升50%
前端·人工智能·后端