prompt

提示词的构成:

  • 指示:描述让它做什么
  • 上下文:给出与任务相关的背景信息
  • 输入: 任务的输入信息
  • 输出:输出的格式

生成与检索

生成:

  • 优点:内容的多样性、创造性
  • 缺点:存在不可控制
    检索:
  • 优点:可控
  • 缺点:内容的边界有限制
    通过RAG结合生成与检索

智能客服

传统方法+检索:

  • 设置很多Q(问题),A(答案)对库
  • 当一个问题到来,比较Query和库中的那个Q最接近,则回答对应的答案

传统方法+生成:

  • 通过Q,A对训练一个模型
  • 使用时给一个Q,输出一个答案

大模型方法(检索+生成):

  • 创建一个知识库(中间有各种各样的文档)
  • 用户给了一个Q,在知识库中检索相关的内容(candidate)
  • 把检索到的内容和Q以及message(过去的信息)放到prompt中
  • 将prompt放入LLm生成答案

知识库的搭建在这里插入图片描述

  • 收集很多相关文档
  • 将每个文档都分割成若干个trunk得到完整的知识库
  • 将trunk转化为向量,得到向量库
  • 将Q进行向量化
  • 找到和Q相关的trunk,将相关的trunk和Q放入prompt中

把文本切分成Trunks

  1. 根据句子切分
  2. 按照字符数切分
  3. 按固定字符数,结合overlapping window(紧挨着的两个trunk末尾和开头有一定的重叠)
  4. 递归方法(按字符切分,考虑语义)
  5. 根据语义分割

倒排索引

在这里插入图片描述

  1. 将Query进行切分
  2. 查找切分的Query每个部分出现的文档列表
  3. 找到特定几个比较重要的文档列表的并集
  4. 进行排序

快速搜索向量

KNN搜索

将Q的向量和向量库中的向量一一对比,计算距离或相似度
精确度高,速度慢,适合小数据集

近似KNN算法

在这里插入图片描述

  1. 将数据分成若干模块,每个模块有个中心点
  2. 查找和query最近的中心点
  3. 计算中心点所在区域中所有点和Query的距离

Product Quantization(PQ)

  1. 将向量切分成几段短向量(例如长为256的短向量)
    在这里插入图片描述
  2. 将长为256的短向量划分为若干区域,每个区域对应一个ID
  3. 将Q切分后的短向量和每个区域中心点进行计算距离
  4. 将Q切分后的短向量转换为区域中心距离最近的区域的ID
  5. 将生成的ID没向量库中的向量的ID进行对比计算距离
    在这里插入图片描述

Optimized Approach(改进PQ)

在这里插入图片描述

  1. 将Q分解成n段,有k个中心点
  2. 将Q的每段和每个中心点对应的小段计算距离,得到一个k×n的矩阵
  3. 将向量库的向量和Q的距离近似为距离这个向量最近的中心点和Q的距离
  4. 计算出中心点的距离即为这个向量和Q的距离
    在这里插入图片描述

langchain

langchain是面向大模型开发的框架

Langchain的核心组件

  • 模型I/O封装:包括大预言模型,chat Model,Prompt Template,output parser等

  • Retrieval:包括文档的loader,embedding模型,Text Splitter,向量存储,检索等

  • chain: 实现一个功能或者一系列功能

  • Agent: 给定用户的输入,以及可使用的tools,自动规划执行步骤(比如每个步骤调用哪些tool),并最终完成用户指令

  • 记忆: 模型记忆里的管理

  • Prompt Template:管理和格式化提示词

  • chains: 串联多步流程

  • Memory:保存上下文,实现多轮对话

  • Retrieval+VectorStore :现在知识库检索,在生成回答

两种模型:

  • non-chat model:非对话模型,给一句话,补全这句话
  • chat model:对话模型

非Agent: 对于一个任务,明确指定每一步应该做什么
Agent: Agent的核心任务是将一个复杂的问题拆解成几个简单的任务

提示词工程

from langchain_openai.chat_models.base import BaseChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.chat_models import ChatOpenAI
# 初始化LLMllm = ChatOpenAI(model_name='gpt-3.5-turbo')template ='写一首描述{sence}的诗,格式要求为{type}'# 方法一,自动发现参数
prompt = PromptTemplate.from_template(template)   #创建模板# 方法二,指定参数
prompt = PromptTemplate(template = template,input_variables = ['type','sence']
)chain = LLMChain(llm=llm, prompt=prompt)# 调用大模型
# 方法一
chain.predict(snece='春天',type='五言绝句')    # 调用大模型# 方法二
chain.run({'sence':'秋天','type':'五言绝句'})
chain({'sence':'秋天','type':'五言绝句'})         # 底层也是调用chain.run# 方法三
chain.apply([{'sence':'秋天','type':'五言绝句'}])chain.generate([{'sence':'秋天','type':'五言绝句'}])

few shot

from dotenv import load_dotenv
load_dotenv()from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model='gpt-3.5-turbo-1106', temperature=0)from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.prompts import FewShotPromptTemplateexamples = [{'sence': '秋天', 'type': '五言绝句', 'text': '移舟泊烟渚,日暮客愁新。\n野旷天低树,江清月近人。'},{'sence': '冬天', 'type': '七言律诗', 'text': '昔人已乘黄鹤去,此地空余黄鹤楼。\n黄鹤一去不复返,白云千载空悠悠。\n晴川历历汉阳树,芳草萋萋鹦鹉洲。\n日暮乡关何处是?烟波江上使人愁。'},
]example_template = '这是一首描写{sence}的诗,格式为{type}:\n{text}'
example_prompt = PromptTemplate.from_template(example_template)
# 例子放在前缀和后缀之间
prompt = FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,example_separator='\n\n',prefix='请分析以下诗歌的格式,并按格式要求创作诗歌。',		# 前缀suffix='写一首描写{sence}的诗,格式要求为{type}:\n',		# 后缀input_variables=['sence', 'type',]
)# print(prompt.format(sence='秋天', type='七言律诗'))chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run({'sence':'夏天', 'type':'七言律诗'})
print(result)

多个chain进行串联(组合链)

from dotenv import load_dotenv
load_dotenv()from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model='gpt-3.5-turbo-1106', temperature=0)from langchain.chains import LLMChain
from langchain.chains import SequentialChain
from langchain.prompts import PromptTemplateprompt1 = PromptTemplate.from_template('有一家公司的创始人叫{name},主要从事人工智能技术培训和科研辅导,请帮这家公司起10个中文名字,要求包含创始人的名字。'
)chain1 = LLMChain(llm=llm, prompt=prompt1, output_key='company_names', verbose=True)
# print(chain1.predict(name='陈华'))
# company_names = chain1.predict(name='陈华')prompt2 = PromptTemplate.from_template('请从以下公司名字中,选出你认为最好的一个:\n {company_names}'
)chain2 = LLMChain(llm=llm, prompt=prompt2, verbose=True)
# print(chain2.predict(company_names=company_names))chain = SequentialChain(chains=[chain1, chain2], input_variables=['name'], verbose=True)
result = chain.run({'name':'陈华'})
print(result)

内置组合链

from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAIload_dotenv()
llm = ChatOpenAI(model='gpt-3.5-turbo-1106', temperature=0)# # 简单对话场景
# from langchain.chains import ConversationChain# conversation = ConversationChain(llm=llm, verbose=True)
# # print(conversation.prompt.template)# while True:
#     human_input = input('User: ')  # hello | 你叫什么名字?
#     result = conversation.predict(input=human_input)
#     print('Assistant: ', result)# 修改提示词
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplatetemplate = '''
下面是一段人类和人工智能之间的友好对话。人工智能是健谈的,并根据其上下文提供许多具体细节。如果人工智能不知道一个问题的答案,它就会如实说它不知道。 
请注意,无论人类用什么语言,你都用中文进行回复。当前对话:
{history}
User:{input}
Assistant:
'''
prompt = PromptTemplate.from_template(template)conversation = ConversationChain(llm=llm, prompt=prompt, verbose=True)
# print(conversation.prompt.template)while True:human_input = input('User: ')  # hello | 你叫什么名字? | 感冒吃什么药好得快?result = conversation.predict(input=human_input)print('Assistant: ', result)

langchain Memory

随着提问的次数增加,Memory中存储的内容会越来越多,context中的token越来越多
解决方法:
只考虑n轮的Memory
对会话内容进行总结

from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import (ConversationBufferMemory,ConversationBufferWindowMemory,ConversationSummaryMemory,ConversationSummaryBufferMemory)load_dotenv()
llm = ChatOpenAI(model='gpt-3.5-turbo-1106')# memory = ConversationBufferWindowMemory(k=3)
# conversation = ConversationChain(llm=llm, memory=memory, verbose=True)# memory = ConversationBufferMemory()  # 保留完整会话(默认)
# memory = ConversationBufferWindowMemory(k=2)  # 保留前k轮会话
# memory = ConversationSummaryMemory(llm=llm)  # 总结前面的对话内容
memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=100)  # 超过最大token数量的会话,会被总结conversation = ConversationChain(llm=llm, memory=memory, verbose=True)result = conversation.predict(input='hello')
result = conversation.predict(input='你叫什么名字?')result = conversation.predict(input='感冒是一种什么病?')
result = conversation.predict(input='一般会有哪些症状?')
result = conversation.predict(input='吃什么药好得快?')
print(result)

RequestsChain

针对大模型不知道的内容,使用搜索引擎搜索相关内容,然后让大模型进行总结

from langchain.chat_models import ChatOpenAI
from dotenv import load_dotenvload_dotenv()
llm = ChatOpenAI(model='gpt-3.5-turbo-1106')from langchain.chains import LLMRequestsChain
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplateprompt = PromptTemplate.from_template('''
请根据如下搜索结果,回答用户问题。
搜索结果:
-----------
{requests_result}
-----------
问题:{question}
回答:
''')llm_chain = LLMChain(llm=llm, prompt=prompt, verbose=True)chain = LLMRequestsChain(llm_chain=llm_chain,verbose=True
)# question = '刀郎最近发布了什么新专辑?'
question = '陈华编程是什么?'inputs = {'question': question,'url': 'https://www.google.com/search?q=' + question.replace(' ', '+')  # google地址+问题
}result = chain.run(inputs)
print(result)

问答QAchain

from langchain.chat_models import ChatOpenAI
from dotenv import load_dotenvload_dotenv()llm = ChatOpenAI(model='gpt-3.5-turbo-1106', temperature=0)# 构建文档库
from langchain.schema import Documentcorpus = ['武汉市,简称“汉”,别称江城,湖北省辖地级市、省会,副省级市、国家中心城市、超大城市,国务院批复确定的中国中部地区的中心城市。',  '武汉市下辖13个区,总面积8569.15平方千米。截至2022年末,常住人口1373.90万人,地区生产总值18866.43亿元。','武汉市地处江汉平原东部、长江中游,长江及其最大支流汉水在此交汇,形成武汉三镇(武昌、汉口、汉阳)隔江鼎立的格局。','湖北省,简称“鄂”,别名楚、荆楚,中华人民共和国省级行政区,省会武汉。','湖北省辖12个地级市、1个自治州,39个市辖区、26个县级市、37个县(其中2个自治县)、1个林区。','截至2022年末,湖北省常住人口5844万人,地区生产总值为53734.92亿元,人均地区生产总值为92059元。',
]documents = [Document(page_content=cp) for cp in corpus]
# print(documents)from langchain.chains.question_answering import load_qa_chainchain = load_qa_chain(llm=llm, chain_type='map_rerank', verbose=True)# question = '武汉三镇是哪三个?'
question = '湖北省常住人口是多少?'result = chain.run(input_documents=documents, question=question)
print(result)

FAISS 文档召回

from langchain.vectorstores.faiss import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.schema import Document
from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAIfrom langchain.chains.question_answering import load_qa_chainload_dotenv()
llm = ChatOpenAI(model='gpt-3.5-turbo-1106', temperature=0)corpus = ['武汉市,简称“汉”,别称江城,湖北省辖地级市、省会,副省级市、国家中心城市、超大城市,国务院批复确定的中国中部地区的中心城市。',  '武汉市下辖13个区,总面积8569.15平方千米。截至2022年末,常住人口1373.90万人,地区生产总值18866.43亿元。','武汉市地处江汉平原东部、长江中游,长江及其最大支流汉水在此交汇,形成武汉三镇(武昌、汉口、汉阳)隔江鼎立的格局。','湖北省,简称“鄂”,别名楚、荆楚,中华人民共和国省级行政区,省会武汉。','湖北省辖12个地级市、1个自治州,39个市辖区、26个县级市、37个县(其中2个自治县)、1个林区。','截至2022年末,湖北省常住人口5844万人,地区生产总值为53734.92亿元,人均地区生产总值为92059元。',
]documents = [Document(page_content=cp) for cp in corpus]embedding = OpenAIEmbeddings(model='text-embedding-ada-002')
documents_db = FAISS.from_documents(documents, embedding)chain = load_qa_chain(llm=llm, chain_type='stuff', verbose=True)question = '武汉三镇是哪三个?'
# question = '湖北省常住人口是多少?'# 检索出最相关的内容
retrieval_documents = documents_db.max_marginal_relevance_search(question, k=3)         # 最大边际搜索,优化了与查询的相似性和文档之间的多样性
retrieval_documents = documents_db.similarity_search(question, k=3)                     # 相似性搜索,返回最相关的k条信息
retrieval_documents = documents_db.similarity_search_with_score(question, k=3)          # 相似性搜索,并且返回相似度分数,分数越小越相关
retrieval_documents = documents_db.similarity_search_with_relevance_scores(question)    # 相似性搜索,分数越大越相关print(retrieval_documents)
exit()result = chain.run(input_documents=retrieval_documents, question=question)
print(result)

读取文档并分割

from langchain.document_loaders import CSVLoader, TextLoader, PyMuPDFLoader
import osfile_dir = os.path.dirname(__file__)# loader = CSVLoader(os.path.join(file_dir, './data/about.csv'))
# print(len(loader.load()))# loader = PyMuPDFLoader(os.path.join(file_dir, './data/about.pdf'))
# loader = TextLoader(os.path.join(file_dir, './data/about.txt'))# print(loader.load())# 加载并分割文档
from langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(# separator = ['\n\n', '\n', ' ', ''],chunk_size = 50,  # default:4000chunk_overlap = 10,  # default:200
)loader = TextLoader(os.path.join(file_dir,'./data/about.txt'))
documents = loader.load_and_split(text_splitter)print(documents)

LLama

即便模型规模小,资源有限,如果选择适当的训练方法,用足够多高质量的数据训练足够长的时间,也能得到一个较好的模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94525.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94525.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94525.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

龙虎榜——20250806

上证指数继续收阳线,创新高的概率较大,个股上涨多于下跌,但板块轮动较明显,高位板块注意风险。深证指数较昨天放量收阳线,站上5日和10日均线继续上线,大科技方向资金关注更多。2025年8月6日龙虎榜行业方向分…

数据可视化发展历程

数据可视化是数据描述的图形表示,是当今数据分析发展最快速、最引人注目的领域之一。借助于可视化工具的发展,或朴实,或优雅,或绚烂的可视化作品给我们讲述着各种数据故事。在这个领域中,科学、技术和艺术完美地结合在…

深入理解C++中的stack、queue和priority_queue

目录 前言 1. stack(栈) 1.1 基本概念 1.2 常用接口 1.3 应用示例:最小栈 1.4 模拟实现 2. queue(队列) 2.1 基本概念 2.2 常用接口 2.3 模拟实现 3. priority_queue(优先队列) 3.1…

C++ 操作 Redis 客户端

引言 前面几篇文章都在介绍 Redis 原生命令行客户端,在实际应用开发中,开发人员更希望使用针对特定编程语言的专用客户端,通过编程的方式操作 Redis 数据库。因此,Redis 支持多种编程语言。本文将介绍 如何使用 C 语言来操作 Red…

批量提问程序开发方案:基于Python的百度文小言接口实现

批量提问程序开发方案:基于Python的百度文小言接口实现 1. 项目概述 1.1 项目背景 在现代信息检索和自动化办公场景中,批量提问功能已成为提高工作效率的重要工具。本项目旨在开发一个基于Python的批量提问程序,专门针对百度文小言平台&am…

Apollo中三种相机外参的可视化分析

Apollo中三种相机外参的可视化分析一、什么是相机外参?为什么需要可视化?二、不同外参来源对比三、详细操作步骤1. 环境准备2. 获取 NuScenes外参数据3. 外参到空间位置的转换及可视化四、可视化对比1. NuScenes数据集外参2. Apollo BEV模型外参3. Apoll…

虚拟化KVM常用命令汇总

KVM(Kernel-based Virtual Machine)是一种开源的硬件虚拟化解决方案,它是 Linux 内核的一部分,允许在支持虚拟化技术的硬件(如 Intel VT-x 或 AMD-V)上运行虚拟机。KVM 将 Linux 内核转变为一个裸机虚拟机监…

6s081环境配置以及使用vscode连接本地wsl2

6s081环境配置以及使用vscode连接wsl2 本人环境:windows11、wsl2ubuntu20.04 课程:6s081的2020版本的:https://pdos.csail.mit.edu/6.S081/2020/schedule.html 一、wsl2ubuntu20.04配置6s081环境 注:关于如何在window中安装wsl,这…

C++实现线程池(3)缓存线程池

三. CachedThreadPool 的实现3.1 需求:动态调整线程数量:与 FixedThreadPool 不同,CachedThreadPool 的线程数量是动态调整的。当有新任务提交时,如果线程池中有空闲的线程,则会立即使用空闲线程执行任务;如果线程池中…

WMS+自动化立库:无人仓的现在进行时

传统仓库正面临严峻挑战:效率瓶颈日益凸显,人力成本持续攀升,空间利用率逼近极限,而订单响应速度却难以满足市场需求。如何破局?WMS(仓库管理系统)与自动化立体库(AS/RS)…

多模态大模型研究每日简报【2025-08-05】

训练数据相关 EditGarment: An Instruction-Based Garment Editing Dataset Constructed with Automated MLLM Synthesis and Semantic-Aware Evaluation (https://arxiv.org/abs/2508.03497):提出了一种自动化的流程,用于构建服装编辑数据集EditGarmen…

4、docker数据卷管理命令 | docker volume

1、命令总览命令作用出现频率备注★ docker volume create新建卷高-d 指定驱动,-o 指定驱动选项★ docker volume ls列出卷高--filter danglingtrue 查孤儿卷★ docker volume inspect查看卷详情高输出 JSON,可加 --format★ docker volume rm删除卷高只…

计数组合学7.14(对偶 RSK 算法)

7.14 对偶 RSK 算法 存在 RSK 算法的一种变体,其与乘积 ∏i,j(1xiyj)\prod_{i,j}(1 x_{i}y_{j})∏i,j​(1xi​yj​) 的关系类似于 RSK 算法本身与 ∏i,j(1−xiyj)−1\prod_{i,j}(1 - x_{i}y_{j})^{-1}∏i,j​(1−xi​yj​)−1 的关系。我们称此变体为对偶 RSK 算法…

C语言中的进程、线程与进程间通信详解

目录 引言 基本概念 1. 进程(Process) 2. 线程(Thread) 线程编程实战 1. 常见线程库 2. 合理设置线程数 3. pthread 创建线程 线程同步机制 1. 互斥锁 pthread_mutex_t 2. 条件变量 pthread_cond_t 3. 读写锁 pthread…

[假面骑士] 555浅谈

假面骑士555(faiz)是我最先接触的一部平成系列的假面骑士,同时也是我个人最喜欢的一部假面骑士。一、大纲简介震惊,人类最新的进化形态——奥菲一诺,横空出世!日本的顶级财团,Smart Brain,的前任社长&#…

Vue Router 路由的创建和基本使用(超详细)

一、路由的基本概念 你是否好奇单页应用(SPA)是如何在不刷新页面的情况下实现页面切换的?这就离不开路由的功劳。 路由:本质是一组 key-value 的对应关系,在前端领域中,key 通常是路径,value …

深入理解设计模式:策略模式的艺术与实践

在软件开发中,我们经常会遇到需要根据不同情况选择不同算法或行为的场景。传统的做法可能是使用大量的条件语句(if-else或switch-case),但随着需求的增加和变化,这种硬编码的方式会导致代码难以维护和扩展。策略模式&a…

概率/期望 DP llya and Escalator

题目链接:Problem - D - Codeforces 看了这篇文章来的:【算法学习笔记】概率与期望DP - RioTian - 博客园 这篇博客写得挺好的,讲了一些常见方法,概率 / 期望的题多练练就上手了。 题目大意: n 个人排队上电梯&…

大陆电子MBDS开发平台转到其他国产控制器平台产生的问题记录

u8_StComLowSpdGearSwt变量为例,之前用的时候只有输入,没什么实际意义,导致新环境下编译报错,缺少声明,解决办法:注释掉输入模块。今天解决的另一个比较大的问题,不同模型函数公用函数模块生成代…

机器学习模型调优实战指南

文章目录模型选择与调优:从理论到实战1. 引言2. 模型评估:为选择提供依据2.1 偏差-方差权衡2.2 数据集划分与分层抽样2.3 交叉验证(Cross-Validation)2.4 信息准则(AIC / BIC)3. 超参数调优:让模…